调用http协议ASP.NET Core gRPC服务抛出Grpc.Core.RpcException如何解决?
问题根因
.NET 5 中 Grpc.Net.Client 的默认HTTP协议处理逻辑和 .NET Core 3.1 存在差异:就算配置了GrpcWebHandler,客户端仍会优先尝试使用 HTTP/2 发起请求,而你部署在 IIS/IIS Express 上的 gRPC 服务开启了 gRPC Web 且配置为仅接受 HTTP/1.1 请求,协议不匹配就会抛出PROTOCOL_ERROR异常。
解决方案
只需对.NET 5 控制台客户端代码做如下调整:
- 显式指定通道的HTTP版本为1.1,同时设置版本策略强制使用指定版本
- 确保依赖的
Grpc.Net.Client、Grpc.Net.Client.Web等gRPC相关NuGet包版本适配.NET 5
修改后代码如下:
using System.Net.Http; // 缺失的话需要补充该命名空间引用 class Program { static void Main(string[] args) { var httpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator }; var channel = GrpcChannel.ForAddress( "http://localhost:10027/", new GrpcChannelOptions { HttpHandler = new GrpcWebHandler(httpHandler), // 新增以下两行配置,强制使用HTTP 1.1发起请求 HttpVersion = new Version(1, 1), HttpVersionPolicy = HttpVersionPolicy.RequestVersionExact }); var client = new Greeter.GreeterClient(channel); Console.WriteLine(client.SayHello(new HelloRequest { Name = "John Doe" }).Message); } }
额外排查项(如仍有问题可验证)
- 确认IIS/IIS Express已安装WebSocket功能,gRPC Web依赖该功能正常运行
- 确认部署gRPC服务的IIS应用池.NET CLR版本设置为
无托管代码 - 确认服务端
appsettings.json中Kestrel协议配置正确:
{ "Kestrel": { "EndpointDefaults": { "Protocols": "Http1" } } }
内容的提问来源于stack exchange,提问作者Hadi Fooladi Talari
相关产品推荐
相关产品推荐

