将 gRPC 客户端与 .NET Standard 2.0 一起使用
注意
此版本不是本文的最新版本。 对于当前版本,请参阅此文的 .NET 8 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本。
本文介绍如何将 .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。
- 不建议用于新应用。