.NET Standard 2.0 での gRPC クライアントの使用

作成者: James Newton-King

この記事では、.NET Standard 2.0 をサポートする .NET 実装で .NET gRPC クライアントを使用する方法について説明します。

.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 の構成

HTTP プロバイダーは GrpcChannelOptions.HttpHandler を使用して構成する必要があります。 ハンドラーが構成されていない場合、エラーがスローされます。

System.PlatformNotSupportedException: gRPC over HTTP/2 をサポートしていない .NET 実装で RPC 呼び出しを正常に行うには、gRPC に追加の構成が必要です。 HTTP プロバイダーは GrpcChannelOptions.HttpHandler を使用して指定する必要があります。 構成した HTTP プロバイダーでは、HTTP/2 をサポートするか、gRPC-Web を使用するように構成する必要があります。

UWP、Xamarin、Unity など、HTTP/2 をサポートしていない .NET 実装では、代わりに 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 サーバー実装では、gRPC-Web をサポートするためにプロキシが必要です。

.NET Framework

.NET Framework では gRPC over HTTP/2 を制限付きでサポートしています。 .NET Framework で gRPC over HTTP/2 を有効にするには、WinHttpHandler を使用するようにチャネルを構成してください。

WinHttpHandler を使用するための要件と制限事項を以下に示します。

  • Windows 11 以降、Windows Server 2019 以降。
    • gRPC クライアントは、Windows 11 以降で完全にサポートされています。
    • gRPC クライアントは、Windows Server 2019 と Windows Server 2022 で部分的にサポートされています。 単項およびサーバー ストリーミング方法がサポートされています。 クライアントと双方向ストリーミングのメソッドはサポートされていません
  • 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 のサポート対象外です。
  • メンテナンス モードになっていて非推奨となります。.NET 用 gRPC が優先されます。
  • 新しいアプリにはお勧めしません。

その他の技術情報