ASP.NET Core 3.1升级到5后IIS部署报HTTP协议版本映射错误求助
根因说明
该异常是由于IIS转发到ASP.NET Core 5进程的请求中,存在不符合官方预定义范围的HTTP协议版本号,HostFiltering中间件读取请求Protocol属性时触发了内置参数校验逻辑,直接抛出未处理异常。测试环境无报错是因为测试流量来源统一,不存在非标准的畸形请求,生产环境公网流量复杂,包含大量爬虫、探测工具发起的异常请求,因此触发该问题。
解决思路
- 优先升级托管运行时:确认生产环境安装的ASP.NET Core 5托管捆绑包版本,升级到.NET 5最终正式版(5.0.17)对应的托管捆绑包,排除.NET 5早期版本IIS集成模块的已知Bug
- 排查前端流量设备:检查生产站点前置的负载均衡、WAF、反向代理设备配置,确认是否存在转发时篡改HTTP协议版本号的异常配置
- 调整IIS站点配置:可临时关闭站点的HTTP/2功能测试,若错误消失则进一步排查客户端与IIS的HTTP/2协商兼容问题
- 新增前置中间件拦截异常:在中间件管道最开头(HostFiltering中间件注册之前)添加自定义拦截逻辑,提前处理协议版本异常:
app.Use(async (context, next) => { try { // 主动触发Protocol读取,提前捕获异常 _ = context.Request.Protocol; } catch (ArgumentOutOfRangeException) { // 手动赋值为合法默认协议版本 var requestFeature = context.Features.Get<Microsoft.AspNetCore.Http.Features.IHttpRequestFeature>(); requestFeature.Protocol = "HTTP/1.1"; } await next(); });
验证方案
开启生产环境IIS的失败请求跟踪功能,捕获触发异常的原始请求报文,确认异常请求的协议版本具体值,可从流量入口侧直接拦截对应非法请求。
内容的提问来源于stack exchange,提问作者user1717926
相关产品推荐
相关产品推荐

