在WCF中使用HTTP绑定时,我需要授予自己特殊权限才能绑定到该端口/路径。我理解这是因为WCF通过 http.sys 驱动程序接受HTTP流量。
在过去,我们可以新建一个套接字并绑定到任何未使用的旧端口,而不是管理员。 NetTcpBinding仍然能够做到这一点。
如果我不关心http.sys,有没有办法告诉WCF不要使用它,而只是在仍然使用HTTP绑定时打开常规旧套接字?
答案 0 :(得分:15)
基于WCF HTTP的绑定依赖于HttpListener
类,它是围绕HTTP API的托管包装器。 HTTP API取决于操作系统处理http请求的方式。因此,如果您使用使用http.sys驱动程序(Windows 2003和更高版本)的操作系统,则依赖于它。
修改强>
基于对卡西尼的非常好的争论,我在Reflector花了两个小时。以下描述仅是我的假设。我还没有找到任何关于它的信息,所以也许我完全错了。
WCF内部包含一些名为HttpTransportManager
的抽象类,该类由内部类HostedHttpTransportManager
和SharedHttpTransportManager
派生(这个类也存在于HTTPS的版本中)。前者不依赖于HttpListener
,而后者则依赖HttpModule
。当WCF托管在ASP.NET管道中时使用前者 - 来自System.ServiceModel.Activation程序集的内部类HttpHandler
和HostedHttpRequestAsyncResult
使用HostedHttpTransportManager
依赖于HttpChannelListener
。在创建{{1}}时使用后者(自托管)。
我的结论是,在ASP.NET管道中托管的WCF服务并不直接依赖于http.sys,而是托管管道的IIS。这允许创建自定义Web服务器,该服务器不依赖于http.sys,但能够托管ASP.NET等WCF。我认为这就是卡西尼所做的。自托管WCF服务始终依赖于http.sys。
正如我上面所写,这只是我基于一些快速逆向工程的猜测。