使用HttpPlatformHandler在IIS上托管的Suave应用程序关闭连接

Jer*_*emy 5 iis f# suave

我正在尝试使用HttpPlatformHandler(版本1.2)在IIS(IIS 10.0)中运行基本的Suave应用程序.

当我有它返回一个单一的WebPart,如

(OK "Hello World")
Run Code Online (Sandbox Code Playgroud)

该应用程序在IIS中运行良好,我可以通过http:// localhost/testapp(testapp是默认网站下的应用程序的名称)的名称向它发出请求.

但是,如果我为WebPart使用更复杂的东西,例如

let app =
    choose
        [ GET >=> choose
            [ path "/hello" >=> OK "Hello GET"
              path "/goodbye" >=> OK "Good bye GET" ]
          POST >=> choose
            [ path "/hello" >=> OK "Hello POST"
              path "/goodbye" >=> OK "Good bye POST" ] ]
Run Code Online (Sandbox Code Playgroud)

该网站启动但我无法通过应用程序名称访问它.但我仍然可以通过端口到达它.

当我按名称命中应用程序时,我收到HTTP 503.2(坏网关)响应.

应用程序从HttpPlatformHandler执行的FAKE脚本启动.

对于上下文,这是启动应用程序的FAKE脚本:

#r "./tools/FakeLib.dll"
#r "Suave.dll"

open System
open Suave
open Suave.Successful
open Fake
open System.Net
open Suave.Filters
open Suave.Sockets
open Suave.Operators
open System.IO

Environment.CurrentDirectory <- __SOURCE_DIRECTORY__

let port = Sockets.Port.Parse <| getBuildParamOrDefault "port" "8083"

let serverConfig = 
    { defaultConfig with
       logger = Logging.Loggers.saneDefaultsFor Logging.LogLevel.Verbose
       bindings = [ HttpBinding.mk HTTP IPAddress.Loopback port ]
    }

let app =
  choose
    [ GET >=> choose
        [ path "/hello" >=> OK "Hello GET"
          path "/goodbye" >=> OK "Good bye GET" ]
      POST >=> choose
        [ path "/hello" >=> OK "Hello POST"
          path "/goodbye" >=> OK "Good bye POST" ] ]

startWebServer serverConfig (OK "Hello")
//startWebServer serverConfig app
Run Code Online (Sandbox Code Playgroud)

上面的脚本按预期工作.但是,如果我使用app WebPart而不是(OK "Hello")我遇到上述问题.

为了完整性,这里是为HttpPlatformHandler设置的web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="httpplatformhandler" />
      <add name="httpplatformhandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
    </handlers>
    <httpPlatform
              stdoutLogEnabled="true" startupTimeLimit="20"
              processPath=".\tools\FAKE.exe"
              arguments=".\test.fsx port=%HTTP_PLATFORM_PORT%" >
      <environmentVariables>
      </environmentVariables>
    </httpPlatform>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我已经查看了日志,但不幸的是我看不到任何表明错误的内容.

我已经检查了事件查看器,并且应用程序日志中的此信息事件是唯一可能出错的线索:

The description for Event ID 1001 from source HttpPlatformHandler cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.
Run Code Online (Sandbox Code Playgroud)

以下是应用程序按预期运行的情况下的日志的一部分(不带choose):

[V] 2016-01-19T02:43:40.6932823Z: initialising BufferManager with 827392 bytes [Suave.Socket.BufferManager]
[I] 2016-01-19T02:43:40.7114149Z: listener started in 20.885 ms with binding 127.0.0.1:18450 [Suave.Tcp.tcpIpServer]
[V] 2016-01-19T02:43:40.8146603Z: 127.0.0.1 connected, total: 1 clients [Suave.Tcp.job]
[V] 2016-01-19T02:43:40.8166665Z: reserving buffer: 811008, free count: 99 [Suave.Tcp.job] [Suave.Socket.BufferManager]
[V] 2016-01-19T02:43:40.8217965Z: -> processor [Suave.Web.httpLoop.loop]
[V] 2016-01-19T02:43:40.8228181Z: reading first line of request [Suave.Web.processRequest]
[V] 2016-01-19T02:43:40.8378128Z: reserving buffer: 802816, free count: 98 [Suave.Web.readMoreData] [Suave.Socket.BufferManager]
[V] 2016-01-19T02:43:40.8498033Z: reading headers [Suave.Web.processRequest]
[V] 2016-01-19T02:43:40.8776578Z: freeing buffer: 802816, free count: 99 [Suave.Web.split] [Suave.Socket.BufferManager]
[V] 2016-01-19T02:43:40.8866594Z: parsing post data [Suave.Web.processRequest]
[V] 2016-01-19T02:43:40.8886553Z: <- processor [Suave.Web.httpLoop.loop]
[V] 2016-01-19T02:43:40.9057610Z: 'Connection: keep-alive' recurse [Suave.Web.httpLoop.loop]
[V] 2016-01-19T02:43:40.9057610Z: -> processor [Suave.Web.httpLoop.loop]
[V] 2016-01-19T02:43:40.9057610Z: reading first line of request [Suave.Web.processRequest]
[V] 2016-01-19T02:43:40.9057610Z: reserving buffer: 802816, free count: 98 [Suave.Web.readMoreData] [Suave.Socket.BufferManager]
[V] 2016-01-19T02:43:45.2531307Z: reading headers [Suave.Web.processRequest]
[V] 2016-01-19T02:43:45.2541141Z: freeing buffer: 802816, free count: 99 [Suave.Web.split] [Suave.Socket.BufferManager]
[V] 2016-01-19T02:43:45.2541141Z: parsing post data [Suave.Web.processRequest]
[V] 2016-01-19T02:43:45.2541141Z: <- processor [Suave.Web.httpLoop.loop]
[V] 2016-01-19T02:43:45.2551164Z: 'Connection: keep-alive' recurse [Suave.Web.httpLoop.loop]
Run Code Online (Sandbox Code Playgroud)

以下是应用程序无法按预期工作的日志的一部分(通过路由choose):

[V] 2016-01-19T02:44:59.6356127Z: initialising BufferManager with 827392 bytes [Suave.Socket.BufferManager]
[I] 2016-01-19T02:44:59.6537478Z: listener started in 20.987 ms with binding 127.0.0.1:18708 [Suave.Tcp.tcpIpServer]
[V] 2016-01-19T02:44:59.8848907Z: 127.0.0.1 connected, total: 1 clients [Suave.Tcp.job]
[V] 2016-01-19T02:44:59.8879891Z: reserving buffer: 811008, free count: 99 [Suave.Tcp.job] [Suave.Socket.BufferManager]
[V] 2016-01-19T02:44:59.8929862Z: -> processor [Suave.Web.httpLoop.loop]
[V] 2016-01-19T02:44:59.8939749Z: reading first line of request [Suave.Web.processRequest]
[V] 2016-01-19T02:44:59.9068548Z: reserving buffer: 802816, free count: 98 [Suave.Web.readMoreData] [Suave.Socket.BufferManager]
[V] 2016-01-19T02:44:59.9209857Z: reading headers [Suave.Web.processRequest]
[V] 2016-01-19T02:44:59.9259688Z: freeing buffer: 802816, free count: 99 [Suave.Web.split] [Suave.Socket.BufferManager]
[V] 2016-01-19T02:44:59.9338521Z: parsing post data [Suave.Web.processRequest]
[V] 2016-01-19T02:44:59.9378580Z: <- processor [Suave.Web.httpLoop.loop]
[V] 2016-01-19T02:44:59.9518518Z: freeing buffer: 811008, free count: 100 [Suave.Tcp.job] [Suave.Socket.BufferManager]
[V] 2016-01-19T02:44:59.9518518Z: Shutting down transport. [Suave.Tcp.job]
[V] 2016-01-19T02:44:59.9528516Z: 127.0.0.1 disconnected, total: 0 clients [Suave.Tcp.job]
Run Code Online (Sandbox Code Playgroud)

当应用程序执行连接打开然后立即关闭.当我通过端口点击应用程序时,会打开一个新连接,然后立即关闭(再次).

我是否在为应用程序的主机配置做错了什么,或者我在使用选择功能时遗漏了什么?任何帮助,将不胜感激.谢谢!

ade*_*mar 4

我认为路线应该是这样的:

path "/app/hello"