21

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

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

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

4

1 回答 1

16

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

编辑:

基于关于 Cassini 的非常好的论据,我在 Reflector 中度过了两个小时。以下描述只是我的假设。我还没有找到任何关于它的信息,所以也许我完全错了。

WCF 内部包含一些称为HttpTransportManager此类的抽象类,该类是由内部类派生的,HostedHttpTransportManager并且SharedHttpTransportManager(该类也存在于 HTTPS 版本中)。前者不依赖,HttpListener但后者依赖。当 WCF 托管在 ASP.NET 管道中时使用前一个 - 内部类HttpModuleHttpHandler来自 System.ServiceModel.Activation 程序集的使用HostedHttpRequestAsyncResult依赖于HostedHttpTransportManager. 后一个在HttpChannelListener创建时使用(自托管)。

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

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

于 2010-08-23T15:15:01.287 回答