如何从运行 .NET 4.7.2 的 WPF 访问 gRPC 服务?

Ron*_*man 2 .net c# wpf grpc asp.net-core

我在 .NET Core 中创建了一个 gRPC 服务,需要从在 .NET 4.7.2 上运行的旧版 WPF 应用程序使用它。现有的 WPF 应用程序非常庞大,无法立即转换为 .NET Core,仅仅使用 gRPC 付出的努力是不值得的。我的问题是,有没有办法使用 .NET 4.7.2 WPF 中的 gRPC 服务?

Jan*_*anW 5

我终于为这个问题找到了一个可行的解决方案:

  • Asp .NET Core 3.1 Server(使用新的 grpc-dotnet 包)和
  • .NET Framework 4.7.2 WPF-Client(使用旧的 C 包装器 grpc 包)

主要问题是找到一种解决方案来接受来自远程客户端的自签名 SSL 服务器证书,这对于我们的场景是必需的。

服务器使用此处提供的解决方案获取生成的证书(解决方案也适用于任何有效证书):https : //gist.github.com/mivano/356d4f0354d997370e3c2e62809cdeef

  • 将主题/友好名称调整为更有意义的内容
  • 将 DnsName 调整为服务器的 IP 或主机名(客户端使用)
  • 将 NotAfter 调整为所需的结束日期
  • 调整后的 $pfxPassword

这里要提的重要一点:服务器的 DNS 或 IP 由客户端验证,因此它必须是证书的一部分。

gRPC 服务器是这样配置的(也可以通过 .appsettings.json 实现):

 webBuilder.ConfigureKestrel(
    options =>
    {
        options.Listen(
            IPAddress.Any,
            <your port>,
            listenOptions =>
            {
                listenOptions.UseHttps("<your.pfx path>", "<your passphrase>");
                listenOptions.Protocols = HttpProtocols.Http2;
            });
    });
Run Code Online (Sandbox Code Playgroud)

gRPC 客户端:

  • 从您的 .pfx 创建一个 .pem 文件(使用 openssl):

openssl pkcs12 -in "<pfx path>.pfx" -out "<pem path>.pem" -clcerts

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

  • 读取客户端中的 .pem 文件并将其用于 gRPC 通道:

渠道:

var channelCredentials = new SslCredentials(
    File.ReadAllText("<path to pem>.pem"), null, verifyPeerCallback => true);
var serviceChannel = new Channel("<DnsName from cert", <port>, channelCredentials);
var serviceProxy = new GrpcService.GrpcServiceClient(serviceChannel );
Run Code Online (Sandbox Code Playgroud)

客户端还可以实现为使用带有适当 HttpClientHandler 和附加 ServerCerifacteCustomValidationCallback 的常规 HttpClient.Get 从服务器动态下载证书。在创建服务通道之前,必须在内存中创建 pem:https : //github.com/grpc/grpc/issues/8978#issuecomment-283469676