2010-08-23 19 views
20

Quando si utilizza un binding HTTP in WCF, è necessario concedere autorizzazioni speciali per poter eseguire il binding a tale porta/percorso. Capisco questo perché WCF accetta il traffico HTTP attraverso il driver http.sys.WCF senza HTTP.SYS

In passato, potevamo creare un socket e collegarlo a qualsiasi porta vecchia che non era in uso, senza essere un amministratore. NetTcpBinding è ancora in grado di farlo.

Se non mi interessa per http.sys, c'è un modo per dire a WCF di non usarlo, e invece di aprire un vecchio socket regolare mentre si usano ancora i binding HTTP?

risposta

14

WCF Le associazioni basate su HTTP dipendono dalla classe HttpListener che è gestita dall'avvolgimento attorno all'API HTTP. L'API HTTP dipende dal modo in cui il sistema operativo elabora le richieste http. Quindi, se si utilizza il sistema operativo che utilizza il driver http.sys (Windows 2003 e successivi) si dipende da esso.

Edit:

Sulla base molto buona discussione su Cassini Ho trascorso due ore in Reflector. La descrizione che segue è solo la mia ipotesi. Non ho trovato alcuna informazione a riguardo, quindi forse ho torto completamente.

WCF contiene internamente una classe astratta denominata HttpTransportManager questa classe è derivata dalle classi interne HostedHttpTransportManager e SharedHttpTransportManager (questa esiste anche nella versione per HTTPS). Il primo non dipende da HttpListener ma quest'ultimo è. Il primo viene utilizzato quando WCF è ospitato nella pipeline ASP.NET - le classi interne HttpModule e HttpHandler da System.ServiceModel.Assistente di attivazione utilizzare HostedHttpRequestAsyncResult dipendente da HostedHttpTransportManager. Il successivo viene utilizzato quando viene creato HttpChannelListener (self-hosting).

La mia conclusione è che il servizio WCF ospitato nella pipeline di ASP.NET non dipende direttamente da http.sys ma l'IIS che ospita la pipeline è. Ciò consente di creare server Web personalizzati che non dipenderanno da http.sys ma saranno in grado di ospitare ASP.NET e quindi WCF. Penso che questo sia ciò che fa Cassini. Il servizio WCF in hosting autonomo dipende sempre da http.sys.

Come ho scritto sopra, questa è solo la mia ipotesi basata su un rapido reverse engineering.

+1

Il Visual Web Server (Cassini) in VS viene eseguito come non amministratore, può ascoltare richieste HTTP e può anche servire servizi WCF BasicHttpBinding. Anche altri server Web non devono fare affidamento su HTTP.SYS. Quindi deve esserci un modo per aggirarlo. –

Problemi correlati