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

标签 c# .net 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:) 连接?

最佳答案

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

"Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }
不安全的 .NET Framework 客户端 + ASP.NET Core 服务器
  • ASP.NET 核心服务器
  • 删除 app.UseHttpsRedirection()app.UseHsts()StartUp类(class)ConfigureServices(IApplicationBuilder app) ;
  • 在开发过程中暴露不安全的端口,通常是 80 或 5000。
  • 使用下面的代码在 .NET Framework 客户端中创建不安全的 channel 。

  • 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 中提供。
    您可以获得 UserSecretsId来自 ProjectName.csproj 的 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 服务器和 .NET Framework 客户端中使用与 pfx 相同的证书和 pem分别。
    使用自签名证书
    对于大多数在我们自己的微服务之间进行通信的微服务,使用自签名证书是一个有效的选择。我们可能不需要权威机构签署的证书。我们在使用自签名证书时可能面临的一个问题是,该证书可能会颁发给某个目标 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);
    
    

    关于c# - 如何在 .NET Framework 中创建 gRPC 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60766836/

    相关文章:

    c# - 通用线性插值器 : how to cope with DateTime?

    c# - 如何仅使用 C# 获取 SQL Server 数据库中的表列表以及主键?

    .net - 如何通过.NET Framework源代码进行调试?

    C# - 用下划线和字母替换每个大写字母

    NestJS gRPC 空返回

    c# - Windows Phone 8 中的 Websockets 客户端支持

    c# - 需要使用 func 理解下面的代码

    c# - 如何通过契约(Contract)定义 IEnumerable 行为?

    authentication - 使用 gRPC 实现用户身份验证

    go - 在 go AuthFromMD 中,始终期望将授权作为 header 名称。我怎样才能覆盖它。