チュートリアル: ASP.NET Core で gRPC のクライアントとサーバーを作成するTutorial: Create a gRPC client and server in ASP.NET Core

作成者: John LuoBy John Luo

このチュートリアルでは、.NET Core gRPC クライアントと ASP.NET Core gRPC サーバーを作成する方法を紹介します。This tutorial shows how to create a .NET Core gRPC client and an ASP.NET Core gRPC Server.

最終的に、gRPC あいさつサービスと通信する gRPC クライアントが与えられます。At the end, you'll have a gRPC client that communicates with the gRPC Greeter service.

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download).

このチュートリアルでは、次の作業を行いました。In this tutorial, you:

  • gRPC サービスを作成する。Create a gRPC Server.
  • gRPC クライアントを作成します。Create a gRPC client.
  • gRPC あいさつサービスで gRPC クライアント サービスをテストする。Test the gRPC client service with the gRPC Greeter service.

必須コンポーネントPrerequisites

gRPC サービスの作成Create a gRPC service

  • Visual Studio を開始し、 [新しいプロジェクトの作成] を選択します。Start Visual Studio and select Create a new project. または、Visual Studio の [ファイル] メニューから、 [新規作成] > [プロジェクト] の順に選択します。Alternatively, from the Visual Studio File menu, select New > Project.

  • [新しいプロジェクトの作成] ダイアログで、 [gRPC サービス] を選択して、 [次へ] を選択します。In the Create a new project dialog, select gRPC Service and select Next:

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

  • プロジェクトに GrpcGreeter という名前を付けます。Name the project GrpcGreeter. コードのコピーおよび貼り付けを行う際に名前空間が一致するように、プロジェクトに GrpcGreeter という名前を付けることが重要です。It's important to name the project GrpcGreeter so the namespaces will match when you copy and paste code.

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

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

    • gRPC サービス テンプレートが選択されています。The gRPC Service template is selected.
    • [作成] を選択します。Select Create.

サービスを実行するRun the service

  • Ctrl + F5 キーを押して、デバッガーなしで実行します。Press Ctrl+F5 to run without the debugger.

    Visual Studio に次のダイアログが表示されます。Visual Studio displays the following dialog:

    このプロジェクトは SSL を使用するように構成されています。

    IIS Express SSL 証明書を信頼する場合、 [はい] を選択します。Select Yes if you trust the IIS Express SSL certificate.

    次のダイアログが表示されます。The following dialog is displayed:

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

    開発証明書を信頼することに同意する場合は、 [はい] を選択します。Select Yes if you agree to trust the development certificate.

    Visual Studio で IIS Express が開始され、アプリが実行されます。Visual Studio starts IIS Express and runs the app. アドレス バーには、example.com などではなく、localhost:port# が表示されます。The address bar shows localhost:port# and not something like example.com. これは、localhost がローカル コンピューターの標準のホスト名であるためです。That's because localhost is the standard hostname for the local computer. localhost では、ローカル コンピューターからの Web 要求のみが処理されます。Localhost only serves web requests from the local computer. Visual Studio が Web プロジェクトを作成する場合は、Web サーバーにランダム ポートが使用されます。When Visual Studio creates a web project, a random port is used for the web server.

サービスが https://localhost:5001 でリッスンしていることがログに示されます。The logs show the service listening on 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

注意

gRPC テンプレートはトランスポート層セキュリティ (TLS) を使用するように構成されています。The gRPC template is configured to use Transport Layer Security (TLS). gRPC クライアントでは、HTTPS を使用してサーバーを呼び出す必要があります。gRPC clients need to use HTTPS to call the server.

macOS の場合、ASP.NET Core gRPC と TLS の組み合わせに対応していません。macOS doesn't support ASP.NET Core gRPC with TLS. macOS で gRPC サービスを正常に実行するには、追加の構成が必要です。Additional configuration is required to successfully run gRPC services on macOS. 詳細については、macOS で ASP.NET Core gRPC アプリを起動できない場合に関するページを参照してください。For more information, see Unable to start ASP.NET Core gRPC app on macOS.

プロジェクト ファイルを確認するExamine the project files

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

  • greet.protoProtos/greet.proto ファイルでは Greeter gRPC が定義されており、このファイルは gRPC サーバー資産を生成するために使用されます。greet.proto – The Protos/greet.proto file defines the Greeter gRPC and is used to generate the gRPC server assets. 詳細については、「gRPC の概要」を参照してください。For more information, see Introduction to gRPC.
  • Services フォルダー:Greeter サービスの実装が含まれます。Services folder: Contains the implementation of the Greeter service.
  • appSettings.json – Kestrel で使用されるプロトコルなどの構成データが含まれています。appSettings.json – Contains configuration data, such as protocol used by Kestrel. 詳細については、ASP.NET Core の構成 を参照してください。For more information, see ASP.NET Core の構成.
  • Program.cs – gRPC サービスのエントリ ポイントが含まれています。Program.cs – Contains the entry point for the gRPC service. 詳細については、.NET での汎用ホスト を参照してください。For more information, see .NET での汎用ホスト.
  • Startup.cs – アプリの動作を構成するコードが含まれています。Startup.cs – Contains code that configures app behavior. 詳細については、アプリの Startupに関するページを参照してください。For more information, see App startup.

.NET コンソール アプリで gRPC クライアントを作成するCreate the gRPC client in a .NET console app

  • Visual Studio のインスタンスをもう 1 つ開き、 [新しいプロジェクトの作成] を選択します。Open a second instance of Visual Studio and select Create a new project.
  • [新しいプロジェクトの作成] ダイアログで、 [コンソール アプリ (.NET Core)] を選択し、 [次へ] を選択します。In the Create a new project dialog, select Console App (.NET Core) and select Next.
  • [名前] テキスト ボックスに「GrpcGreeterClient」を入力し、 [作成] を選択します。In the Name text box, enter GrpcGreeterClient and select Create.

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

gRPC クライアント プロジェクトには、次のパッケージが必要です。The gRPC client project requires the following packages:

  • .NET Core のクライアントを含む Grpc.Net.ClientGrpc.Net.Client, which contains the .NET Core client.
  • Google.Protobuf。これに C# の protobuf メッセージ API が含まれています。Google.Protobuf, which contains protobuf message APIs for C#.
  • Grpc.Tools。これには protobuf ファイルの C# ツール サポートが含まれています。Grpc.Tools, which contains C# tooling support for protobuf files. ツール パッケージは実行時に不要であり、依存関係には PrivateAssets="All" のマークが付きます。The tooling package isn't required at runtime, so the dependency is marked with PrivateAssets="All".

パッケージ マネージャー コンソール (PMC) または NuGet パッケージの管理を使用してパッケージをインストールします。Install the packages using either the Package Manager Console (PMC) or Manage NuGet Packages.

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

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

  • [パッケージ マネージャー コンソール] ウィンドウから cd GrpcGreeterClient を実行し、GrpcGreeterClient.csproj ファイルが含まれるフォルダーにディレクトリを変更します。From the Package Manager Console window, run cd GrpcGreeterClient to change directories to the folder containing the GrpcGreeterClient.csproj files.

  • 次のコマンドを実行します。Run the following commands:

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

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

  • [ソリューション エクスプローラー] > [NuGet パッケージの管理] でプロジェクトを右クリックします。Right-click the project in Solution Explorer > Manage NuGet Packages
  • [参照] タブを選択します。Select the Browse tab.
  • 検索ボックスに「Grpc.Net.Client」と入力します。Enter Grpc.Net.Client in the search box.
  • [参照] タブから Grpc.Net.Client パッケージを選択し、 [インストール] を選択します。Select the Grpc.Net.Client package from the Browse tab and select Install.
  • Google.ProtobufGrpc.Tools に同じ手順を繰り返します。Repeat for Google.Protobuf and Grpc.Tools.

greet.proto を追加するAdd greet.proto

  • gRPC クライアント プロジェクトで Protos フォルダーを作成します。Create a Protos folder in the gRPC client project.

  • gRPC あいさつサービスから gRPC クライアント プロジェクトに Protos\greet.proto ファイルをコピーします。Copy the Protos\greet.proto file from the gRPC Greeter service to the gRPC client project.

  • GrpcGreeterClient.csproj プロジェクト ファイルを編集します。Edit the GrpcGreeterClient.csproj project file:

    プロジェクトを右クリックし、 [プロジェクト ファイルの編集] を選択します。Right-click the project and select Edit Project File.


  • greet.proto ファイルを参照する <Protobuf> 要素で項目グループを追加します。Add an item group with a <Protobuf> element that refers to the greet.proto file:

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

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

プロジェクトをビルドして、GrpcGreeter 名前空間内に型を作成します。Build the project to create the types in the GrpcGreeter namespace. GrpcGreeter 型は、ビルド プロセスによって自動的に生成されます。The GrpcGreeter types are generated automatically by the build process.

次のコードを使用して、gRPC クライアントの Program.cs ファイルを更新します。Update the gRPC client Program.cs file with the following code:

using System;
using System.Net.Http;
using System.Threading.Tasks;
using GrpcGreeter;
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 クライアントのエントリ ポイントとロジックが含まれています。Program.cs contains the entry point and logic for the gRPC client.

Greeter クライアントは、次の方法で作成されます。The Greeter client is created by:

  • gRPC サービスへの接続を作成するための情報が含まれている GrpcChannel をインスタンス化する。Instantiating a GrpcChannel containing the information for creating the connection to the gRPC service.
  • GrpcChannel を使用して、Greeter クライアントを構築します。Using the GrpcChannel to construct the Greeter client:
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 メソッドが呼び出されます。The Greeter client calls the asynchronous SayHello method. SayHello 呼び出しの結果が表示されます。The result of the SayHello call is displayed:

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 クライアントをテストするTest the gRPC client with the gRPC Greeter service

  • あいさつサービスで、Ctrl+F5 キーを押して、デバッガーなしでサーバーを起動します。In the Greeter service, press Ctrl+F5 to start the server without the debugger.
  • GrpcGreeterClient プロジェクトで、Ctrl+F5 押してデバッガーなしでクライアントを起動します。In the GrpcGreeterClient project, press Ctrl+F5 to start the client without the debugger.

クライアントにより、その名前 GreeterClient が含まれるあいさつメッセージが、サービスに送信されます。The client sends a greeting to the service with a message containing its name, GreeterClient. サービスから応答として "Hello GreeterClient" のメッセージが送信されます。The service sends the message "Hello GreeterClient" as a response. "Hello GreeterClient" の応答がコマンド プロンプトに表示されます。The "Hello GreeterClient" response is displayed in the command prompt:

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

gRPC サービスにより、成功した呼び出しの詳細が、コマンド プロンプトに書き込まれるログに記録されます。The gRPC service records the details of the successful call in the logs written to the command prompt:

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

注意

この記事のコードでは、gRPC サービスをセキュリティで保護するために、ASP.NET Core HTTPS 開発証明書が必要です。The code in this article requires the ASP.NET Core HTTPS development certificate to secure the gRPC service. クライアントが The remote certificate is invalid according to the validation procedure. というメッセージで失敗する場合、その開発証明書は信頼されていません。If the client fails with the message The remote certificate is invalid according to the validation procedure., the development certificate is not trusted. この問題を解決する手順については、「Windows と macOS で ASP.NET Core HTTPS 開発証明書を信頼します」を参照してください。For instructions to fix this issue, see Trust the ASP.NET Core HTTPS development certificate on Windows and macOS.

gRPC は Azure App Service ではサポートされていませんgRPC not supported on Azure App Service

警告

現在、ASP.NET Core gRPC は Azure App Service または IIS 上でサポートされていません。ASP.NET Core gRPC is not currently supported on Azure App Service or IIS. Http.Sys の HTTP/2 実装では、gRPC が依存する HTTP 応答の末尾のヘッダーがサポートされていません。The HTTP/2 implementation of Http.Sys does not support HTTP response trailing headers which gRPC relies on. 詳細については、次を参照してください。この GitHub の問題します。For more information, see this GitHub issue.

次の手順Next steps