没有HTTP.SYS的WCF

时间:2010-08-23 14:39:44

标签: windows wcf http http.sys

在WCF中使用HTTP绑定时,我需要授予自己特殊权限才能绑定到该端口/路径。我理解这是因为WCF通过 http.sys 驱动程序接受HTTP流量。

在过去,我们可以新建一个套接字并绑定到任何未使用的旧端口,而不是管理员。 NetTcpBinding仍然能够做到这一点。

如果我不关心http.sys,有没有办法告诉WCF不要使用它,而只是在仍然使用HTTP绑定时打开常规旧套接字?

1 个答案:

答案 0 :(得分:15)

基于WCF HTTP的绑定依赖于HttpListener类,它是围绕HTTP API的托管包装器。 HTTP API取决于操作系统处理http请求的方式。因此,如果您使用使用http.sys驱动程序(Windows 2003和更高版本)的操作系统,则依赖于它。

修改

基于对卡西尼的非常好的争论,我在Reflector花了两个小时。以下描述仅是我的假设。我还没有找到任何关于它的信息,所以也许我完全错了。

WCF内部包含一些名为HttpTransportManager的抽象类,该类由内部类HostedHttpTransportManagerSharedHttpTransportManager派生(这个类也存在于HTTPS的版本中)。前者不依赖于HttpListener,而后者则依赖HttpModule。当WCF托管在ASP.NET管道中时使用前者 - 来自System.ServiceModel.Activation程序集的内部类HttpHandlerHostedHttpRequestAsyncResult使用HostedHttpTransportManager依赖于HttpChannelListener。在创建{{1}}时使用后者(自托管)。

我的结论是,在ASP.NET管道中托管的WCF服务并不直接依赖于http.sys,而是托管管道的IIS。这允许创建自定义Web服务器,该服务器不依赖于http.sys,但能够托管ASP.NET等WCF。我认为这就是卡西尼所做的。自托管WCF服务始终依赖于http.sys。

正如我上面所写,这只是我基于一些快速逆向工程的猜测。