【问题标题】:How do you create a gRPC client in .NET Framework?如何在 .NET Framework 中创建 gRPC 客户端?
【发布时间】:2020-07-01 03:47:51
【问题描述】:

我按照以下说明操作:

https://docs.microsoft.com/en-us/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-3.1&tabs=visual-studio

在 .NET Core 中创建 gRPC 服务和客户端,一切正常。

接下来,我需要让旧版 .NET 框架应用程序访问该服务。我找到了一些可以安装的 NuGet 包,但没有找到任何可以告诉您如何使用它们来制作 gRPC 客户端的内容。我确定它在某个地方,但目前被 .NET Core 版本的文档淹没了。

我尝试创建一个 .NET Standard 项目来弥合差距,但 .Net Core 包需要 .Net Standard 2.1,这使得任何版本的 .Net Framework 都无法引用它。

谁能告诉我如何进行或指出正确的方向?

编辑: 所以我找到了一些 .Net Framework 的代码来与 gRPC 一起工作。 .Net Framework 示例默认为不安全连接,而 .Net Core 示例默认为安全连接。并且对于如何改变任何一个都没有明确的路径。我已尝试生成证书以使客户端连接,但没有成功。

所以我的新问题是:有谁知道如何说服 .Net Core gRPC 服务接受不安全的 (http:) 连接?

【问题讨论】:

  • 您好,这很有趣,我想知道您是否对该文档中的 GrpcGreeterClient 示例项目有任何运气?
  • 我在 .Net Core 中基于 Greeter 创建了一个服务和客户端。我无法为 .Net Framework 找到类似的东西。
  • 看看这个针对 .net 4.5 的项目 - github.com/grpc/grpc/tree/master/src/csharp/…
  • 我没有看到 grpc 客户端
  • 最终通过使用 .Net Framework 制作服务器来解决问题。如果我能弄清楚如何让框架客户端在安全模式下工作,我会切换回来。 .Net Core 服务实现似乎不支持不安全的连接。

标签: c# .net grpc


【解决方案1】:

无论是否通过 SSL,您都需要在 ASP.NET Core 服务器中开启 Http2。所以在 appsettings.json 中,这样做。

"Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }

不安全的 .NET Framework 客户端 + ASP.NET Core 服务器

  • ASP.NET 核心服务器
    1. 删除StartUpConfigureServices(IApplicationBuilder app)中的app.UseHttpsRedirection()app.UseHsts()
    2. 在开发过程中公开不安全的端口,通常为 80 或 5000。
    3. 使用以下代码在 .NET Framework 客户端中创建不安全通道。
var channel = new Channel("localhost", 5000, ChannelCredentials.Insecure);

安全 SSL 连接 .NET Framework 客户端 + ASP.NET Core 服务器

我通过在客户端中使用相同的服务器证书以 .pem 格式使用 SSL 端口。

SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("certificate.pem"));
var channel = new Channel("localhost", 5001, secureCredentials);

稍微解释一下。 VS 2019 中的 ASP.NETCore 模板使用带有 pfx 文件的开发证书%AppData%\ASP.NET\Https\ProjectName.pfx。 证书密码在%AppData%\Microsoft\UserSecrets\{UserSecretsId}\secrets.json 您可以从ProjectName.csproj 获取UserSecretsId id。这对于每个 ASP.NET Core 项目都是不同的。

我们只需要将证书的公钥作为 certificate.pem 文件即可通过 gRPC 进行安全通信。使用以下命令从 pfx 中提取公钥

openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -nokeys -out "<TargetLocation>\certifcate.pem"

复制此cerificate.pem 以供 gRPC .NET Framework 客户端使用。

SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("<DiskLocationTo the Folder>/certificate.pem"))
var channel = new Channel("localhost", 5001, secureCredentials);

请注意,我使用的端口 5001 是我的 ASP.NET Core 应用程序的 SSL 端口。

适用于生产场景

使用来自证书签名机构的有效证书,并在 ASP.NET Core Server 和 .NET Framework 客户端中分别使用与 pfxpem 相同的证书。

使用自签名证书

对于在我们自己的微服务之间进行通信的大多数微服务来说,使用自签名证书是一种有效的选择。我们可能不需要权威签署的证书。我们在使用自签名证书时可能面临的一个问题是,证书可能会颁发给某个目标 DNS 名称,而我们的 gRPC 服务器可能正在其他地方运行,并且无法建立安全连接。

使用 gRPC Target Name override keys 覆盖 ssl 目标名称验证。

   List<ChannelOption> channelOptions = new List<ChannelOption>()
   {
       new ChannelOption("grpc.ssl_target_name_override", <DNS to which our certificate is issued to>),
   };
   SslCredentials secureCredentials = new SslCredentials(File.ReadAllText("certificate.pem"));

   var channel = new Channel("localhost", 5001, secureCredentials, channelOptions);

【讨论】:

  • 我找到了一种不需要在客户端存储 pem 的方法,也许它对其他人也有用:stackoverflow.com/a/66041094/727250
  • 我只能使用它不安全地调用服务,在客户端使用我的证书不起作用。
  • 有一个部分是不安全的,我的回答中有一个是安全的。 @schh。请完整阅读
  • 我现在通过一个核心客户端和一个 .net 框架客户端让它既适用于安全又适用于不安全。我从头开始重新生成了我的自签名证书,现在它工作正常。谢谢
  • Channel 类在哪个程序集中可用? @JinsPeter
【解决方案2】:

你可以通过config配置.Net core grpc server on insecure

有两种方式,

启动设置,json

{
  "profiles": {
    "DemoService": {
      "commandName": "Project",
      "launchBrowser": false,
      "applicationUrl": "http://localhost:5001",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

或者

应用设置,json

"Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    },
    "EndPoints": {
      "Http": {
        "Url": "http://localhost:5001"
      }
    }
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2011-01-20
    • 2020-08-07
    • 2018-05-17
    相关资源
    最近更新 更多