ASP.NET Core中如何限制HTTP协议版本低于2.0的请求
在ASP.NET Core中限制HTTP/2.0以下版本的请求
当然可以,你可以通过自定义中间件或者配置Kestrel服务器两种方式在Startup.cs中实现该限制,具体做法如下:
方法一:自定义中间件(通用所有托管场景)
在Startup.cs的Configure方法中添加自定义中间件,在请求进入业务逻辑前拦截不符合版本要求的请求:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 版本限制中间件需放在其他业务中间件之前 app.Use(async (context, next) => { // 仅允许HTTP/2及以上版本的请求 if (context.Request.Protocol is not "HTTP/2" and not "HTTP/3") { context.Response.StatusCode = StatusCodes.Status400BadRequest; await context.Response.WriteAsync("仅支持HTTP/2.0及以上版本的请求"); return; } // 版本合规,继续执行后续逻辑 await next(); }); // 其他中间件配置(路由、MVC等) app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
方法二:配置Kestrel服务器(仅Kestrel托管场景)
如果你的应用使用Kestrel作为服务器,可以直接从服务器层面禁用HTTP/1.x协议,只开放HTTP/2及以上版本。在Startup.cs的ConfigureServices方法中添加配置:
public void ConfigureServices(IServiceCollection services) { services.Configure<KestrelServerOptions>(options => { options.ConfigureEndpointDefaults(listenOptions => { // 指定仅支持HTTP/2和HTTP/3 listenOptions.Protocols = HttpProtocols.Http2 | HttpProtocols.Http3; }); }); // 其他服务注册 services.AddControllers(); }
这种方式效率更高,不符合要求的请求会被Kestrel直接拒绝,不会进入应用管道。注意:
- HTTP/2默认需要TLS(HTTPS)环境,生产环境不建议启用明文HTTP/2
- HTTP/3需要.NET 6及以上版本支持,且需配合相应服务器配置
内容的提问来源于stack exchange,提问作者Saurabh Soni
相关产品推荐
相关产品推荐

