【问题标题】:Is it possible to use HTTP2 with HTTPListener是否可以将 HTTP2 与 HTTPListener 一起使用
【发布时间】:2015-07-19 23:55:23
【问题描述】:

是否可以在 HTTPListeners 中使用 http2 功能?我没有听到任何关于它的消息,但我听说 IIS / asp.net 堆栈的新版本支持它,所以我希望 HTTPListener 也能被升级或提供替代方案。

如果不是支持 http2 的最佳选择是什么,使用原始套接字,或者是否有可能扩展 httplistener?

编辑:澄清一下,我不只是在寻找“报告”http2 的解决方案,而是让我能够实际使用 http2 新功能(例如推送内容)的解决方案,我的用例是我有一个自定义 CMS(自写)具有极低延迟的服务器(几乎立即回复所有请求)并且唯一需要优化的是能够推送内容并且能够多路复用,因为目前我唯一希望的加速是避免这么多往返的延迟

【问题讨论】:

    标签: .net httplistener http2


    【解决方案1】:

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

    查看HttpListener的来源,似乎http.sys的接口是面向blob的,只是订阅请求并在一个大blob中获取请求数据。此 blob 构成托管 HttpListenerContext 类的基础,该类将请求和响应数据作为属性公开。 HttpListenerResponse 通过http.sys 发送响应,将数据分解为通过OutputStream 属性公开的标头和数据块。如果支持多流,则需要更改此公共 API。目前肯定不支持它,我猜他们不会改变这个 API,如果HttpListener 支持 HTTP/2,它要么完全抽象 HTTP/2,要么提供某种 WriteAsync 方法在这个更高级别进行多路复用。听起来您想直接针对 http.sys 编写代码以利用协议的较低级别功能。

    【讨论】:

    • 但是我正在考虑使用 http2 功能,所以除非在 .net 方面有明确的功能支持,否则我认为我无法做到这一点(比如将未请求的其他数据推送到客户),还是我误解了什么?
    • 客户端和服务器之间的整个HTTP会话由http.sys处理。 HttpListener 只从http.sys 获取请求数据,并通过它将响应发送回客户端。一旦http.sys 支持 HTTP/2,HttpListener 的公共接口就不必更改。
    • 如果要公开新功能,例如推送内容,我不知道如何在当前界面中公开它,或者如果你认为可以,你可以写一个示例?
    • 正如我在上面的编辑中指出的那样,目前这是不可能的,因为源显示了http.sys 的单个响应句柄。将来可能会,但我怀疑它仍然会非常高。
    • 那么这给我们留下了我的问题中的第二个选项“如果不是支持 http2、使用原始套接字或是否有可能扩展 httplistener 的最佳选择是什么?”。对此有什么想法吗?我假设用 http2 支持编写我自己的完整 httplistener 替代品会很重要?
    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 2016-04-01
    • 2011-01-20
    • 2018-08-11
    • 2021-08-05
    • 2019-03-18
    • 2014-03-15
    • 2021-03-31
    相关资源
    最近更新 更多