没有HTTP.SYS的WCF

Pau*_*ell 20 windows wcf http http.sys

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

在古时,我们可以新的插座,并绑定到任何老港,这是不使用的,没有被管理员.NetTcpBinding仍然能够做到这一点.

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

Lad*_*nka 15

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

编辑:

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

WCF内部包含一些所谓的抽象类,HttpTransportManager这个类是由内部类派生HostedHttpTransportManagerSharedHttpTransportManager(这其中也存在着版本HTTPS).前者不依赖,HttpListener后者则不依赖.当WCF托管在ASP.NET管道中时使用前者 - 内部类HttpModule和依赖于HttpHandlerSystem.ServiceModel.Activation程序集使用.创建后使用后者(自托管).HostedHttpRequestAsyncResultHostedHttpTransportManagerHttpChannelListener

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

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

  • VS中的Visual Web Server(Cassini)作为非管理员运行,可以监听HTTP请求,甚至可以提供BasicHttpBinding WCF服务.其他Web服务器也不需要依赖HTTP.SYS.所以必须有一种绕过它的方法. (2认同)