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

21

我按照下面网址的说明:

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

使用 .NET Core 创建了 gRPC 服务和客户端,一切都很顺利。

接下来,我需要让遗留的 .NET Framework 应用程序访问该服务。我找到了一些 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 示例项目方面有没有什么进展? - IronMan
3
我基于 .Net Core 中的 Greeter 创建了一个服务和客户端。但是我在 .Net Framework 中找不到类似的东西。 - Rich Shipley
请查看此项目,目标为 .net 4.5 - https://github.com/grpc/grpc/tree/master/src/csharp/Grpc.Examples.MathServer - weichch
1
我没有看到那里有一个 gRPC 客户端。 - Rich Shipley
.NET框架的grpc客户端是否可以在Win11上运行?我在https://learn.microsoft.com/en-us/aspnet/core/grpc/supported-platforms?view=aspnetcore-6.0#net-grpc-client-requirements中看到了这个要求。 - Prabhakaran Rajagopal
显示剩余4条评论
2个回答

12

无论是否使用SSL,您都需要在ASP.NET Core服务器上启用Http2。因此,在appsettings.json中进行以下操作。

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

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

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

安全的SSL连接:.NET框架客户端+ASP.NET Core服务器

我已经使用相同的服务器证书(以.pem格式)在客户端上实现了SSL端口连接。

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


一些解释。VS2019中的ASP.NET Core模板使用位于%AppData%\ASP.NET\Https\ProjectName.pfx的pfx文件带有开发证书。 证书的密码可在%AppData%\Microsoft\UserSecrets\{UserSecretsId}\secrets.json中找到。 您可以从ProjectName.csproj获取UserSecretsId id,每个ASP.NET Core项目都不同。
我们只需要证书公钥作为certificate.pem文件以安全地通过gRPC进行通信。请使用以下命令从pfx中提取publickey。
openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -nokeys -out "<TargetLocation>\certifcate.pem"

复制此{{certificate.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服务器和.NET Framework客户端中的pfx和pem。
使用自签名证书是大多数在我们自己的微服务之间通信的微服务的有效选项。我们可能不需要一个授权签名的证书。使用自签名证书可能面临的一个问题是,证书可能被颁发给某个目标DNS名称,而我们的gRPC服务器可能正在其他位置运行,无法建立安全连接。
使用gRPC目标名称覆盖键来覆盖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);


1
我找到了一种方法,无需在客户端存储pem,也许对其他人有用:https://dev59.com/w7bna4cB1Zd3GeqPdJJI#66041094 - rene_r
我只能使用这种不安全的方式调用服务,使用客户端上的证书无法工作。 - schh
我的回答中有一个不安全的部分和一个安全的部分。@schh,请完整阅读。 - Jins Peter
现在我已经让它能够同时支持安全和非安全模式,使用了一个核心客户端和.NET框架客户端。我从头重新生成了自签名证书,现在一切正常了。谢谢。 - schh
@NeWi-SL,回答你的问题,Channel类来自Grpc.Core,该库已进入维护模式,并将于2022年5月被弃用。 - Jins Peter
显示剩余2条评论

9

您可以通过配置来在未加密的情况下配置 .Net Core GRPC 服务器。

有两种方式:

launchSettings.json

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

appsettings.json

或者

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接