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

调用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 控制台客户端代码做如下调整:

  1. 显式指定通道的HTTP版本为1.1,同时设置版本策略强制使用指定版本
  2. 确保依赖的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:27:02