.NET 5 gRPC服务本地IIS运行正常,远程调用提示不支持HTTP/1.1协议
问题核心根因
你遇到的Grpc.Core.RpcException、HResult值0x80131500本质是远程部署环境下gRPC服务的传输协议协商失败,最终以HTTP/1.1完成请求交互,而gRPC框架仅支持基于HTTP/2的传输协议,因此触发协议不匹配校验拦截。
本地运行正常的核心原因是本地调试时服务默认由Kestrel直接托管,默认启用HTTP/2支持,和IIS托管的运行机制存在本质差异,不能直接复用本地配置的判断逻辑。
排查与修复步骤
- 校验远程服务器的IIS版本适配能力
- 确认服务器系统为Windows Server 2016及以上、IIS版本为10.0及以上:更低版本的系统/IIS原生不支持HTTP/2 over TLS,本身就无法承载IIS托管的gRPC服务
- 确认IIS的TLS配置:在服务器的SSL配置中禁用TLS 1.0、TLS 1.1旧版本,确保TLS 1.2及以上的加密套件正常启用,同时验证TLS握手过程中启用ALPN(应用层协议协商)扩展——ALPN是TLS阶段自动协商HTTP/2协议的核心依赖,没有ALPN支持时,握手过程会直接降级选择HTTP/1.1
- 排查链路中间的代理层协议截断
- 如果远程服务入口之前挂载了云负载均衡、ARR反向代理、Nginx等中间转发组件,必须确认这些组件的前后端链路都支持HTTP/2透传:很多代理默认是HTTP/1.1格式转发请求到后端IIS,相当于把原本的HTTP/2请求截断成了HTTP/1.1格式,这种场景下哪怕IIS本身支持HTTP/2也无济于事
- 检查服务对应
web.config的aspNetCore配置节点,确认没有强制指定HTTP/1.1请求处理模式的参数,正确的托管配置会自动启用对HTTP/2的支持
- 校验客户端调用配置
- 确认客户端代码没有强制指定HTTP/1.1的传输配置:比如使用
Grpc.Net.Client时,没有误设置强制走HTTP/1.1的AppContext开关 - 确认远程调用的目标地址没有经过会剥离HTTP/2标识的CDN节点
- 确认客户端代码没有强制指定HTTP/1.1的传输配置:比如使用
修复验证方法
- 在远程服务器本地直接访问gRPC服务的健康检查端点,查看响应头的协议标识,确认IIS返回的响应使用的是HTTP/2版本而非HTTP/1.1
- 抓取TLS握手阶段的网络包,确认客户端和服务器在ALPN协商环节选定的应用层协议为
h2(对应HTTP/2),而非http/1.1
内容的提问来源于stack exchange,提问作者jon morgan
相关产品推荐
相关产品推荐

