You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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选项配置:
    builder.WebHost.ConfigureKestrel(options =>
    {
        // 关闭HTTP/1.1请求Host头强制校验
        options.AllowHostHeaderOverride = true;
    });
    
    第二步在HTTP请求管道最开头(所有其他中间件注册之前)添加Host头补全逻辑:
    app.Use(async (context, next) =>
    {
        if (!context.Request.Headers.ContainsKey("Host"))
        {
            // 替换为服务实际对外暴露的域名/IP+端口
            context.Request.Headers.Host = "your-service-domain:port";
        }
        await next();
    });
    
    注意:低版本.NET如果配置后依然触发报错,可查找对应版本Kestrel的Http1解析选项,放开缺失Host头的拦截规则即可。
  • 反向代理中转:如果既改不了客户端,也不想调整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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:21:14