はじめに
本連載では、マルチプラットフォーム化が進む.NETと、そのWebアプリケーション開発フレームワークであるASP.NET Coreの全体像を俯瞰します。ASP.NET Coreは、アプリケーションの目的や開発スタイルに応じて選択することができる多彩なサブフレームワークを搭載しています。それらの基本的な性質や機能を読者に示すことで、ASP.NET Core導入の一助になることを目的とします。
対象読者
- Core以前のASP.NETに慣れ親しんだ方
- Web開発の新しい選択肢としてASP.NET Coreを理解したい方
- ASP.NET Coreの多彩なフレームワークを俯瞰したい方
必要な環境
本記事のサンプルコードは、以下の環境で動作を確認しています。
-
macOS Ventura / Windows 10(64bit)
- .NET SDK 7.0.100
クライアントアプリケーションを作成する
前回では、gRPCサーバアプリケーションをテンプレートから作成し、汎用のgRPCクライアントであるgrpcurlで動作を確認しました。今回は、それを利用するクライアントアプリケーションを作成してみます。
アプリケーションの作成
gRPCクライアントには、gRPCサーバのようなテンプレートは用意されていないので、コンソールアプリケーションのテンプレートからゼロベースで作成します。アプリケーションの名前はGrpcClientSampleとします。
% dotnet new console -o GrpcClientSample -f net7.0
dotnet newコマンドのオプション-oと-fは、これまでの回でも紹介したように出力先フォルダとターゲットの.NETバージョンの指定です。作成後、アプリケーションに必要なNuGetパッケージGoogle.Protobuf、Grpc.Net.Client、Grpc.Toolsを続けてインストールします。
% dotnet add GrpcClientSample.csproj package Google.Protobuf % dotnet add GrpcClientSample.csproj package Grpc.Net.Client % dotnet add GrpcClientSample.csproj package Grpc.Tools
これらはそれぞれ、Protocol Buffersの利用、gRPCクライアント、gRPCツールのためのパッケージとなっています。
プロトコル定義ファイルの用意
gRPCサーバの作成で用意したプロトコル定義ファイルgreet.protoを、クライアントアプリケーションにもProtosフォルダを作成してコピーします。そして、名前空間をクライアントアプリケーション用に修正します。
…略… option csharp_namespace = "GrpcClientSample"; …略…
プロジェクト設定ファイルの修正
クライアントアプリケーションのプロジェクト設定ファイルGrpcClientSample.csprojに、プロトコル定義ファイルをクライアントとして利用する設定を追加します。この指定がないと、ビルド時にプロトコル定義ファイルを認識してスタブコードを生成する処理が実行されません。
…略… <Protobuf Include="Protos/greet.proto" GrpcServices="Client" /> 追加 </ItemGroup> </Project>
クライアントコードの作成
ここで、dotnet buildコマンドを実行してスタブコードを作成しましょう。エラーのないことを確認したら、クライアントのコードをProgram.csファイルに書いていきます。このクライアントアプリケーションは、引数にあいさつ相手の名前を受け取り、手続きを呼び出して結果を表示するというものです。
using Grpc.Net.Client; (1) using GrpcClientSample; // 引数の取得 if (args.Length < 1) (2) { Console.WriteLine("引数が1個以上必要です"); return; } var name = args[0]; // チャネルとクライアントの生成 using var channel = GrpcChannel.ForAddress($"http://localhost:5046"); (3) var client = new Greeter.GreeterClient(channel); // SayHelloAsyncメソッドを非同期で呼び出し結果を表示 var reply = await client.SayHelloAsync(new HelloRequest { Name = name }); (4) Console.WriteLine(reply.Message);
(1)は、gRPCクライアントに必要な名前空間のインポートです。gRPCクライアントで基本となるのは、Grpc.Net.Clientのみです。GrpcClientSampleは、プロトコル定義ファイルで指定したクライアント独自の名前空間です。スタブコードは、この名前空間内に作成されるので、この指定が必要となっています。
(2)は、引数の処理です。あいさつ相手の名前を変数nameにセットします。条件を満たさない場合にはメッセージを表示してプログラムを終了します。
(3)は、GrpcChannel.ForAddressメソッドによるチャネルの生成と、Greeter.GreeterClientメソッドによるクライアントの生成です。チャネルの生成ではURLを指定しますが、このポート番号はサーバの使用するものに合わせる必要があります。これらのクラスやメソッドは、スタブコードに記述されています。
(4)は、Unary方式の手続き呼び出しです。非同期でHelloRequest型を引数としてSayHelloAsyncメソッドを呼び出し、HelloReply型の結果を受け取って表示するだけという、シンプルなものです。
この時点で、dotnet runコマンドを実行し、以下のように実行結果を確認できればクライアントの作成は成功です。
% dotnet run Nao Hello Nao