基于System.Net.HttpListener的Web服务器HTTP/2 Server Push相关咨询
嘿,针对你提到的几个问题,我整理了详细的信息,帮你理清思路:
1. HttpListener是否已停止维护?
是的,HttpListener目前处于维护模式。它是.NET Framework时期的老牌组件,微软现在不会再为它添加新功能,只会在出现严重安全漏洞或关键功能性bug时进行修复。简单说,它已经不再是微软HTTP栈的发展重心了。
2. HttpListener是否会继续开发?
不会再进行新功能的开发了。像HTTP/2 Server Push这类新特性,微软明确不会再集成到HttpListener中。它的定位就是维持现有功能,保障依赖它的旧系统能正常运行,不会有新的特性迭代。
3. 更优替代方案
首推Kestrel——ASP.NET Core的默认Web服务器,这是目前微软主推的高性能、跨平台HTTP服务器,完全支持HTTP/2(包括Server Push),而且还在持续更新维护。
如果你不想引入完整的ASP.NET Core框架,也可以单独使用Microsoft.AspNetCore.Server.Kestrel包搭建轻量级服务器,示例代码大概是这样:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Hosting; var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseKestrel(options => { options.ListenAnyIP(5000, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2; }); }); var app = builder.Build(); app.MapGet("/", async context => { // 发送Server Push Promise var pushOptions = new PushPromiseOptions { Method = HttpMethods.Get }; await context.Response.PushPromiseAsync("/static/style.css", pushOptions); await context.Response.WriteAsync("Hello with HTTP/2 Server Push!"); }); await app.RunAsync();
除此之外,如果你需要更底层的控制,也可以考虑使用System.Net.Http.SocketsHttpHandler相关的API,但Kestrel是最成熟、文档最完善的选择。
4. 使用新HTTP/2特性的变通方法
如果必须继续基于HttpListener开发,很遗憾,没有可靠的变通方法来实现Server Push。HttpListener的HTTP/2实现仅支持基础的请求-响应模型,并没有暴露Server Push所需的API(比如PushPromise),而且因为它不再维护,也不会有后续的补丁来补上这个功能。
所以最务实的方案还是迁移到Kestrel,这样才能完整利用HTTP/2的所有特性。
内容的提问来源于stack exchange,提问作者Thomas

