使用gRPC-Net客户端对接Google gRPC无安全通道时触发协议违规异常
问题解决:.NET 4.7.2 gRPC客户端对接Grpc.Core服务端的协议异常
错误原因
你遇到的协议违反(Section=ResponseStatusLine)异常,核心原因是客户端和服务端的gRPC协议不兼容:
- 服务端用的是Google官方的
Grpc.Core库,默认只支持原生HTTP/2 gRPC协议 - 客户端却使用了
GrpcWebHandler,这是专门用于处理gRPC-Web协议的处理器,两种协议的报文格式完全不同,导致客户端无法解析服务端的响应,触发协议错误。
解决方案
方案1:客户端改用Grpc.Core客户端(推荐,无需修改服务端)
既然服务端是原生Grpc.Core实现,客户端直接用对应的Grpc.Core库即可,不需要引入Grpc.Net.Client和GrpcWebHandler。
修改后的客户端代码:
// 注意:需要安装Grpc.Core和对应的proto生成的Grpc.Core客户端包 var channel = new Grpc.Core.Channel($"localhost:{port}", Grpc.Core.ChannelCredentials.Insecure); var client = new Greeter.GreeterClient(channel); // 调用示例 var reply = await client.SayHelloAsync(new HelloRequest { Name = "Test" }); Console.WriteLine(reply.Message);
方案2:服务端添加gRPC-Web支持(保留现有客户端代码)
如果必须使用Grpc.Net.Client + GrpcWebHandler,需要在服务端启用gRPC-Web支持。因为Grpc.Core本身不直接支持gRPC-Web,需要改用ASP.NET Core集成的gRPC服务并添加适配中间件。
修改.NET 6服务端代码:
- 安装
Grpc.AspNetCore.WebNuGet包 - 替换原Grpc.Core Server为ASP.NET Core gRPC服务:
var builder = WebApplication.CreateBuilder(args); // 添加gRPC服务 builder.Services.AddGrpc(); var app = builder.Build(); // 添加gRPC-Web中间件,必须放在MapGrpcService之前 app.UseGrpcWeb(); // 映射Greeter服务,并启用gRPC-Web app.MapGrpcService<GreeterServer>().EnableGrpcWeb(); // 启动服务,指定端口(用0可让系统分配随机端口) app.Run("http://localhost:0");
注意:改用ASP.NET Core的gRPC服务后,可通过
app.Urls获取实际监听的端口。
内容的提问来源于stack exchange,提问作者MisterT
相关产品推荐
相关产品推荐

