搭配 .NET Standard 2.0 使用 gRPC 用戶端
注意
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
本文討論如何使用 .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 需要額外的設定,才能在不支援透過 HTTP/2 的 gRPC 的 .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 用戶端處理站 來建立用戶端。 HTTP 提供者是使用 ConfigurePrimaryHttpMessageHandler 擴充方法來設定。
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 伺服器實作需要 Proxy 才能支援 gRPC-Web。
.NET Framework
.NET Framework 對透過 HTTP/2 的 gRPC 的支援有限。 若要在 .NET Framework 上啟用透過 HTTP/2 的 gRPC,請將通道設定為使用 WinHttpHandler。
使用 WinHttpHandler
的需求和限制:
- Windows 11 或更新版本、Windows Server 2019 或更新版本。
- Windows 11 或更新版本完全支援 gRPC 用戶端。
- Windows 伺服器 2019 和 Windows 伺服器 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# core-library
.NET Framework 和 Xamarin 的替代選項是使用 gRPC C# core-library 進行 gRPC 呼叫。 gRPC C# core-library 為:
- 支援在 .NET Framework 和 Xamarin 上透過 HTTP/2 進行 gRPC 呼叫的第三方程式庫。
- Microsoft 不支援。
- 處於維護模式,並將取代為 .NET 的 gRPC。
- 不建議用於新的應用程式。