首页 > 解决方案 > 为什么我在尝试从编写 .net 核心的 gRPC 服务获取数据时收到 Grpc.Core.RpcException

问题描述

我有一个 gRPC 服务(用 .net core 3.1 编写)部署在 windows 服务器中,作为在 kerstel 中运行的自托管服务。

在此处输入图像描述 我添加了以下配置以使服务在 https 中运行。

"Kestrel": {
"EndpointDefaults": {
  "Protocols": "Http2"
},
"Endpoints": {
  "HttpsInlineCertFile": {
    "Url": "https://hostname:8081",
    "Protocols": "Http2",
    "Certificate": {
      "Path": "path to .pfx file",
      "Password": "Super secret password"
    }
  }
}

使用下面的代码

using GrpcChannel channel = GrpcChannel.ForAddress(httpsHost);
var client = new MyClient(channel);
var response = client.GetEntity(RequestCreator.GetRequest());
Console.WriteLine("Recieved: " + response.ToString());

我得到以下异常,内部异常为空。

Status(StatusCode=Internal, Detail="启动 gRPC 调用时出错:无法建立 SSL 连接,请参阅内部异常。")

在此处输入图像描述

我应该添加什么来让客户端从服务中获取数据吗?

提前致谢

标签: grpc-dotnet

解决方案


很抱歉我的问题回复晚了。问题是代理。我最终做的是创建一个 webproxy,将 gRPC 服务 url 添加到 bypassArrayList,创建 httpClientHandler,分配创建的 proyx,然后创建一个使用该 httpClientHandler 的 httpClient。

        var proxy = new WebProxy
        {
            Address = new Uri(proxyServer),
            UseDefaultCredentials = true,
            BypassProxyOnLocal = true,
            Credentials = CredentialCache.DefaultNetworkCredentials
        };

        proxy.BypassArrayList.Add(serviceUrl);

        var httpClientHandler = new HttpClientHandler
        {
            Proxy = proxy,
            DefaultProxyCredentials = CredentialCache.DefaultNetworkCredentials,
            UseDefaultCredentials = true,
            UseProxy = true,
        };
        var client = new HttpClient(httpClientHandler)
        {
            DefaultRequestVersion = HttpVersion.Version20
        };

        using var channel = GrpcChannel.ForAddress(serviceUrl, new GrpcChannelOptions
        {
            HttpClient = client
        });

推荐阅读