将 gRPC 客户端与 .NET Standard 2.0 一起使用

作者:James Newton-King

本文介绍如何将 .NET gRPC 客户端与支持 .NET Standard 2.0 的 .NET 实现一起使用。

.NET 实现

以下 .NET 实现(或更高版本)支持 Grpc.Net.Client,但不完全支持 HTTP/2:

  • .NET Core 2.1
  • .NET Framework 4.6.1
  • Mono 5.4
  • Xamarin.iOS 10.14
  • Xamarin.Android 8.0
  • 通用 Windows 平台 10.0.16299
  • Unity 2018.1

.NET gRPC 客户端可以通过一些其他配置从这些 .NET 实现中调用服务。

HttpHandler 配置

必须使用 GrpcChannelOptions.HttpHandler 配置 HTTP 提供程序。 如果未配置处理程序,则会引发错误:

System.PlatformNotSupportedException:gRPC 需进行额外的配置才能在不支持 gRPC over HTTP/2 的 .NET 实现上成功进行 RPC 调用。 必须使用 GrpcChannelOptions.HttpHandler 指定 HTTP 提供程序。 配置的 HTTP 提供程序必须支持 HTTP/2 或配置为使用 gRPC-Web。

不支持 HTTP/2 的 .NET 实现(例如 UWP、Xamarin 和 Unity)可以改为使用 gRPC-Web。

var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        HttpHandler = new GrpcWebHandler(new HttpClientHandler())
    });

var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(new HelloRequest { Name = ".NET" });

也可以使用 gRPC 客户端工厂创建客户端。 使用 ConfigurePrimaryHttpMessageHandler 扩展方法配置 HTTP 提供程序。

builder.Services
    .AddGrpcClient<Greet.GreeterClient>(options =>
    {
        options.Address = new Uri("https://localhost:5001");
    })
    .ConfigurePrimaryHttpMessageHandler(
        () => new GrpcWebHandler(new HttpClientHandler()));

有关详细信息,请参阅使用 .Net gRPC 客户端配置 gRPC-Web

重要

gRPC-Web 要求客户端和服务器支持它。gRPC-Web 可由 ASP.NET Core gRPC 服务器快速配置。 其他 gRPC 服务器实现需要代理来支持 gRPC-Web。

.NET Framework

.NET Framework 对 gRPC over HTTP/2 的支持有限。 若要在 .NET Framework 上启用 gRPC over HTTP/2,请将该通道配置为使用 WinHttpHandler

使用 WinHttpHandler 的要求和限制:

  • Windows 11 或更高版本、Windows Server 2019 或更高版本。
    • Windows 11 或更高版本完全支持 gRPC 客户端。
    • Windows Server 2019 和 Windows Server 2022 上可部分支持 gRPC 客户端。 支持一元流式处理方法和服务器流式处理方法。 不支持客户端流式处理和双向流式处理方法。
  • System.Net.Http.WinHttpHandler 版本 6.0.1 或更高版本的引用。
  • 使用 GrpcChannelOptions.HttpHandler 在通道上配置 WinHttpHandler
  • .NET Framework 4.6.1 或更高版本。
  • 仅支持通过 TLS 进行 gRPC 调用。
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        HttpHandler = new WinHttpHandler()
    });

var client = new Greeter.GreeterClient(channel);
var response = await client.SayHelloAsync(new HelloRequest { Name = ".NET" });

gRPC C# 核心库

对于 .NET Framework 和 Xamarin,已选择使用 gRPC C# 核心库进行 gRPC 调用。 gRPC C# 核心库是:

  • 第三方库,支持在 .NET Framework 和 Xamarin 上通过 HTTP/2 进行 gRPC 调用。
  • Microsoft 不支持。
  • 在维护模式下,并将被弃用而改为使用 gRPC for .NET
  • 不建议用于新应用。

其他资源