使用HTTPListener能否使用HTTP2协议?

9
现在是否可以使用HTTPListeners与http2功能一起使用?我没有听说过,但是我听说新版本的IIS / asp.net堆栈支持它,所以我希望HTTPListener也会得到升级,或者提供一种替代方案。
如果不行,最好的选择是使用原始套接字来支持http2,还是扩展httplistener有可能实现?
编辑:为了澄清,我不仅仅是寻找“报告”http2的解决方案,而是要让我能够真正使用http2的新功能,例如推送内容。我的用例是我有一个自定义CMS(自己编写的)服务器,响应速度极快(几乎立即响应所有请求),唯一剩下的优化就是能够推送内容并且具备多路复用能力,因为目前我唯一可以期望的加速是避免由于往返次数过多造成的延迟问题。
1个回答

10

HttpListener是Windows内核模块http.sys的托管"客户端"(类似于IIS也是它的客户端)。处理HTTP/2的此模块版本似乎仅在Win10 / IE中可用。如果您正在运行Win10且建立了HTTP/2连接,对HttpListener而言,它看起来可能相同,因为与HttpListener客户端抽象协议的http.sys驱动程序的接口。如果有任何不同,那就是HttpListenerResponse.ProtocolVersion显示HTTP/2。

HttpListener源代码中可以看出,与http.sys的接口是基于数据块的,只需订阅请求并一次性获取请求数据即可。这个数据块形成托管的HttpListenerContext类的基础,它将请求和响应数据公开为属性。 HttpListenerResponse通过将数据分成头和数据块并通过OutputStream属性公开来通过http.sys发送响应。如果支持多流,此公共API将需要更改。当前肯定不支持,并且我的猜测是它们不会更改此API,并且如果HttpListener也将支持HTTP/2,则将完全抽象HTTP/2或提供某种WriteAsync方法以在此更高级别上进行复用。听起来你想直接针对http.sys编写以利用协议的低级功能。


但我正在考虑使用http2的功能,所以除非.NET端有明确的功能支持,否则我认为我无法这样做(例如向客户端推送未请求的附加数据),或者我误解了什么? - Ronan Thibaudau
整个客户端和服务器之间的HTTP会话由http.sys处理。 HttpListener仅从http.sys获取请求数据,并通过它向客户端发送响应。 一旦http.sys支持HTTP / 2,HttpListener的公共接口就不必更改。 - codekaizen
正如我在编辑中指出的那样,目前不可能做到,因为源代码显示对 http.sys 仅有一个响应句柄。未来可能会有可能,但我认为它仍将是非常高层次的。 - codekaizen
那么这就留下了我在问题中提到的第二个选项:“如果不是,那么支持http2的最佳选择是什么,使用原始套接字还是扩展httplistener是否可能?”对此有什么想法吗?我认为编写自己的完整httplistener替代方案并支持http2将是非常困难的。 - Ronan Thibaudau
还需要等待21个小时才能授予赏金,但在计时器到期时,将会授予。为了参考,可以将不同的解决方案添加到您的答案中(httpsys本地,使用.NET Core,等待httplistener改进等)。 - Ronan Thibaudau
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接