问题标签 [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.
windows - 如何将您的应用程序注册到\with Http.sys?
所以我创建了一个 TCP\HTTP 服务器(在 C# 中)。我想在我拥有的其他 HTTP 服务器附近的 80 端口上给它命名空间。如何做这样的事情(一步一步)?
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 进行通信。TcpClient
TcpListener
在我的 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.MaxServicePointIdleTime
、ServicePointManager.DefaultConnectionLimit
、ServicePointManager.Expect100Continue
和HttpWebRequest.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 不是我需要完成的工作的正确工具,并且必须继续使用我们一直使用的手动套接字协议。
registry - 更改 Windows Azure 上的 http.sys 注册表设置?
我需要提高Windows Azure 上Http.sys 注册表设置的 UrlSegmentMaxLength。有谁知道该怎么做?(或做一些导致等效行为的事情)
windows - 没有 HTTP.SYS 的 WCF
在 WCF 中使用 HTTP 绑定时,我需要授予自己特殊权限才能绑定到该端口/路径。我理解这是因为 WCF 通过http.sys驱动程序接受 HTTP 流量。
在过去,我们可以新建一个套接字并绑定到任何未使用的旧端口,而无需成为管理员。NetTcpBinding 仍然能够做到这一点。
如果我不关心 http.sys,有没有办法告诉 WCF 不要使用它,而是在仍然使用 HTTP 绑定的同时打开一个常规的旧套接字?
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 感兴趣)
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)我可能遗漏了一些东西,但是您如何指定与此代码一起提供的文件所在的核心目录?
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. 在注册表中增加此限制。
windows - Http.sys 是否支持全双工通信?
这可能吗?我们能否访问 http.sys 使用的底层套接字来为给定请求提供响应。我希望能够通过端口 80 上的 http 协议支持全双工通信。
有没有办法为当前请求获取已建立的套接字,并保留它以进行全双工通信?
我的用例是网络套接字。web socket的握手实际上是一个有效的http请求,我想重用我的web服务器来升级它。另一个端口可能未在客户端计算机上打开,因此端口 80 至关重要。
任何替代品都值得赞赏。
.net - HttpListener 节流?
MSDN 说HttpListener 基于 http.sys 并且“HTTP.sys 提供连接管理、带宽限制和 Web 服务器日志记录”。
我需要限制与服务器的最大连接数。使用 HttpListener 执行此操作的最佳方法是什么?
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服务的相同问题。