问题标签 [http.sys]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3965 浏览

windows - 如何将您的应用程序注册到\with Http.sys?

所以我创建了一个 TCP\HTTP 服务器(在 C# 中)。我想在我拥有的其他 HTTP 服务器附近的 80 端口上给它命名空间。如何做这样的事情(一步一步)?

0 投票
2 回答
2458 浏览

c# - 如何最大化 http.sys 文件上传性能

我正在构建一个工具,可以将非常大的流数据集(可能在单个流中以 TB 为单位;通常以数十 GB 为单位)从一台服务器传输到另一台服务器。该工具的客户端部分将从源磁盘读取块,并通过网络发送它们。服务器端将从网络上读取这些块并将它们写入服务器磁盘上的文件。

现在我正在尝试决定使用哪种交通工具。选项是原始 TCP 和 HTTP。

我真的,真的很想能够使用 HTTP。HttpListener(或 WCF,如果我想走那条路)可以很容易地插入 HTTP 服务器 API (http.sys),我可以免费获得身份验证和 SSL 之类的东西。现在的问题是性能。

我编写了一个简单的测试工具,它使用 BeginWrite/EndWrite 异步 I/O 习惯用法发送 128K 块 NULL 字节,并在服务器端使用异步 BeginRead/EndRead。我已经修改了这个测试工具,因此我可以通过HttpWebRequest/使用 HTTP PUT 操作或使用/HttpListener的普通旧套接字写入来做到这一点。为了排除网卡或网络路径的问题,客户端和服务器都在一台机器上并通过 localhost 进行通信。TcpClientTcpListener

在我的 12 核 Windows 2008 R2 测试服务器上,此测试工具的 TCP 版本可以以 450MB/s 的速度推送字节,而 CPU 使用率最低。在同一个盒子上,测试工具的 HTTP 版本在 130MB/s 和 200MB/s 之间运行,这取决于我如何调整它。

在这两种情况下,CPU 使用率都很低,而且绝大多数 CPU 使用率都是内核时间,所以我很确定我对 C# 和 .NET 运行时的使用不是瓶颈。该盒子有两个 6 核 Xeon X5650 处理器,24GB 单列 DDR3 RAM,专门用于我自己的性能测试。

我已经了解 HTTP 客户端调整,例如ServicePointManager.MaxServicePointIdleTimeServicePointManager.DefaultConnectionLimitServicePointManager.Expect100ContinueHttpWebRequest.AllowWriteStreamBuffering.

有没有人对我如何获得超过 200MB/s 的 HTTP.sys 性能有任何想法?有没有人看到它在任何环境下都表现得这么好?

更新

TcpListener下面是关于我在vs中看到的性能的更多细节HttpListener

首先,我编写了一个 TcpClient/TcpListener 测试。在我能够推动 450MB/s 的测试盒上。

然后使用反射器,我想出了如何获取 HttpWebRequest 底层的原始 Socket 对象,并修改了我的 HTTP 客户端测试以使用它。仍然没有喜悦;几乎没有 200MB/s。

我目前的理论是 http.sys 针对典型的 IIS 用例进行了优化,即大量并发的小请求,以及大量的并发和可能的大响应。我假设为了实现这种优化,MSFT 必须以我试图完成的事情为代价,即单个非常大的请求的吞吐量非常高,响应非常小。

值得一提的是,我还尝试了最多 32 个并发 HTTP PUT 操作,看看它是否可以横向扩展,但仍然没有任何乐趣;大约 200MB/秒。

有趣的是,在我的开发工作站上,它是一个运行 64 位 Windows 7 的四核 Xeon Precision T7400,我的 TcpClient 实现约为 200MB/s,HTTP 版本也约为 200MB/s。一旦我将它带到运行 Server 2008 R2 的更高端的服务器级机器上,TcpClient 代码将达到 450MB/s,而 HTTP.sys 代码则保持在 200 左右。

在这一点上,我很遗憾地得出结论,HTTP.sys 不是我需要完成的工作的正确工具,并且必须继续使用我们一直使用的手动套接字协议。

0 投票
2 回答
1885 浏览

registry - 更改 Windows Azure 上的 http.sys 注册表设置?

我需要提高Windows Azure 上Http.sys 注册表设置的 UrlSegmentMaxLength。有谁知道该怎么做?(或做一些导致等效行为的事情)

0 投票
1 回答
2996 浏览

windows - 没有 HTTP.SYS 的 WCF

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

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

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

0 投票
1 回答
3587 浏览

asp.net - 线程如何通过 Http.sys、IIS 和 ASP.NET 与请求绑定

我目前正在阅读很多关于 node.js 的内容。使用传统的每个请求线程模型 (Apache) 的服务器和使用事件循环的服务器 (Nginx、node、Tornado) 之间经常进行比较。

我想详细了解如何在 ASP.NET 中处理请求 - 从在 http.sys 中接收到它一直到在 ASP.NET 本身中处理它。我发现 http.sys 和 IIS 上的 MSDN 文档有点缺乏,但今天我的 google-fu 可能很弱。到目前为止,我找到的最好的资源是Thomas Marquardt 的博客上的一篇文章。

任何人都可以对这个话题有更多的了解,或者给我指出任何其他资源吗?

(出于这个问题的目的,我只对具有典型集成管道的 IIS7 感兴趣)

0 投票
4 回答
3878 浏览

c# - C# NET HTTP.SYS 网络服务器

我只需要创建一个非常基本的 Web 服务器,它基本上可以让我访问http://1.2.3.4:8080并浏览 C:\web 或其他地方的文件列表。

我发现这个http://mikehadlow.blogspot.com/2006/07/playing-with-httpsys.html看起来很完美,但我遇到了几个问题。

1)当我像文档所说的那样用 * 或 + 替换 IP 时,我在 system.dll 中收到拒绝访问错误。当我使用 localhost 或我的本地 IP 时,它工作正常。为什么是这样?我希望能够将它绑定到具有多个机器上的特定 IP 地址。

2)我可能遗漏了一些东西,但是您如何指定与此代码一起提供的文件所在的核心目录?

0 投票
2 回答
376 浏览

windows - HttpAddFragmentToCache 和操作系统错误 50

我正在尝试在应用程序中创建嵌入式 Web 服务器。为此,我使用 Windows 中的 http.sys HTTP 服务器组件。当我不尝试使用时,一切正常HttpAddFragmentToCache

到目前为止我所做的(删除了任何错误检查,但没有片段缓存它可以正常工作):

现在,当请求来自辅助线程时:

我要更改的是向片段缓存添加一些静态文档(在上面的省略号处):

注意:在我的代码中,所有重叠的参数都可以选择为 nil / NULL,这解释了为什么您可能会错过该参数。

这将产生 50 的结果(不支持该请求)。我试图从内存和文件句柄中添加片段,所有不同的策略。检查传递的值在反汇编中是否正确,检查传递给的字符串HttpAddFragmentToCache是否确实是传递给的字符串的有效子URL HttpAddUrl(如果不是,您会收到操作系统错误2,所以也不是)。

我的问题是:这可能是什么?我尝试以我能看到的最直接的方式使用这个 API 调用(这是 API 的设计目的),但显然我做错了什么......

更新:

看起来使用该函数添加的片段HttpAddFragmentToCache具有最大大小:

当上面的代码被替换为:

没有错误发生;当被替换为

它失败。显然有一个大小限制......我找到了它:

http://support.microsoft.com/kb/820129

UriMaxUriBytes 262144 (bytes) 4096(4k) – 16777216(16MB) bytes 任何大于此值的响应都不会缓存在内核响应缓存中。

这留下了两个选择: 1. 为较大的文件保留多个片段。或 2. 在注册表中增加此限制。

0 投票
1 回答
381 浏览

windows - Http.sys 是否支持全双工通信?

这可能吗?我们能否访问 http.sys 使用的底层套接字来为给定请求提供响应。我希望能够通过端口 80 上的 http 协议支持全双工通信。

有没有办法为当前请求获取已建立的套接字,并保留它以进行全双工通信?

我的用例是网络套接字。web socket的握手实际上是一个有效的http请求,我想重用我的web服务器来升级它。另一个端口可能未在客户端计算机上打开,因此端口 80 至关重要。

任何替代品都值得赞赏。

0 投票
2 回答
2361 浏览

.net - HttpListener 节流?

MSDN 说HttpListener 基于 http.sys 并且“HTTP.sys 提供连接管理、带宽限制和 Web 服务器日志记录”。

我需要限制与服务器的最大连接数。使用 HttpListener 执行此操作的最佳方法是什么?

0 投票
1 回答
7675 浏览

wcf - WCF 服务出现错误 503

我有一个在端口 80 上侦听的自托管 WCF 服务。当我尝试连接到它时,我得到一个503 Service Unavailable.

我的 WCF 进程正在运行,IIS 正在运行。我的 URL ACL 是正确的。控制永远不会到达我的 WCF 进程。

WCF 跟踪仅显示:

Failed Request Tracing中没有显示任何内容,它已正确打开 - 出现其他跟踪。该503 Service Unavailable消息非常明确,暗示它来自内核模式,而不是用户模式。

打开了 HTTP.SYS tracking,这表明命名空间被正确保留:

但后来,在同一个跟踪中,我看到:

我已经尝试iisreset了几次,但它没有帮助。我也重启了电脑;同样的问题。

出了什么问题?我还能做些什么来进一步调试这个问题?

更新

如果我重命名 URL(例如,将“Foo”更改为“Fizz”),那么它可以工作。看起来某处的配置已损坏。

我在同一进程中托管了其他绑定到的服务https://localhost/Foo/Bar/,它们似乎工作正常。

不仅仅是 WCF

我在使用自托管Nancy服务时遇到了同样的问题,下面的一位评论者报告了自托管ServiceStack服务的相同问题。