チュートリアル: ASP.NET Core で gRPC のクライアントとサーバーを作成する

このチュートリアルでは、.NET Core gRPC クライアントと ASP.NET Core gRPC サーバーを作成する方法を紹介します。 最終的に、gRPC あいさつサービスと通信する gRPC クライアントが与えられます。

このチュートリアルでは、次の作業を行いました。

  • gRPC サービスを作成する。
  • gRPC クライアントを作成します。
  • gRPC あいさつサービスで gRPC クライアントをテストします。

前提条件

gRPC サービスの作成

  • Visual Studio 2022 を開始し、[新しいプロジェクト] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、gRPC を検索します。 [ASP.NET Core gRPC サービス] を選択してから、 [次へ] を選択します。
  • [新しいプロジェクトの構成] ダイアログで、 [プロジェクト名] に「GrpcGreeter」と入力します。 コードのコピーおよび貼り付けを行う際に名前空間が一致するように、プロジェクトに GrpcGreeter という名前を付けることが重要です。
  • [次へ] を選択します。
  • [追加情報] ダイアログで、[.NET 8.0 (長期的なサポート)] を選択し、[作成] を選択します。

サービスを実行する

  • Ctrl + F5 キーを押して、デバッガーなしで実行します。

    SSL を使用するようにプロジェクトがまだ構成されていない場合、Visual Studio に次のダイアログが表示されます。

    このプロジェクトは SSL を使用するように構成されています。ブラウザーでの SSL の警告を避けるには、IIS Express が生成した自己署名証明書を信頼することを選択します。IIS Express の SSL 証明書を信頼しますか?

    IIS Express SSL 証明書を信頼する場合、[はい] を選択します。

    次のダイアログが表示されます。

    セキュリティ警告のダイアログ

    開発証明書を信頼することに同意する場合は、 [はい] を選択します。

    Firefox ブラウザーを信頼する方法の詳細については、「Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 証明書エラー」を参照してください。

    Visual Studio:

    • Kestrel サーバーを起動します。
    • ブラウザーを起動します。
    • http://localhost:port (http://localhost:7042 など) に移動します。
      • port: ランダムに割り当てられた、アプリのポート番号。
      • localhost: ローカル コンピューターの標準的なホスト名。 localhost では、ローカル コンピューターからの Web 要求のみが処理されます。

ログには、https://localhost:<port> でリッスンしているサービスが表示されます。<port> は、プロジェクトが作成されて Properties/launchSettings.json に設定されたときに、ランダムに割り当てられるローカルホスト ポート番号です。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

Note

gRPC テンプレートはトランスポート層セキュリティ (TLS) を使用するように構成されています。 gRPC クライアントでは、HTTPS を使用してサーバーを呼び出す必要があります。 gRPC サービス localhost ポート番号は、プロジェクトが作成されて gRPC サービス プロジェクトの Properties\launchSettings.json ファイルで設定されるときにランダムに割り当てられます。

プロジェクト ファイルを確認する

GrpcGreeterプロジェクト ファイル:

  • Protos/greet.proto: Greeter gRPC が定義されています。gRPC サーバー資産を生成するために使用されます。 詳細については、「gRPC の概要」を参照してください。
  • Services フォルダー: Greeter サービスの実装が含まれています。
  • appSettings.json: Kestrel で使用されるプロトコルなどの構成データが含まれています。 詳細については、「ASP.NET Core の構成」を参照してください。
  • Program.cs。以下が含まれています。
    • gRPC サービスのエントリ ポイント。 詳細については、「ASP.NET Core の .NET 汎用ホスト」を参照してください。
    • アプリの動作を構成するコード。 詳細については、アプリの Startupに関するページを参照してください。

.NET コンソール アプリで gRPC クライアントを作成する

  • Visual Studio のインスタンスをもう 1 つ開き、[新しいプロジェクト] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、[コンソール アプリ] を選択し、[次へ] を選択します。
  • [プロジェクト名] テキスト ボックスに「GrpcGreeterClient」を入力し、 [次へ] を選択します。
  • [追加情報] ダイアログで、[.NET 8.0 (長期的なサポート)] を選択し、[作成] を選択します。

必要な NuGet パッケージの追加

gRPC クライアント プロジェクトには、次の NuGet パッケージが必要です。

  • .NET Core のクライアントを含む Grpc.Net.Client
  • Google.Protobuf。これに C# の protobuf メッセージ API が含まれています。
  • Grpc.Tools。これには protobuf ファイルの C# ツール サポートが含まれています。 ツール パッケージは実行時に不要であり、依存関係には PrivateAssets="All" のマークが付きます。

パッケージ マネージャー コンソール (PMC) または NuGet パッケージの管理を使用してパッケージをインストールします。

パッケージをインストールするための PMC オプション

  • Visual Studio で [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  • [パッケージ マネージャー コンソール] ウィンドウから cd GrpcGreeterClient を実行し、GrpcGreeterClient.csproj ファイルが含まれるフォルダーにディレクトリを変更します。

  • 次のコマンドを実行します。

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

パッケージをインストールするための [NuGet パッケージの管理] オプション

  • [ソリューション エクスプローラー]>[NuGet パッケージの管理] でプロジェクトを右クリックします。
  • [参照] タブを選択します。
  • 検索ボックスに「Grpc.Net.Client」と入力します。
  • [参照] タブから Grpc.Net.Client パッケージを選択し、 [インストール] を選択します。
  • Google.ProtobufGrpc.Tools に同じ手順を繰り返します。

greet.proto を追加する

  • gRPC クライアント プロジェクトで Protos フォルダーを作成します。

  • gRPC あいさつサービスから gRPC クライアント プロジェクトの Protos フォルダーに Protos\greet.proto ファイルをコピーします。

  • greet.proto ファイル内の名前空間を、プロジェクトの名前空間に更新します。

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj プロジェクト ファイルを編集します。

プロジェクトを右クリックし、 [プロジェクト ファイルの編集] を選択します。

  • greet.proto ファイルを参照する <Protobuf> 要素で項目グループを追加します。

    <ItemGroup>
      <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
    </ItemGroup>
    

Greeter クライアントを作成する

  • クライアント プロジェクトをビルドして、GrpcGreeterClient 名前空間内に型を作成します。

Note

GrpcGreeterClient 型は、ビルド プロセスによって自動的に生成されます。 ツール パッケージ Grpc.Tools は、greet.proto ファイルに基づいて次のファイルと生成します。

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: プロトコル バッファー コード。要求メッセージと応答メッセージの種類を、設定、シリアル化、および取得します。
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 生成されたクライアント クラスを格納します。

Grpc.Tools によって自動的に生成される C# アセットの詳細については、「C# を使用した gRPC サービス」の「生成された C# アセット」を参照してください。

  • 次のコードを使用して、gRPC クライアントの Program.cs ファイルを更新します。

    using System.Threading.Tasks;
    using Grpc.Net.Client;
    using GrpcGreeterClient;
    
    // The port number must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:7042");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
    
  • 上記の強調表示されたコードでは、ローカルホスト ポート番号 7042GrpcGreeter サービス プロジェクト内の Properties/launchSettings.json で指定された HTTPS ポート番号に置き換えます。

Program.cs には、gRPC クライアントのエントリ ポイントとロジックが含まれています。

Greeter クライアントは、次の方法で作成されます。

  • gRPC サービスへの接続を作成するための情報が含まれている GrpcChannel をインスタンス化する。
  • GrpcChannel を使用して、Greeter クライアントを構築します。
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Greeter クライアントから非同期の SayHello メソッドが呼び出されます。 SayHello 呼び出しの結果が表示されます。

// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

gRPC あいさつサービスで gRPC クライアントをテストする

次の強調表示された行を追加して、appsettings.Development.json ファイルを更新します。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
      ,"Microsoft.AspNetCore.Hosting": "Information",
      "Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
    }
  }
}
  • あいさつサービスで、Ctrl+F5 キーを押して、デバッガーなしでサーバーを起動します。
  • GrpcGreeterClient プロジェクトで、Ctrl+F5 押してデバッガーなしでクライアントを起動します。

クライアントにより、その名前 GreeterClient が含まれるあいさつメッセージが、サービスに送信されます。 サービスから応答として "Hello GreeterClient" のメッセージが送信されます。 "Hello GreeterClient" の応答がコマンド プロンプトに表示されます。

Greeting: Hello GreeterClient
Press any key to exit...

gRPC サービスにより、成功した呼び出しの詳細が、コマンド プロンプトに書き込まれるログに記録されます。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

Note

この記事のコードでは、gRPC サービスをセキュリティで保護するために、ASP.NET Core HTTPS 開発証明書が必要です。 .NET gRPC クライアントが The remote certificate is invalid according to the validation procedure. または The SSL connection could not be established. というメッセージで失敗する場合、その開発証明書は信頼されていません。 この問題を解決するには、「信頼されていないか無効な証明書で gRPC サービスを呼び出す」を参照してください。

次の手順

このチュートリアルでは、.NET Core gRPC クライアントと ASP.NET Core gRPC サーバーを作成する方法を紹介します。 最終的に、gRPC あいさつサービスと通信する gRPC クライアントが与えられます。

このチュートリアルでは、次の作業を行いました。

  • gRPC サービスを作成する。
  • gRPC クライアントを作成します。
  • gRPC あいさつサービスで gRPC クライアントをテストします。

前提条件

gRPC サービスの作成

  • Visual Studio 2022 を開始し、 [新しいプロジェクトの作成] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、gRPC を検索します。 [ASP.NET Core gRPC サービス] を選択してから、 [次へ] を選択します。
  • [新しいプロジェクトの構成] ダイアログで、 [プロジェクト名] に「GrpcGreeter」と入力します。 コードのコピーおよび貼り付けを行う際に名前空間が一致するように、プロジェクトに GrpcGreeter という名前を付けることが重要です。
  • [次へ] を選択します。
  • [追加情報] ダイアログで、[.NET 6.0 (長期的なサポート)] を選択し、[作成] を選択します。

サービスを実行する

  • Ctrl + F5 キーを押して、デバッガーなしで実行します。

    SSL を使用するようにプロジェクトがまだ構成されていない場合、Visual Studio に次のダイアログが表示されます。

    このプロジェクトは SSL を使用するように構成されています。ブラウザーでの SSL の警告を避けるには、IIS Express が生成した自己署名証明書を信頼することを選択します。IIS Express の SSL 証明書を信頼しますか?

    IIS Express SSL 証明書を信頼する場合、[はい] を選択します。

    次のダイアログが表示されます。

    セキュリティ警告のダイアログ

    開発証明書を信頼することに同意する場合は、 [はい] を選択します。

    Firefox ブラウザーを信頼する方法の詳細については、「Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 証明書エラー」を参照してください。

    Visual Studio:

    • Kestrel サーバーを起動します。
    • ブラウザーを起動します。
    • http://localhost:port (http://localhost:7042 など) に移動します。
      • port: ランダムに割り当てられた、アプリのポート番号。
      • localhost: ローカル コンピューターの標準的なホスト名。 localhost では、ローカル コンピューターからの Web 要求のみが処理されます。

ログには、https://localhost:<port> でリッスンしているサービスが表示されます。<port> は、プロジェクトが作成されて Properties/launchSettings.json に設定されたときに、ランダムに割り当てられるローカルホスト ポート番号です。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

Note

gRPC テンプレートはトランスポート層セキュリティ (TLS) を使用するように構成されています。 gRPC クライアントでは、HTTPS を使用してサーバーを呼び出す必要があります。 gRPC サービス localhost ポート番号は、プロジェクトが作成されて gRPC サービス プロジェクトの Properties\launchSettings.json ファイルで設定されるときにランダムに割り当てられます。

macOS の場合、ASP.NET Core gRPC と TLS の組み合わせに対応していません。 macOS で gRPC サービスを正常に実行するには、追加の構成が必要です。 詳細については、macOS で ASP.NET Core gRPC アプリを起動できない場合に関するページを参照してください。

プロジェクト ファイルを確認する

GrpcGreeterプロジェクト ファイル:

  • Protos/greet.proto: Greeter gRPC が定義されています。gRPC サーバー資産を生成するために使用されます。 詳細については、「gRPC の概要」を参照してください。
  • Services フォルダー: Greeter サービスの実装が含まれています。
  • appSettings.json: Kestrel で使用されるプロトコルなどの構成データが含まれています。 詳細については、「ASP.NET Core の構成」を参照してください。
  • Program.cs。以下が含まれています。
    • gRPC サービスのエントリ ポイント。 詳細については、「ASP.NET Core の .NET 汎用ホスト」を参照してください。
    • アプリの動作を構成するコード。 詳細については、アプリの Startupに関するページを参照してください。

.NET コンソール アプリで gRPC クライアントを作成する

  • Visual Studio のインスタンスをもう 1 つ開き、 [新しいプロジェクトの作成] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、 [コンソール アプリケーション] を選択し、 [次へ] を選択します。
  • [プロジェクト名] テキスト ボックスに「GrpcGreeterClient」を入力し、 [次へ] を選択します。
  • [追加情報] ダイアログで、[.NET 6.0 (長期的なサポート)] を選択し、[作成] を選択します。

必要な NuGet パッケージの追加

gRPC クライアント プロジェクトには、次の NuGet パッケージが必要です。

  • .NET Core のクライアントを含む Grpc.Net.Client
  • Google.Protobuf。これに C# の protobuf メッセージ API が含まれています。
  • Grpc.Tools。これには protobuf ファイルの C# ツール サポートが含まれています。 ツール パッケージは実行時に不要であり、依存関係には PrivateAssets="All" のマークが付きます。

パッケージ マネージャー コンソール (PMC) または NuGet パッケージの管理を使用してパッケージをインストールします。

パッケージをインストールするための PMC オプション

  • Visual Studio で [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  • [パッケージ マネージャー コンソール] ウィンドウから cd GrpcGreeterClient を実行し、GrpcGreeterClient.csproj ファイルが含まれるフォルダーにディレクトリを変更します。

  • 次のコマンドを実行します。

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

パッケージをインストールするための [NuGet パッケージの管理] オプション

  • [ソリューション エクスプローラー]>[NuGet パッケージの管理] でプロジェクトを右クリックします。
  • [参照] タブを選択します。
  • 検索ボックスに「Grpc.Net.Client」と入力します。
  • [参照] タブから Grpc.Net.Client パッケージを選択し、 [インストール] を選択します。
  • Google.ProtobufGrpc.Tools に同じ手順を繰り返します。

greet.proto を追加する

  • gRPC クライアント プロジェクトで Protos フォルダーを作成します。

  • gRPC あいさつサービスから gRPC クライアント プロジェクトの Protos フォルダーに Protos\greet.proto ファイルをコピーします。

  • greet.proto ファイル内の名前空間を、プロジェクトの名前空間に更新します。

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj プロジェクト ファイルを編集します。

プロジェクトを右クリックし、 [プロジェクト ファイルの編集] を選択します。

  • greet.proto ファイルを参照する <Protobuf> 要素で項目グループを追加します。

    <ItemGroup>
      <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
    </ItemGroup>
    

Greeter クライアントを作成する

  • クライアント プロジェクトをビルドして、GrpcGreeterClient 名前空間内に型を作成します。

Note

GrpcGreeterClient 型は、ビルド プロセスによって自動的に生成されます。 ツール パッケージ Grpc.Tools は、greet.proto ファイルに基づいて次のファイルと生成します。

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: プロトコル バッファー コード。要求メッセージと応答メッセージの種類を、設定、シリアル化、および取得します。
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 生成されたクライアント クラスを格納します。

Grpc.Tools によって自動的に生成される C# アセットの詳細については、「C# を使用した gRPC サービス」の「生成された C# アセット」を参照してください。

  • 次のコードを使用して、gRPC クライアントの Program.cs ファイルを更新します。

    using System.Threading.Tasks;
    using Grpc.Net.Client;
    using GrpcGreeterClient;
    
    // The port number must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:7042");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
    
  • 上記の強調表示されたコードでは、ローカルホスト ポート番号 7042GrpcGreeter サービス プロジェクト内の Properties/launchSettings.json で指定された HTTPS ポート番号に置き換えます。

Program.cs には、gRPC クライアントのエントリ ポイントとロジックが含まれています。

Greeter クライアントは、次の方法で作成されます。

  • gRPC サービスへの接続を作成するための情報が含まれている GrpcChannel をインスタンス化する。
  • GrpcChannel を使用して、Greeter クライアントを構築します。
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Greeter クライアントから非同期の SayHello メソッドが呼び出されます。 SayHello 呼び出しの結果が表示されます。

// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

gRPC あいさつサービスで gRPC クライアントをテストする

次の強調表示された行を追加して、appsettings.Development.json ファイルを更新します。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
      ,"Microsoft.AspNetCore.Hosting": "Information",
      "Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
    }
  }
}
  • あいさつサービスで、Ctrl+F5 キーを押して、デバッガーなしでサーバーを起動します。
  • GrpcGreeterClient プロジェクトで、Ctrl+F5 押してデバッガーなしでクライアントを起動します。

クライアントにより、その名前 GreeterClient が含まれるあいさつメッセージが、サービスに送信されます。 サービスから応答として "Hello GreeterClient" のメッセージが送信されます。 "Hello GreeterClient" の応答がコマンド プロンプトに表示されます。

Greeting: Hello GreeterClient
Press any key to exit...

gRPC サービスにより、成功した呼び出しの詳細が、コマンド プロンプトに書き込まれるログに記録されます。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

Note

この記事のコードでは、gRPC サービスをセキュリティで保護するために、ASP.NET Core HTTPS 開発証明書が必要です。 .NET gRPC クライアントが The remote certificate is invalid according to the validation procedure. または The SSL connection could not be established. というメッセージで失敗する場合、その開発証明書は信頼されていません。 この問題を解決するには、「信頼されていないか無効な証明書で gRPC サービスを呼び出す」を参照してください。

次の手順

このチュートリアルでは、.NET Core gRPC クライアントと ASP.NET Core gRPC サーバーを作成する方法を紹介します。 最終的に、gRPC あいさつサービスと通信する gRPC クライアントが与えられます。

このチュートリアルでは、次の作業を行いました。

  • gRPC サービスを作成する。
  • gRPC クライアントを作成します。
  • gRPC あいさつサービスで gRPC クライアントをテストします。

前提条件

gRPC サービスの作成

  • Visual Studio 2022 を開始し、 [新しいプロジェクトの作成] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、gRPC を検索します。 [ASP.NET Core gRPC サービス] を選択してから、 [次へ] を選択します。
  • [新しいプロジェクトの構成] ダイアログで、 [プロジェクト名] に「GrpcGreeter」と入力します。 コードのコピーおよび貼り付けを行う際に名前空間が一致するように、プロジェクトに GrpcGreeter という名前を付けることが重要です。
  • [次へ] を選択します。
  • [追加情報] ダイアログで、[.NET 6.0 (長期的なサポート)] を選択し、[作成] を選択します。

サービスを実行する

  • Ctrl + F5 キーを押して、デバッガーなしで実行します。

    SSL を使用するようにプロジェクトがまだ構成されていない場合、Visual Studio に次のダイアログが表示されます。

    このプロジェクトは SSL を使用するように構成されています。ブラウザーでの SSL の警告を避けるには、IIS Express が生成した自己署名証明書を信頼することを選択します。IIS Express の SSL 証明書を信頼しますか?

    IIS Express SSL 証明書を信頼する場合、[はい] を選択します。

    次のダイアログが表示されます。

    セキュリティ警告のダイアログ

    開発証明書を信頼することに同意する場合は、 [はい] を選択します。

    Firefox ブラウザーを信頼する方法の詳細については、「Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 証明書エラー」を参照してください。

    Visual Studio:

    • Kestrel サーバーを起動します。
    • ブラウザーを起動します。
    • http://localhost:port (http://localhost:7042 など) に移動します。
      • port: ランダムに割り当てられた、アプリのポート番号。
      • localhost: ローカル コンピューターの標準的なホスト名。 localhost では、ローカル コンピューターからの Web 要求のみが処理されます。

ログには、https://localhost:<port> でリッスンしているサービスが表示されます。<port> は、プロジェクトが作成されて Properties/launchSettings.json に設定されたときに、ランダムに割り当てられるローカルホスト ポート番号です。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

Note

gRPC テンプレートはトランスポート層セキュリティ (TLS) を使用するように構成されています。 gRPC クライアントでは、HTTPS を使用してサーバーを呼び出す必要があります。 gRPC サービス localhost ポート番号は、プロジェクトが作成されて gRPC サービス プロジェクトの Properties\launchSettings.json ファイルで設定されるときにランダムに割り当てられます。

macOS の場合、ASP.NET Core gRPC と TLS の組み合わせに対応していません。 macOS で gRPC サービスを正常に実行するには、追加の構成が必要です。 詳細については、macOS で ASP.NET Core gRPC アプリを起動できない場合に関するページを参照してください。

プロジェクト ファイルを確認する

GrpcGreeterプロジェクト ファイル:

  • Protos/greet.proto: Greeter gRPC が定義されています。gRPC サーバー資産を生成するために使用されます。 詳細については、「gRPC の概要」を参照してください。
  • Services フォルダー: Greeter サービスの実装が含まれています。
  • appSettings.json: Kestrel で使用されるプロトコルなどの構成データが含まれています。 詳細については、「ASP.NET Core の構成」を参照してください。
  • Program.cs。以下が含まれています。
    • gRPC サービスのエントリ ポイント。 詳細については、「ASP.NET Core の .NET 汎用ホスト」を参照してください。
    • アプリの動作を構成するコード。 詳細については、アプリの Startupに関するページを参照してください。

.NET コンソール アプリで gRPC クライアントを作成する

  • Visual Studio のインスタンスをもう 1 つ開き、 [新しいプロジェクトの作成] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、 [コンソール アプリケーション] を選択し、 [次へ] を選択します。
  • [プロジェクト名] テキスト ボックスに「GrpcGreeterClient」を入力し、 [次へ] を選択します。
  • [追加情報] ダイアログで、[.NET 6.0 (長期的なサポート)] を選択し、[作成] を選択します。

必要な NuGet パッケージの追加

gRPC クライアント プロジェクトには、次の NuGet パッケージが必要です。

  • .NET Core のクライアントを含む Grpc.Net.Client
  • Google.Protobuf。これに C# の protobuf メッセージ API が含まれています。
  • Grpc.Tools。これには protobuf ファイルの C# ツール サポートが含まれています。 ツール パッケージは実行時に不要であり、依存関係には PrivateAssets="All" のマークが付きます。

パッケージ マネージャー コンソール (PMC) または NuGet パッケージの管理を使用してパッケージをインストールします。

パッケージをインストールするための PMC オプション

  • Visual Studio で [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  • [パッケージ マネージャー コンソール] ウィンドウから cd GrpcGreeterClient を実行し、GrpcGreeterClient.csproj ファイルが含まれるフォルダーにディレクトリを変更します。

  • 次のコマンドを実行します。

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

パッケージをインストールするための [NuGet パッケージの管理] オプション

  • [ソリューション エクスプローラー]>[NuGet パッケージの管理] でプロジェクトを右クリックします。
  • [参照] タブを選択します。
  • 検索ボックスに「Grpc.Net.Client」と入力します。
  • [参照] タブから Grpc.Net.Client パッケージを選択し、 [インストール] を選択します。
  • Google.ProtobufGrpc.Tools に同じ手順を繰り返します。

greet.proto を追加する

  • gRPC クライアント プロジェクトで Protos フォルダーを作成します。

  • gRPC あいさつサービスから gRPC クライアント プロジェクトの Protos フォルダーに Protos\greet.proto ファイルをコピーします。

  • greet.proto ファイル内の名前空間を、プロジェクトの名前空間に更新します。

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj プロジェクト ファイルを編集します。

プロジェクトを右クリックし、 [プロジェクト ファイルの編集] を選択します。

  • greet.proto ファイルを参照する <Protobuf> 要素で項目グループを追加します。

    <ItemGroup>
      <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
    </ItemGroup>
    

Greeter クライアントを作成する

  • クライアント プロジェクトをビルドして、GrpcGreeterClient 名前空間内に型を作成します。

Note

GrpcGreeterClient 型は、ビルド プロセスによって自動的に生成されます。 ツール パッケージ Grpc.Tools は、greet.proto ファイルに基づいて次のファイルと生成します。

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: プロトコル バッファー コード。要求メッセージと応答メッセージの種類を、設定、シリアル化、および取得します。
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 生成されたクライアント クラスを格納します。

Grpc.Tools によって自動的に生成される C# アセットの詳細については、「C# を使用した gRPC サービス」の「生成された C# アセット」を参照してください。

  • 次のコードを使用して、gRPC クライアントの Program.cs ファイルを更新します。

    using System.Threading.Tasks;
    using Grpc.Net.Client;
    using GrpcGreeterClient;
    
    // The port number must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:7042");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
    
  • 上記の強調表示されたコードでは、ローカルホスト ポート番号 7042GrpcGreeter サービス プロジェクト内の Properties/launchSettings.json で指定された HTTPS ポート番号に置き換えます。

Program.cs には、gRPC クライアントのエントリ ポイントとロジックが含まれています。

Greeter クライアントは、次の方法で作成されます。

  • gRPC サービスへの接続を作成するための情報が含まれている GrpcChannel をインスタンス化する。
  • GrpcChannel を使用して、Greeter クライアントを構築します。
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Greeter クライアントから非同期の SayHello メソッドが呼び出されます。 SayHello 呼び出しの結果が表示されます。

// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

gRPC あいさつサービスで gRPC クライアントをテストする

  • あいさつサービスで、Ctrl+F5 キーを押して、デバッガーなしでサーバーを起動します。
  • GrpcGreeterClient プロジェクトで、Ctrl+F5 押してデバッガーなしでクライアントを起動します。

クライアントにより、その名前 GreeterClient が含まれるあいさつメッセージが、サービスに送信されます。 サービスから応答として "Hello GreeterClient" のメッセージが送信されます。 "Hello GreeterClient" の応答がコマンド プロンプトに表示されます。

Greeting: Hello GreeterClient
Press any key to exit...

gRPC サービスにより、成功した呼び出しの詳細が、コマンド プロンプトに書き込まれるログに記録されます。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

次の行を追加して、appsettings.Development.json ファイルを更新します。

"Microsoft.AspNetCore.Hosting": "Information",
"Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"

Note

この記事のコードでは、gRPC サービスをセキュリティで保護するために、ASP.NET Core HTTPS 開発証明書が必要です。 .NET gRPC クライアントが The remote certificate is invalid according to the validation procedure. または The SSL connection could not be established. というメッセージで失敗する場合、その開発証明書は信頼されていません。 この問題を解決するには、「信頼されていないか無効な証明書で gRPC サービスを呼び出す」を参照してください。

次の手順

このチュートリアルでは、.NET Core gRPC クライアントと ASP.NET Core gRPC サーバーを作成する方法を紹介します。

最終的に、gRPC あいさつサービスと通信する gRPC クライアントが与えられます。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

このチュートリアルでは、次の作業を行いました。

  • gRPC サービスを作成する。
  • gRPC クライアントを作成します。
  • gRPC あいさつサービスで gRPC クライアントをテストします。

前提条件

gRPC サービスの作成

  • Visual Studio を開始し、 [新しいプロジェクトの作成] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、 [gRPC サービス] を選び、 [次へ] を選択します。
  • [新しいプロジェクトの構成] ダイアログで、 [プロジェクト名] に「GrpcGreeter」と入力します。 コードのコピーおよび貼り付けを行う際に名前空間が一致するように、プロジェクトに GrpcGreeter という名前を付けることが重要です。
  • [次へ] を選択します。
  • [追加情報] ダイアログで、 [ターゲット フレームワーク] ドロップダウンの [.NET 5.0] を選択します。
  • [作成] を選択します。

サービスを実行する

  • Ctrl + F5 キーを押して、デバッガーなしで実行します。

    SSL を使用するようにプロジェクトがまだ構成されていない場合、Visual Studio に次のダイアログが表示されます。

    このプロジェクトは SSL を使用するように構成されています。ブラウザーでの SSL の警告を避けるには、IIS Express が生成した自己署名証明書を信頼することを選択します。IIS Express の SSL 証明書を信頼しますか?

    IIS Express SSL 証明書を信頼する場合、[はい] を選択します。

    次のダイアログが表示されます。

    セキュリティ警告のダイアログ

    開発証明書を信頼することに同意する場合は、 [はい] を選択します。

    Firefox ブラウザーを信頼する方法の詳細については、「Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 証明書エラー」を参照してください。

    Visual Studio で IIS Express が開始され、アプリが実行されます。 アドレス バーには、example.com などではなく、localhost:port# が表示されます。 これは、localhost がローカル コンピューターの標準のホスト名であるためです。 localhost では、ローカル コンピューターからの Web 要求のみが処理されます。 Visual Studio が Web プロジェクトを作成する場合は、Web サーバーにランダム ポートが使用されます。

サービスが https://localhost:5001 でリッスンしていることがログに示されます。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

Note

gRPC テンプレートはトランスポート層セキュリティ (TLS) を使用するように構成されています。 gRPC クライアントでは、HTTPS を使用してサーバーを呼び出す必要があります。

macOS の場合、ASP.NET Core gRPC と TLS の組み合わせに対応していません。 macOS で gRPC サービスを正常に実行するには、追加の構成が必要です。 詳細については、macOS で ASP.NET Core gRPC アプリを起動できない場合に関するページを参照してください。

プロジェクト ファイルを確認する

GrpcGreeterプロジェクト ファイル:

  • greet.proto:Protos/greet.proto ファイルは、Greeter gRPC を定義し、gRPC サーバー資産を生成するために使用されます。 詳細については、「gRPC の概要」を参照してください。
  • Services フォルダー:Greeter サービスの実装が含まれます。
  • appsettings.json: Kestrel で使用されるプロトコルなどの構成データが含まれています。 詳細については、「ASP.NET Core の構成」を参照してください。
  • Program.cs: gRPC サービスのエントリ ポイントが含まれています。 詳細については、「ASP.NET Core の .NET 汎用ホスト」を参照してください。
  • Startup.cs: アプリの動作を構成するコードが含まれています。 詳細については、アプリの Startupに関するページを参照してください。

.NET コンソール アプリで gRPC クライアントを作成する

  • Visual Studio のインスタンスをもう 1 つ開き、 [新しいプロジェクトの作成] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、 [コンソール アプリ (.NET Core)] を選択し、 [次へ] を選択します。
  • [プロジェクト名] テキスト ボックスに「GrpcGreeterClient」を入力し、 [作成] を選択します。

必要なパッケージを追加する

gRPC クライアント プロジェクトには、次のパッケージが必要です。

  • .NET Core のクライアントを含む Grpc.Net.Client
  • Google.Protobuf。これに C# の protobuf メッセージ API が含まれています。
  • Grpc.Tools。これには protobuf ファイルの C# ツール サポートが含まれています。 ツール パッケージは実行時に不要であり、依存関係には PrivateAssets="All" のマークが付きます。

パッケージ マネージャー コンソール (PMC) または NuGet パッケージの管理を使用してパッケージをインストールします。

パッケージをインストールするための PMC オプション

  • Visual Studio で [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  • [パッケージ マネージャー コンソール] ウィンドウから cd GrpcGreeterClient を実行し、GrpcGreeterClient.csproj ファイルが含まれるフォルダーにディレクトリを変更します。

  • 次のコマンドを実行します。

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

パッケージをインストールするための [NuGet パッケージの管理] オプション

  • [ソリューション エクスプローラー]>[NuGet パッケージの管理] でプロジェクトを右クリックします。
  • [参照] タブを選択します。
  • 検索ボックスに「Grpc.Net.Client」と入力します。
  • [参照] タブから Grpc.Net.Client パッケージを選択し、 [インストール] を選択します。
  • Google.ProtobufGrpc.Tools に同じ手順を繰り返します。

greet.proto を追加する

  • gRPC クライアント プロジェクトで Protos フォルダーを作成します。

  • gRPC あいさつサービスから gRPC クライアント プロジェクトの Protos フォルダーに Protos\greet.proto ファイルをコピーします。

  • greet.proto ファイル内の名前空間を、プロジェクトの名前空間に更新します。

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj プロジェクト ファイルを編集します。

    プロジェクトを右クリックし、 [プロジェクト ファイルの編集] を選択します。


  • greet.proto ファイルを参照する <Protobuf> 要素で項目グループを追加します。

    <ItemGroup>
      <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
    </ItemGroup>
    

Greeter クライアントを作成する

  • クライアント プロジェクトをビルドして、GrpcGreeterClient 名前空間内に型を作成します。

Note

GrpcGreeterClient 型は、ビルド プロセスによって自動的に生成されます。 ツール パッケージ Grpc.Tools は、greet.proto ファイルに基づいて次のファイルと生成します。

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: プロトコル バッファー コード。要求メッセージと応答メッセージの種類を、設定、シリアル化、および取得します。
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 生成されたクライアント クラスを格納します。

Grpc.Tools によって自動的に生成される C# アセットの詳細については、「C# を使用した gRPC サービス」の「生成された C# アセット」を参照してください。

  • 次のコードを使用して、gRPC クライアントの Program.cs ファイルを更新します。

    using System;
    using System.Net.Http;
    using System.Threading.Tasks;
    using Grpc.Net.Client;
    
    namespace GrpcGreeterClient
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                // The port number(5001) must match the port of the gRPC server.
                using var channel = GrpcChannel.ForAddress("https://localhost:5001");
                var client = new Greeter.GreeterClient(channel);
                var reply = await client.SayHelloAsync(
                                  new HelloRequest { Name = "GreeterClient" });
                Console.WriteLine("Greeting: " + reply.Message);
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }
    }
    

Program.cs には、gRPC クライアントのエントリ ポイントとロジックが含まれています。

Greeter クライアントは、次の方法で作成されます。

  • gRPC サービスへの接続を作成するための情報が含まれている GrpcChannel をインスタンス化する。
  • GrpcChannel を使用して、Greeter クライアントを構築します。
static async Task Main(string[] args)
{
    // The port number(5001) must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

Greeter クライアントから非同期の SayHello メソッドが呼び出されます。 SayHello 呼び出しの結果が表示されます。

static async Task Main(string[] args)
{
    // The port number(5001) must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

gRPC あいさつサービスで gRPC クライアントをテストする

  • あいさつサービスで、Ctrl+F5 キーを押して、デバッガーなしでサーバーを起動します。
  • GrpcGreeterClient プロジェクトで、Ctrl+F5 押してデバッガーなしでクライアントを起動します。

クライアントにより、その名前 GreeterClient が含まれるあいさつメッセージが、サービスに送信されます。 サービスから応答として "Hello GreeterClient" のメッセージが送信されます。 "Hello GreeterClient" の応答がコマンド プロンプトに表示されます。

Greeting: Hello GreeterClient
Press any key to exit...

gRPC サービスにより、成功した呼び出しの詳細が、コマンド プロンプトに書き込まれるログに記録されます。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:5001/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

Note

この記事のコードでは、gRPC サービスをセキュリティで保護するために、ASP.NET Core HTTPS 開発証明書が必要です。 .NET gRPC クライアントが The remote certificate is invalid according to the validation procedure. または The SSL connection could not be established. というメッセージで失敗する場合、その開発証明書は信頼されていません。 この問題を解決するには、「信頼されていないか無効な証明書で gRPC サービスを呼び出す」を参照してください。

次の手順

このチュートリアルでは、.NET Core gRPC クライアントと ASP.NET Core gRPC サーバーを作成する方法を紹介します。

最終的に、gRPC あいさつサービスと通信する gRPC クライアントが与えられます。

サンプル コードを表示またはダウンロードします (ダウンロード方法)。

このチュートリアルでは、次の作業を行いました。

  • gRPC サービスを作成する。
  • gRPC クライアントを作成します。
  • gRPC あいさつサービスで gRPC クライアントをテストします。

前提条件

gRPC サービスの作成

  • Visual Studio を開始し、 [新しいプロジェクトの作成] を選択します。 または、Visual Studio の [ファイル] メニューから、 [新規作成]>[プロジェクト] の順に選択します。

  • [新しいプロジェクトの作成] ダイアログで、 [gRPC サービス] を選択して、 [次へ] を選択します。

    Visual Studio の [新しいプロジェクトの作成] ダイアログ

  • プロジェクトに GrpcGreeter という名前を付けます。 コードのコピーおよび貼り付けを行う際に名前空間が一致するように、プロジェクトに GrpcGreeter という名前を付けることが重要です。

  • [作成] を選択します。

  • [Create a new gRPC service](新しい gPRC サービスの作成) ダイアログで、次のようにします。

    • gRPC サービス テンプレートが選択されています。
    • [作成] を選択します。

サービスを実行する

  • Ctrl + F5 キーを押して、デバッガーなしで実行します。

    SSL を使用するようにプロジェクトがまだ構成されていない場合、Visual Studio に次のダイアログが表示されます。

    このプロジェクトは SSL を使用するように構成されています。ブラウザーでの SSL の警告を避けるには、IIS Express が生成した自己署名証明書を信頼することを選択します。IIS Express の SSL 証明書を信頼しますか?

    IIS Express SSL 証明書を信頼する場合、[はい] を選択します。

    次のダイアログが表示されます。

    セキュリティ警告のダイアログ

    開発証明書を信頼することに同意する場合は、 [はい] を選択します。

    Firefox ブラウザーを信頼する方法の詳細については、「Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 証明書エラー」を参照してください。

    Visual Studio で IIS Express が開始され、アプリが実行されます。 アドレス バーには、example.com などではなく、localhost:port# が表示されます。 これは、localhost がローカル コンピューターの標準のホスト名であるためです。 localhost では、ローカル コンピューターからの Web 要求のみが処理されます。 Visual Studio が Web プロジェクトを作成する場合は、Web サーバーにランダム ポートが使用されます。

サービスが https://localhost:5001 でリッスンしていることがログに示されます。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

Note

gRPC テンプレートはトランスポート層セキュリティ (TLS) を使用するように構成されています。 gRPC クライアントでは、HTTPS を使用してサーバーを呼び出す必要があります。

macOS の場合、ASP.NET Core gRPC と TLS の組み合わせに対応していません。 macOS で gRPC サービスを正常に実行するには、追加の構成が必要です。 詳細については、macOS で ASP.NET Core gRPC アプリを起動できない場合に関するページを参照してください。

プロジェクト ファイルを確認する

GrpcGreeterプロジェクト ファイル:

  • greet.proto:Protos/greet.proto ファイルは、Greeter gRPC を定義し、gRPC サーバー資産を生成するために使用されます。 詳細については、「gRPC の概要」を参照してください。
  • Services フォルダー:Greeter サービスの実装が含まれます。
  • appsettings.json: Kestrel で使用されるプロトコルなどの構成データが含まれています。 詳細については、「ASP.NET Core の構成」を参照してください。
  • Program.cs: gRPC サービスのエントリ ポイントが含まれています。 詳細については、「ASP.NET Core の .NET 汎用ホスト」を参照してください。
  • Startup.cs: アプリの動作を構成するコードが含まれています。 詳細については、アプリの Startupに関するページを参照してください。

.NET コンソール アプリで gRPC クライアントを作成する

  • Visual Studio のインスタンスをもう 1 つ開き、 [新しいプロジェクトの作成] を選択します。
  • [新しいプロジェクトの作成] ダイアログで、 [コンソール アプリ (.NET Core)] を選択し、 [次へ] を選択します。
  • [プロジェクト名] テキスト ボックスに「GrpcGreeterClient」を入力し、 [作成] を選択します。

必要なパッケージを追加する

gRPC クライアント プロジェクトには、次のパッケージが必要です。

  • .NET Core のクライアントを含む Grpc.Net.Client
  • Google.Protobuf。これに C# の protobuf メッセージ API が含まれています。
  • Grpc.Tools。これには protobuf ファイルの C# ツール サポートが含まれています。 ツール パッケージは実行時に不要であり、依存関係には PrivateAssets="All" のマークが付きます。

パッケージ マネージャー コンソール (PMC) または NuGet パッケージの管理を使用してパッケージをインストールします。

パッケージをインストールするための PMC オプション

  • Visual Studio で [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  • [パッケージ マネージャー コンソール] ウィンドウから cd GrpcGreeterClient を実行し、GrpcGreeterClient.csproj ファイルが含まれるフォルダーにディレクトリを変更します。

  • 次のコマンドを実行します。

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

パッケージをインストールするための [NuGet パッケージの管理] オプション

  • [ソリューション エクスプローラー]>[NuGet パッケージの管理] でプロジェクトを右クリックします。
  • [参照] タブを選択します。
  • 検索ボックスに「Grpc.Net.Client」と入力します。
  • [参照] タブから Grpc.Net.Client パッケージを選択し、 [インストール] を選択します。
  • Google.ProtobufGrpc.Tools に同じ手順を繰り返します。

greet.proto を追加する

  • gRPC クライアント プロジェクトで Protos フォルダーを作成します。

  • gRPC あいさつサービスから gRPC クライアント プロジェクトの Protos フォルダーに Protos\greet.proto ファイルをコピーします。

  • greet.proto ファイル内の名前空間を、プロジェクトの名前空間に更新します。

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj プロジェクト ファイルを編集します。

    プロジェクトを右クリックし、 [プロジェクト ファイルの編集] を選択します。


  • greet.proto ファイルを参照する <Protobuf> 要素で項目グループを追加します。

    <ItemGroup>
      <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
    </ItemGroup>
    

Greeter クライアントを作成する

  • クライアント プロジェクトをビルドして、GrpcGreeterClient 名前空間内に型を作成します。

Note

GrpcGreeterClient 型は、ビルド プロセスによって自動的に生成されます。 ツール パッケージ Grpc.Tools は、greet.proto ファイルに基づいて次のファイルと生成します。

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: プロトコル バッファー コード。要求メッセージと応答メッセージの種類を、設定、シリアル化、および取得します。
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 生成されたクライアント クラスを格納します。

Grpc.Tools によって自動的に生成される C# アセットの詳細については、「C# を使用した gRPC サービス」の「生成された C# アセット」を参照してください。

次のコードを使用して、gRPC クライアントの Program.cs ファイルを更新します。

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Grpc.Net.Client;

namespace GrpcGreeterClient
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // The port number(5001) must match the port of the gRPC server.
            using var channel = GrpcChannel.ForAddress("https://localhost:5001");
            var client = new Greeter.GreeterClient(channel);
            var reply = await client.SayHelloAsync(
                              new HelloRequest { Name = "GreeterClient" });
            Console.WriteLine("Greeting: " + reply.Message);
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Program.cs には、gRPC クライアントのエントリ ポイントとロジックが含まれています。

Greeter クライアントは、次の方法で作成されます。

  • gRPC サービスへの接続を作成するための情報が含まれている GrpcChannel をインスタンス化する。
  • GrpcChannel を使用して、Greeter クライアントを構築します。
static async Task Main(string[] args)
{
    // The port number(5001) must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

Greeter クライアントから非同期の SayHello メソッドが呼び出されます。 SayHello 呼び出しの結果が表示されます。

static async Task Main(string[] args)
{
    // The port number(5001) must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

gRPC あいさつサービスで gRPC クライアントをテストする

  • あいさつサービスで、Ctrl+F5 キーを押して、デバッガーなしでサーバーを起動します。
  • GrpcGreeterClient プロジェクトで、Ctrl+F5 押してデバッガーなしでクライアントを起動します。

クライアントにより、その名前 GreeterClient が含まれるあいさつメッセージが、サービスに送信されます。 サービスから応答として "Hello GreeterClient" のメッセージが送信されます。 "Hello GreeterClient" の応答がコマンド プロンプトに表示されます。

Greeting: Hello GreeterClient
Press any key to exit...

gRPC サービスにより、成功した呼び出しの詳細が、コマンド プロンプトに書き込まれるログに記録されます。

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:5001/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

Note

この記事のコードでは、gRPC サービスをセキュリティで保護するために、ASP.NET Core HTTPS 開発証明書が必要です。 .NET gRPC クライアントが The remote certificate is invalid according to the validation procedure. または The SSL connection could not be established. というメッセージで失敗する場合、その開発証明書は信頼されていません。 この問題を解決するには、「信頼されていないか無効な証明書で gRPC サービスを呼び出す」を参照してください。

次の手順