windows - 没有 HTTP.SYS 的 WCF

标签 windows wcf http http.sys

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

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

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

最佳答案

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

编辑:

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

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

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

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

关于windows - 没有 HTTP.SYS 的 WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3548602/

相关文章:

c# - 如何理解服务调用是 "Restful service call"还是 "standard wcf call"?

android - 在 android 上用一些 "setEntity"方法可以很好地替代 HttpPost 和 HttpPut 吗?

javascript - 使用 Javascript 在内容配置 header 中设置大小参数

c++ - 以 headless 模式运行 WinDbg

windows - MSVBVM60.DLL 是否包含在 XP 之后的每个 Windows 版本中?

windows - 如何找出用户计算机上安装了哪些 Visual Studio 扩展?

ios - 使用 Node (fs writeStreams)保存图像将标题插入文件

c++ - 适用于 Windows 的类似 distcc 的框架

wcf - 关闭和处理 WCF 服务

wcf - WCF MaxReceivedMessageSize 有什么意义