2010-08-23 7 views
20

Bei Verwendung einer HTTP-Bindung in WCF muss ich mir selbst besondere Berechtigungen erteilen, um an diesen Port/Pfad binden zu können. Ich verstehe, dass WCF HTTP-Verkehr über den http.sys Treiber akzeptiert.WCF ohne HTTP.SYS

In den alten Tagen konnten wir einen Socket neu erstellen und an jeden alten Port binden, der nicht verwendet wurde, ohne ein Administrator zu sein. NetTcpBinding ist dazu noch in der Lage.

Wenn ich http.sys nicht interessiert, gibt es eine Möglichkeit, WCF zu sagen, es nicht zu verwenden, und stattdessen nur einen regulären alten Socket zu öffnen, während immer noch HTTP-Bindungen verwendet werden?

Antwort

14

WCF HTTP-basierte Bindungen sind abhängig von HttpListener Klasse, die Wrapped um HTTP-API verwaltet wird. Die HTTP-API hängt von der Art und Weise ab, wie die HTTP-Anforderungen des Betriebssystems verarbeitet werden. Wenn Sie also ein Betriebssystem verwenden, das den http.sys-Treiber verwendet (Windows 2003 und neuer), sind Sie davon abhängig.

Edit:

Basierend auf sehr gutes Argument über Cassini ich zwei Stunden im Reflektor ausgegeben. Die folgende Beschreibung ist nur meine Annahme. Ich habe keine Informationen darüber gefunden, vielleicht bin ich völlig falsch.

WCF intern enthält einige abstrakte Klasse HttpTransportManager diese Klasse genannt durch interne Klassen abgeleitet HostedHttpTransportManager und SharedHttpTransportManager (dieses gibt es auch in der Version für HTTPS). Der erste ist nicht abhängig von HttpListener aber der letztere ist. Der vorherige wird verwendet, wenn WCF in der ASP.NET-Pipeline gehostet wird - interne Klassen HttpModule und HttpHandler von System.ServiceModel.Activation Assembly verwenden HostedHttpRequestAsyncResult abhängig von HostedHttpTransportManager. Der letztere wird verwendet, wenn HttpChannelListener erstellt wird (Self-Hosting).

Meine Schlussfolgerung ist, dass WCF-Dienst in ASP.NET-Pipeline gehostet ist nicht direkt abhängig von http.sys, aber der IIS-Hosting der Pipeline ist. Dies ermöglicht die Erstellung eines benutzerdefinierten Webservers, der nicht von http.sys abhängig ist, sondern in der Lage ist, ASP.NET und damit WCF zu hosten. Ich denke, das ist es, was Cassini tut. Der Self-hosted WCF-Dienst ist immer von http.sys abhängig.

Wie ich oben geschrieben habe, ist dies nur mein Ratschlag basierend auf einem schnellen Reverse Engineering.

+1

Der Visual Web Server (Cassini) in VS wird als Nicht-Administrator ausgeführt, kann HTTP-Anforderungen überwachen und sogar WCF-Dienste von BasicHttpBinding ausführen. Andere Webserver müssen sich auch nicht auf HTTP.SYS verlassen. Also muss es einen Weg geben, es zu umgehen. –

Verwandte Themen