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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:52:04