使用protobuf-net.grpc实现.NET Framework4.8与.NET8进程间通信遇异常
.NET Framework 4.8客户端连接.NET 8 gRPC服务端异常解决方案
问题分析
异常提示系统版本不支持WinHttpHandler的HTTP/2特性,本质是旧Windows版本(Win10、Server2019及以下)的WinHttp组件不支持未加密的HTTP/2,而.NET Framework的gRPC客户端默认使用WinHttpHandler。
解决方案
方案1:改用HTTPS通信(推荐,安全且兼容旧系统)
旧Windows版本的WinHttp支持HTTPS下的HTTP/2,只需修改服务端和客户端配置:
服务端修改(添加HTTPS监听)
static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureKestrel(options => { // 配置HTTPS监听端口,使用开发证书 options.ListenLocalhost(10043, listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; listenOptions.UseHttps(); // 本地开发可使用默认生成的开发证书 }); }) .UseStartup<Startup>();
客户端修改(连接HTTPS地址)
static async Task Main(string[] args) { // 开发环境若证书不被信任,可添加证书验证回调 var handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true; using (var channel = GrpcChannel.ForAddress("https://localhost:10043", new GrpcChannelOptions { HttpHandler = handler })) { var calculator = channel.CreateGrpcService<ICalculator>(); var result = await calculator.MultiplyAsync(new MultiplyRequest { X = 12, Y = 4 }); Console.WriteLine(result.Result); } }
方案2:使用SocketsHttpHandler实现未加密HTTP/2(仅本地IPC场景)
SocketsHttpHandler是.NET内置的HTTP客户端实现,不依赖系统WinHttp,支持旧Windows版本的未加密HTTP/2:
客户端修改
static async Task Main(string[] args) { GrpcClientFactory.AllowUnencryptedHttp2 = true; // 配置SocketsHttpHandler var handler = new SocketsHttpHandler { EnableMultipleHttp2Connections = true }; using (var channel = GrpcChannel.ForAddress("http://localhost:10042", new GrpcChannelOptions { HttpHandler = handler })) { var calculator = channel.CreateGrpcService<ICalculator>(); var result = await calculator.MultiplyAsync(new MultiplyRequest { X = 12, Y = 4 }); Console.WriteLine(result.Result); } }
关键说明
- .NET Framework 4.8本身支持gRPC,但默认的WinHttpHandler受限于系统版本的HTTP/2支持能力
- SocketsHttpHandler需要.NET Framework 4.7.2及以上版本(4.8满足),无需额外安装组件
- 生产环境优先使用HTTPS方案,避免未加密通信的安全风险
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

