.NET 構成のための gRPC

Note

これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

警告

このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、「.NET および .NET Core サポート ポリシー」を参照してください。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

重要

この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

現在のリリースについては、この記事の .NET 8 バージョンを参照してください。

サービス オプションを構成する

gRPC サービスは、Startup.csAddGrpc によって構成されます。 構成オプションは、Grpc.AspNetCore.Server パッケージに含まれています。

次の表では、gRPC サービスを構成するためのオプションについて説明します。

オプション 既定値 説明
MaxSendMessageSize null サーバーから送信できる最大メッセージ サイズ (バイト単位)。 構成された最大メッセージ サイズを超えるメッセージを送信しようとすると、例外が発生します。 null に設定する場合、メッセージ サイズは制限されません。
MaxReceiveMessageSize 4 MB サーバーで受信できる最大メッセージ サイズ (バイト単位)。 サーバーでこの制限を超えるメッセージを受信すると、例外がスローされます。 この値を大きくすると、サーバーはより大きなメッセージを受け取れますが、メモリの消費に悪影響を与える可能性があります。 null に設定する場合、メッセージ サイズは制限されません。
EnableDetailedErrors false true の場合、サービス メソッドで例外がスローされると、詳細な例外メッセージがクライアントに返されます。 既定値は、false です。 EnableDetailedErrorstrue に設定すると、機密情報が漏洩する可能性があります。
CompressionProviders gzip メッセージの圧縮と圧縮解除に使用される圧縮プロバイダーのコレクション。 カスタム圧縮プロバイダーを作成し、コレクションに追加することができます。 既定で構成されているプロバイダーは、gzip 圧縮をサポートしています。
ResponseCompressionAlgorithm null サーバーから送信されるメッセージの圧縮に使用される圧縮アルゴリズム。 このアルゴリズムは、CompressionProviders の圧縮プロバイダーと一致している必要があります。 アルゴリズムで応答を圧縮するには、そのアルゴリズムをサポートしていることをクライアントが grpc-accept-encoding ヘッダーで送信することによって、そのことを示す必要があります。
ResponseCompressionLevel null サーバーから送信されるメッセージの圧縮に使用される圧縮レベル。
Interceptors None 各 gRPC 呼び出しで実行されるインターセプターのコレクション。 インターセプターは、登録されている順序で実行されます。 グローバルに構成されたインターセプターは、1 つのサービスに対してインターセプターが構成される前に実行されます。

インターセプターには、既定により要求ごとの有効期間があります。 インターセプターのコンストラクターが呼び出されると、依存関係の挿入 (DI) からパラメーターが解決されます。 インターセプター型を DI に登録して、その作成方法と有効期間をオーバーライドすることもできます。

インターセプターは、ASP.NET Core ミドルウェアと同様の機能を提供します。 詳細については、「gRPC インターセプターとミドルウェア」を参照してください。
IgnoreUnknownServices false true の場合、不明なサービスおよびメソッドへの呼び出しでは true 状態は返されず、要求は ASP.NET Core に登録された次のミドルウェアに渡されます。

Startup.ConfigureServicesAddGrpc 呼び出しに対して options デリゲートを指定することで、すべてのサービスに対してオプションを構成できます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.EnableDetailedErrors = true;
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

1 つのサービスのオプションは、AddGrpc で提供されるグローバル オプションをオーバーライドします。また、AddServiceOptions<TService> を使用して構成することができます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc().AddServiceOptions<MyService>(options =>
    {
        options.MaxReceiveMessageSize = 2 * 1024 * 1024; // 2 MB
        options.MaxSendMessageSize = 5 * 1024 * 1024; // 5 MB
    });
}

サービス インターセプターには、既定により要求ごとの有効期間があります。 インターセプター型を DI に登録すると、インターセプターの作成方法とその有効期間がオーバーライドされます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc(options =>
    {
        options.Interceptors.Add<LoggingInterceptor>();
    });
    services.AddSingleton<LoggingInterceptor>();
}

ASP.NET Core サーバー オプション

Grpc.AspNetCore.Server は、ASP.NET Core Web サーバーによってホストされます。 ASP.NET Core サーバーには、さまざまなオプションがあります (Kestrel、IIS、HTTP.sys など)。 各サーバーには、HTTP 要求の処理方法として追加のオプションが用意されています。

ASP.NET Core アプリで使用されるサーバーは、アプリのスタートアップ コードで構成されます。 既定のサーバーは、Kestrel です。

各種のサーバーおよびそれらの構成オプションについては、以下を参照してください。

クライアント オプションを構成する

gRPC のクライアント構成は GrpcChannelOptions で設定されます。 構成オプションは、Grpc.Net.Client パッケージに含まれています。

次の表では、gRPC チャネルを構成するためのオプションについて説明します。

オプション 既定値 説明
HttpHandler 新しいインスタンス gRPC 呼び出しを行うために使用される HttpMessageHandler。 カスタム HttpClientHandler を構成したり、gRPC 呼び出しの HTTP パイプラインに追加のハンドラーを加えたりするために、クライアントを設定できます。 HttpMessageHandler が指定されていない場合、自動廃棄のチャネルのために新しい HttpClientHandler インスタンスが作成されます。
HttpClient null gRPC 呼び出しを行うために使用される HttpClient。 この設定は、HttpHandler に代わる方法です。
DisposeHttpClient false true に設定し、HttpMessageHandler または HttpClient が指定されている場合、GrpcChannel が廃棄されたときに (該当する) HttpHandler または HttpClient が廃棄されます。
LoggerFactory null gRPC 呼び出しに関する情報をログに記録するため、クライアントによって使用される LoggerFactoryLoggerFactory インスタンスは、依存関係の挿入から解決することも、LoggerFactory.Create を使用して作成することもできます。 ログの構成の例については、「.NET での gRPC のログ記録と診断」を参照してください。
MaxSendMessageSize null クライアントから送信できる最大メッセージ サイズ (バイト単位)。 構成された最大メッセージ サイズを超えるメッセージを送信しようとすると、例外が発生します。 null に設定する場合、メッセージ サイズは制限されません。
MaxReceiveMessageSize 4 MB クライアントで受信できる最大メッセージ サイズ (バイト単位)。 クライアントでこの制限を超えるメッセージを受信すると、例外がスローされます。 この値を大きくすると、クライアントはより大きなメッセージを受け取れますが、メモリの消費に悪影響を与える可能性があります。 null に設定する場合、メッセージ サイズは制限されません。
Credentials null ChannelCredentials のインスタンス。 資格情報は、認証メタデータを gRPC 呼び出しに追加するために使用します。
CompressionProviders gzip メッセージの圧縮と圧縮解除に使用される圧縮プロバイダーのコレクション。 カスタム圧縮プロバイダーを作成し、コレクションに追加することができます。 既定で構成されているプロバイダーは、gzip 圧縮をサポートしています。
ThrowOperationCanceledOnCancellation false true に設定されている場合、呼び出しが取り消されたとき、または期限を超えたときに、クライアントから OperationCanceledException がスローされます。
UnsafeUseInsecureChannelCallCredentials false true に設定されている場合、セキュリティで保護されていないチャネルによって行われた gRPC 呼び出しに CallCredentials が適用されます。 セキュリティで保護されていない接続を経由した認証ヘッダーの送信はセキュリティに影響を及ぼすため、運用環境では実行しないでください。
MaxRetryAttempts 5 最大再試行回数。 サービス構成で指定されている再試行回数と Hedging 試行回数が、この値によって制限されます。この値のみを設定しても、再試行は行われません。 再試行は、サービス構成で有効となり、ServiceConfig を使用して実行されます。 null 値を指定すると、最大再試行回数の制限が解除されます。 再試行の詳細については、「gRPC の再試行による一時的障害の処理」を参照してください。
MaxRetryBufferSize 16 MB 再試行、または Hedging 呼び出しを実行するときに、送信済みメッセージを格納するために使用することができる、バイト単位の最大バッファー サイズ。 バッファーの制限を超過した場合、再試行はそれ以上実行されず、すべての Hedging 呼び出しは 1 回を除いてすべてキャンセルされます。 この制限は、チャネルを使用して実行されるすべての呼び出しに対して適用されます。 null 値を指定すると、再試行の最大バッファー サイズの制限が解除されます。
MaxRetryBufferPerCallSize 1 MB 再試行、または Hedging 呼び出しを実行するときに、送信済みメッセージを格納するために使用することができる、バイト単位の最大バッファー サイズ。 バッファーの制限を超過した場合、再試行はそれ以上実行されず、すべての Hedging 呼び出しは 1 回を除いてすべてキャンセルされます。 この制限は、1 回の呼び出しに適用されます。 null 値を指定すると、呼び出し 1 回あたりの、再試行の最大バッファー サイズの制限が解除されます。
ServiceConfig null gRPC チャネルのサービス構成。 サービス構成を使用すると、gRPC の再試行を構成することができます。

コード例を次に示します。

  • チャネルで送受信する最大メッセージ サイズを設定します。
  • クライアントを作成します。
static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
    {
        MaxReceiveMessageSize = 5 * 1024 * 1024, // 5 MB
        MaxSendMessageSize = 2 * 1024 * 1024 // 2 MB
    });
    var client = new Greeter.GreeterClient(channel);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

クライアントのインターセプターは GrpcChannelOptions を使用せずに構成されていることに注意してください。 クライアントのインターセプターは、チャンネルの拡張メソッド Intercept を使用して構成されています。 この拡張メソッドは Grpc.Core.Interceptors 名前空間に存在します。

static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var callInvoker = channel.Intercept(new LoggingInterceptor());
    var client = new Greeter.GreeterClient(callInvoker);

    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
}

System.Net handler オプション

Grpc.Net.Client では、HttpMessageHandler から派生した HTTP トランスポートを使用して、HTTP 要求を行います。 各ハンドラーには、HTTP 要求を行うための追加のオプションが用意されています。

ハンドラーはチャネル上で構成され、GrpcChannelOptions.HttpHandler を設定することによってオーバーライドできます。 既定では、.NET Core 3 と、.NET 5 またはそれ以降で SocketsHttpHandler が使用されます。 .NET Framework 上の gRPC クライアントアプリでは、WinHttpHandler を構成する必要があります

各種のハンドラーおよびそれらの構成オプションについては、以下を参照してください。

その他のリソース