2016-01-19 21 views
5

Sto cercando di ottenere un'applicazione di base Suave in esecuzione in IIS (IIS 10.0) utilizzando HttpPlatformHandler (versione 1.2).Un'app suave ospitata su IIS con HttpPlatformHandler Chiude la connessione

Quando l'ho restituire una singola WebPart come

(OK "Hello World") 

L'applicazione viene eseguita in fine IIS e posso fare richieste ad esso per nome a http://localhost/testapp (testapp è il nome dell'applicazione sotto il Web predefinito Luogo).

Tuttavia, se uso qualcosa di più complesso per la WebPart come

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

Il sito si avvia ma non riesco a raggiungerla per nome dell'applicazione. Sono comunque in grado di raggiungerlo via porto.

Quando si colpisce l'applicazione per nome, ricevo una risposta HTTP 503.2 (gateway non valido).

L'applicazione viene avviata da uno script FAKE eseguito da HttpPlatformHandler.

per il contesto, questo è lo script falso che avvia l'applicazione:

#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 

Lo script precedente funziona come previsto. Tuttavia, se utilizzo lo appWebPart anziché (OK "Hello"), ho riscontrato il problema sopra descritto.

Per completezza ecco il web.config allestita per l'HttpPlatformHandler:

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

ho rivisto i log, ma purtroppo non riesco a vedere tutto ciò che indica un errore.

Ho controllato il Visualizzatore eventi, e l'unico indizio che qualcosa potrebbe essere sbagliato è questo evento informazioni nel registro di applicazione:

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. 

Ecco una parte del log dal caso in cui l'applicazione viene eseguito come previsto (senza 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] 

E qui è una parte del registro in cui l'applicazione non funziona come previsto (con il routing via choose):

01.235.164,106174 millions
[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] 

Quando l'app viene eseguita, la connessione si apre e quindi si chiude immediatamente. Quando apro l'app per porta, si apre una nuova connessione che si chiude immediatamente (di nuovo).

Sto facendo qualcosa di sbagliato con la configurazione host per l'app, o mi sto perdendo qualcosa in come sto usando la funzione di scelta? Qualsiasi aiuto sarebbe apprezzato. Grazie!

+0

Hai provato a collegare debugger? Ci sono delle eccezioni? Cosa succede se si reindirizza il registro di Suave in un file o qualcosa di simile, ciò mostra qualcosa? –

+0

Grazie per rispondere (e chiedere). Posso collegarmi a FAKE.exe dopo averlo eseguito, ma non sono stato in grado di farlo prima del suo avvio. Non sono stato in grado di rilevare un'eccezione. Ho modificato la domanda per includere l'output del registro. – Jeremy

+0

Quindi vedi qualche eccezione se ti colleghi al processo dopo che è stato avviato? –

risposta

4

Credo che i percorsi dovrebbe essere simile:

path "/app/hello"

+0

Era così. I percorsi sono relativi alla radice e non corrispondevano alla directory in cui si trovano. Grazie! Inoltre urla a David Haney per averci contattato su Twitter. – Jeremy

+0

Per inciso, ho cercato la [fonte per la funzione percorso] (https://github.com/SuaveIO/suave/blob/master/src/Suave/ Combinators.fs). Corrisponde a AbsolutePath, quindi se la richiesta è localhost/hello, sta cercando "/ hello". – Jeremy