Suave App hosted on IIS with HttpPlatformHandler closes connection

I am trying to get a basic Suave application running in IIS (IIS 10.0) using the HttpPlatformHandler (version 1.2).

When I have it, it returns one WebPart, such as

(OK "Hello World") 

The application works in IIS, and I can make requests to it by the name http: // localhost / testapp (testapp is the name of the application in the website by default).

However, if I use something more complicated for WebPart, for example

 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" ] ] 

The website is starting up, but I cannot contact it by the name of the application. However, I can still get to it through the port.

When I hit the application by name, I get an HTTP 503.2 response (bad gateway).

The application is launched from the FAKE script executed by the HttpPlatformHandler.

For context, this is the FAKE script that launches the application:

 #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 

The above script works as expected. However, if I use app WebPart instead of (OK "Hello") , I encounter the problem described above.

For completeness, web.config for HttpPlatformHandler is installed here:

 <?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> 

I looked through the logs, but unfortunately I do not see anything that indicates an error.

I checked the event viewer, and the only key that might be wrong is the information event in the application log:

 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. 

Here is the part of the log from the case when the application works as expected (without 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] 

And here is the part of the log where the application does not work as expected (with routing via 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] 

When the application starts the connection, it opens and then immediately closes. When I hit the application on the port, a new connection opens and then immediately closes (again).

Am I doing something wrong with the host configuration for the application, or am I missing something in the way I use the select function? Any help would be greatly appreciated. Thanks!

+5
source share
1 answer

I think the routes should look like this:

path "/app/hello"

+4
source

Source: https://habr.com/ru/post/1240889/


All Articles