.NET 構成のための gRPC
Note
これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。
警告
このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、「.NET および .NET Core サポート ポリシー」を参照してください。 現在のリリースについては、この記事の .NET 8 バージョンを参照してください。
重要
この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
現在のリリースについては、この記事の .NET 8 バージョンを参照してください。
サービス オプションを構成する
gRPC サービスは、Startup.cs
の AddGrpc
によって構成されます。 構成オプションは、Grpc.AspNetCore.Server
パッケージに含まれています。
次の表では、gRPC サービスを構成するためのオプションについて説明します。
オプション | 既定値 | 説明 |
---|---|---|
MaxSendMessageSize |
null |
サーバーから送信できる最大メッセージ サイズ (バイト単位)。 構成された最大メッセージ サイズを超えるメッセージを送信しようとすると、例外が発生します。 null に設定する場合、メッセージ サイズは制限されません。 |
MaxReceiveMessageSize |
4 MB | サーバーで受信できる最大メッセージ サイズ (バイト単位)。 サーバーでこの制限を超えるメッセージを受信すると、例外がスローされます。 この値を大きくすると、サーバーはより大きなメッセージを受け取れますが、メモリの消費に悪影響を与える可能性があります。 null に設定する場合、メッセージ サイズは制限されません。 |
EnableDetailedErrors |
false |
true の場合、サービス メソッドで例外がスローされると、詳細な例外メッセージがクライアントに返されます。 既定値は、false です。 EnableDetailedErrors を true に設定すると、機密情報が漏洩する可能性があります。 |
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.ConfigureServices
の AddGrpc
呼び出しに対して 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 です。
各種のサーバーおよびそれらの構成オプションについては、以下を参照してください。
- ASP.NET Core の Kestrel Web サーバー
- ASP.NET Core での HTTP.sys Web サーバーの実装
- IIS を使用した Windows での ASP.NET Core のホスト
クライアント オプションを構成する
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 呼び出しに関する情報をログに記録するため、クライアントによって使用される LoggerFactory 。 LoggerFactory インスタンスは、依存関係の挿入から解決することも、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 を構成する必要があります。
各種のハンドラーおよびそれらの構成オプションについては、以下を参照してください。
その他のリソース
ASP.NET Core