.Net Core Webapi报"Request is missing Host header"错误解决咨询
问题根因
从抛出的异常堆栈可以直接定位,Request is missing Host header报错是Kestrel在HTTP/1.1请求解析阶段触发的硬校验,逻辑位于Http1Connection.EnsureHostHeaderExists()方法,执行时机远早于自定义中间件、过滤器、SoapCore端点处理逻辑的执行阶段——也就是说请求还没进入可注入代码的请求管道,就已经被判定为非法请求拒绝了,所以之前尝试在过滤器、中间件里补Host头完全不会生效,不是代码写法问题。
关于协议限制:HTTP/1.1 规范(RFC 7230)明确要求所有HTTP/1.1版本的请求必须携带Host请求头,缺失Host头的请求服务端应当返回400 Bad Request,Kestrel默认开启这个校验是完全符合协议要求的。
可行解决方案
- 优先方案:修改客户端逻辑补全Host头。这是最符合规范、无额外兼容成本的方案。绝大多数触发这个问题的场景都是老旧SOAP客户端配置疏漏,没有自动填充Host头,只需要调整客户端请求配置,补上对应服务地址的Host值即可,不会引入额外的服务端兼容风险。
- 服务端配置兼容:调整Kestrel配置关闭默认Host头强制校验,再通过最早注册的中间件补全缺失的Host头。
第一步在服务启动配置中添加Kestrel选项配置:
第二步在HTTP请求管道最开头(所有其他中间件注册之前)添加Host头补全逻辑:builder.WebHost.ConfigureKestrel(options => { // 关闭HTTP/1.1请求Host头强制校验 options.AllowHostHeaderOverride = true; });
注意:低版本.NET如果配置后依然触发报错,可查找对应版本Kestrel的Http1解析选项,放开缺失Host头的拦截规则即可。app.Use(async (context, next) => { if (!context.Request.Headers.ContainsKey("Host")) { // 替换为服务实际对外暴露的域名/IP+端口 context.Request.Headers.Host = "your-service-domain:port"; } await next(); }); - 反向代理中转:如果既改不了客户端,也不想调整Kestrel的默认安全配置,可以在Kestrel前面部署一层反向代理(Nginx、IIS、YARP都可以),反向代理接收请求后会自动补全Host头再转发给Kestrel,从根源上绕过这个校验。生产环境如果本来就部署了反向代理,只需要调整代理规则即可,不需要改动业务服务代码。
注意事项
- 不要只关闭Host头校验不做补全逻辑:SoapCore生成WSDL文档、服务端生成重定向地址、部分请求签名校验逻辑都依赖Host头的值,空Host会导致WSDL地址生成错误、重定向失效等连锁问题。
- 如果采用IIS进程内托管模式,IIS本身会在请求到达ASP.NET Core模块之前做HTTP协议校验,缺失Host头的请求会被IIS直接拦截,这种场景需要先调整IIS的请求筛选规则,或者改用反向代理方案。
内容的提问来源于stack exchange,提问作者A.D.
相关产品推荐
相关产品推荐

