ダウンロード サンプルファイル (1.0 MB)
この回では、前回に続いてgRPCサービスの開発について紹介します。gRPCクライアントアプリケーションの開発を紹介するほか、gRPCサーバにサーバサイドストリーミングの手続きを追加し、gRPCクライアントもそれに対応して拡張してみます。
はじめに
本連載では、マルチプラットフォーム化が進む.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
この記事は参考になりましたか?
- .NET最新版でASP.NET Core連載記事一覧
-
- ASP.NET Coreでリアルタイム通信を実現! SignalRの使い方
- ASP.NET CoreによるgRPCクライアントの開発を理解しよう
- ASP.NET CoreによるgRPCサーバの開発を理解しよう
- この記事の著者
-
WINGSプロジェクト 山内 直(WINGSプロジェクト ヤマウチ ナオ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。出版社を経てフリーランスとして独立。ライター、エディター、デベロッパー、講師業に従事。屋号は「たまデジ。」。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
