如何在 .NET Framework 中创建 gRPC 客户端?

Ric*_*ley 15 .net c# grpc

我按照以下说明操作:

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:) 连接?

Jin*_*ter 10

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

"Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }
Run Code Online (Sandbox Code Playgroud)

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

  • ASP.NET 核心服务器
    1. 删除app.UseHttpsRedirection()app.UseHsts()StartUp类中ConfigureServices(IApplicationBuilder app)
    2. 在开发过程中暴露不安全的端口,通常是 80 或 5000。
    3. 使用下面的代码在 .NET Framework 客户端中创建不安全的通道。
var channel = new Channel("localhost", 5000, ChannelCredentials.Insecure);
Run Code Online (Sandbox Code Playgroud)

安全 SSL 连接 .NET Framework Client + ASP.NET Core Server

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

var channel = new Channel("localhost", 5000, ChannelCredentials.Insecure);
Run Code Online (Sandbox Code Playgroud)

一点解释。VS 2019 中的 ASP.NETCore 模板使用带有 pfx 文件的开发证书位于%AppData%\ASP.NET\Https\ProjectName.pfx. 证书的密码将在 %AppData%\Microsoft\UserSecrets\{UserSecretsId}\secrets.json 您可以UserSecretsIdProjectName.csproj. 对于每个 ASP.NET Core 项目,这将有所不同。

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

openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -nokeys -out "<TargetLocation>\certifcate.pem"
Run Code Online (Sandbox Code Playgroud)

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

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

Run Code Online (Sandbox Code Playgroud)

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

生产场景

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

使用自签名证书

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

使用gRPC 目标名称覆盖键来覆盖 ssl 目标名称验证。

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

Run Code Online (Sandbox Code Playgroud)


Gop*_*dar 6

您可以通过 config 在不安全上配置 .Net core grpc 服务器

有2种方式,

启动设置,json

{
  "profiles": {
    "DemoService": {
      "commandName": "Project",
      "launchBrowser": false,
      "applicationUrl": "http://localhost:5001",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或者

应用程序设置,json

"Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    },
    "EndPoints": {
      "Http": {
        "Url": "http://localhost:5001"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)