Note
これは、この記事の最新バージョンではありません。 現在のリリースについては、 この記事の .NET 10 バージョンを参照してください。
Warning
このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、 この記事の .NET 10 バージョンを参照してください。
基になるスタックの実装のため、C-core ベースの gRPC アプリと .NET 用 gRPC の間ですべての機能が同じように動作するわけではありません。 このドキュメントでは、2 つのスタック間で移行する場合の主な違いについて説明します。
Important
gRPC C-core は、メンテナンス モードになっていて、非推奨となります。 .NET 用 gRPC が優先されます。 gRPC C-core は新しいアプリにはお勧めしません。
プラットフォームのサポート
gRPC C-core と .NET 用 gRPC のプラットフォーム サポートは異なります。
-
gRPC C-core: 独自の TLS および HTTP/2 スタックを備えた C++ gRPC 実装。
Grpc.Coreパッケージは、gRPC C-core の .NET ラッパーで、gRPC クライアントとサーバーを含みます。 .NET Framework、.NET Core、および .NET 5 以降がサポートされます。 -
.NET 用 gRPC: .NET Core 3.x および .NET 5 以降向けに設計されています。 最新の .NET リリースに組み込まれている TLS および HTTP/2 スタックを使用します。
Grpc.AspNetCoreパッケージには、ASP.NET Core でホストされ、.NET Core 3.x または .NET 5 以降を必要とする gRPC サーバーが含まれます。Grpc.Net.Clientパッケージには、gRPC クライアントが含まれます。Grpc.Net.Clientのクライアントでは、WinHttpHandler を使用した .NET Framework のサポートが制限されています。
詳細については、「.NET での gRPC でサポートされているプラットフォーム」を参照してください。
サーバーとチャネルを構成する
gRPC C-Core から gRPC for .NET に移行する場合は、NuGet パッケージ、構成、スタートアップ コードを変更する必要があります。
gRPC for .NET には、クライアントとサーバー用に個別の NuGet パッケージがあります。 追加するパッケージは、アプリで gRPC サービスをホストしているか、呼び出しているかによって異なります。
-
Grpc.AspNetCore: サービスは ASP.NET Core によってホストされています。 サーバーの構成情報については、「ASP.NET Core を使用した gRPC サービス」を参照してください。 -
Grpc.Net.Client: クライアントはGrpcChannelを使います。内部的には、.NET に組み込まれたネットワーク機能を使います。 クライアントの構成情報については、「.NET クライアントを使用して gRPC サービスを呼び出す」を参照してください。
移行が完了したら、アプリから Grpc.Core パッケージを削除する必要があります。
Grpc.Core には大きなネイティブ バイナリが含まれているため、パッケージを削除すると、NuGet の復元時間とアプリ サイズを減らすことができます。
コードによって生成されるサービスとクライアント
gRPC C-Core と gRPC for .NET は多くの API を共有しており、.proto ファイルから生成されたコードは両方の gRPC 実装と互換性があります。 ほとんどのクライアントとサービスは、C-Core から gRPC for .NET に変更することなく移行できます。
gRPC サービス実装の有効期間
ASP.NET Core スタックでは、既定で gRPC サービスは、スコープが設定された有効期間で作成されます。 これに対し、gRPC C-core は、既定で、シングルトン有効期間でサービスにバインドされます。
スコープが設定された有効期間により、サービス実装では、スコープが設定された有効期間を持つその他のサービスを解決できます。 たとえば、スコープが設定された有効期間では、コンストラクター インジェクションによって DI コンテナーから DbContext を解決することもできます。 スコープが設定された有効期間の使用:
- サービス実装の新しいインスタンスが、要求ごとに作成されます。
- 実装型のインスタンス メンバーを介して、要求間で状態を共有することはできません。
- シングルトン サービスでの共有状態は、DI コンテナーに格納することが期待されます。 格納された共有状態は、gRPC サービス実装のコンストラクターで解決されます。
サービスの有効期間の詳細については、「ASP.NET Core での依存関係の挿入」を参照してください。
シングルトン サービスの追加
gRPC C-core 実装から ASP.NET Core への移行を容易にするために、サービス実装のサービス有効期間をスコープからシングルトンに変更することができます。 これには、サービス実装のインスタンスを DI コンテナーに追加する必要があります。
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
services.AddSingleton(new GreeterService());
}
ただし、シングルトン有効期間を持つサービス実装では、コンストラクター インジェクションによって、スコープ設定されたサービスを解決できなくなります。
gRPC サービス オプションの構成
C-core ベースのアプリでは、grpc.max_receive_message_length や grpc.max_send_message_length などの設定は、ChannelOption時に で構成します。
ASP.NET Core では、gRPC で GrpcServiceOptions 型による構成を提供しています。 たとえば、gRPC サービスの最大受信メッセージ サイズは、AddGrpc を使用して構成できます。 次の例では、既定の MaxReceiveMessageSize を 4 MB から 16 MB に変更しています。
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc(options =>
{
options.MaxReceiveMessageSize = 16 * 1024 * 1024; // 16 MB
});
}
構成の詳細については、「.NET 用 gRPC の構成」を参照してください。
Logging
C-core ベースのアプリでは、デバッグ目的でGrpcEnvironmentために に依存しています。 ASP.NET Core スタックでは、ロギング API によってこの機能を提供しています。 たとえば、ロガーを gRPC サービスに追加できます。
コンストラクターの挿入:
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
}
プライマリ コンストラクターの挿入 (.NET 8 以降):
public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
...
}
gRPC のログ記録と診断の詳細については、「.NET での gRPC のログ記録と診断」を参照してください。
HTTPS
C-core ベースのアプリでは、Server. Ports プロパティを使用して HTTPS を構成します。 同様の概念は、ASP.NET Core でサーバーを構成するために使用されます。 たとえば、Kestrel では、この機能のためにエンドポイント構成を使用します。
C-core ベースのアプリでは、Server. Ports プロパティを使用して HTTPS を構成します。 同様の概念は、ASP.NET Core でサーバーを構成するために使用されます。 たとえば、Kestrel では、この機能のためにエンドポイント構成を使用します。
gRPC インターセプター
ASP.NET Core ミドルウェアは、C-core ベースの gRPC アプリのインターセプターと比較して、同様の機能を提供します。 ASP.NET Core gRPC アプリではどちらもサポートされるため、インターセプターを書き直す必要はありません。
これらの機能の比較については、「gRPC インターセプターとミドルウェア」を参照してください。
non-ASP.NET Core プロジェクトで gRPC をホストする
C-core ベースのサーバーは、任意のプロジェクト タイプに追加できます。 .NET 用 gRPC サーバーには ASP.NET Core が必要です。 プロジェクト ファイルによって SDK として Microsoft.NET.SDK.Web が指定されているため、通常 ASP.NET Core は使用可能です。
プロジェクトに <FrameworkReference Include="Microsoft.AspNetCore.App" /> を追加すると、ASP.NET Core 以外のプロジェクトに gRPC サーバーをホストできます。 フレームワーク参照によって ASP.NET Core API が使用可能になり、ASP.NET Core サーバーを起動するために使用できます。
詳細については、「non-ASP.NET Core プロジェクトで gRPC をホストする」を参照してください。
その他のリソース
ASP.NET Core