スポンサーリンク
スポンサーリンク

.NET 6.0とMagicOnionで実現するgRPC通信(Windowsフォーム)v2

.NET CoreASP.NET CoreC#MagicOnionVisual StudioWCFWindowsフォームアプリ

.NET 6.0 の Windowsフォームアプリから、MagicOnion NuGetパッケージを使い、gRPC通信処理を行うサンプルを作成しました。
前回作成したサンプルに、データクラスを使うパターンを追加実装しました。
MagicOnionでデータクラスを通信する際は、MessagePackを使ったシリアライズ/デシリアライズが必須になります。
ソースコードはGitHubで公開しています。

.Net Frameworkで実装されたクライアントサーバシステムを .NET 6.0へ移行するにあたり、MagicOnion Nugetパッケージを使用すると、gRPC通信を使ったクライアントサーバシステムへ簡単に移行できます。

.Net Framework+WCF で実装されたクライアントサーバシステムを、.NET 6.0+WCF Core へ移行し古いHTTTPプロトコルで通信し続けるよりは、HTTP/2のgRPC通信へ移行することが推奨されています。
WCF 開発者に gRPC を推奨する理由 – WCF 開発者向け gRPC | Microsoft Learn

MagicOnionを使うと簡単にクライアント・サーバシステムでgRPC通信を実現できます。
.NETでクライアント・サーバシステムを開発する場合、通信処理はMagicOnionでgRPC通信を実装するのが主流になりそうです。

GitHubのMagicOnion プロジェクトサイトには、MagicOnion開発リポジトリ、インストール手順などがありわかり易いです。
Cysharp/MagicOnion: Unified Realtime/API framework for .NET Platform and Unity (github.com)

 

MagicOnion 通信インターフェース定義

ソースコード構成

最初に、サーバ側とクライアント側で使用する共通ライブラリとして、通信処理のインターフェースとデータモデルの定義を作成します。
今回使った Visual Studio プロジェクト テンプレートは、Visual Studio 2022 + .NET 6.0 + クラスライブラリです。

テンプレートに対して、下記のインターフェース定義とデータモデル定義を加えました。

 

ソースコード変更内容を解説

/ClassLibrary1.csproj

MagicOnion NuGetパッケージをインストール。

 

/Model/ModelClassA.cs

通信する際のデータクラスを作成。

 

/Interface/IMyFirstService.cs

通信する際のインターフェースを作成。

 

MagicOnion サーバ側

ソースコード構成

今回使った Visual Studio プロジェクト テンプレートは、Visual Studio 2022 + .NET 6.0 + ASP.NET Core(空)アプリです。

テンプレートに対して、下記の処理を加えました。

 

ソースコード変更内容を解説

/WebApplication1.sln

・MagicOnion通信インターフェース定義で作成したクラスライブラリをソリューションに追加。

 

/WebApplication1/WebApplication1.csproj

Grpc.AspNetCore/MagicOnion.Server NuGetパッケージをインストール。

 

/WebApplication1/Program.cs

MagicOnion.Serverのサービス開始処理を追加。

 

/WebApplication1/Services/MyFirstService.cs

interfaceに対応するサーバ側の処理を作成。

 

MagicOnion クライアント側

ソースコード構成

今回使った Visual Studio プロジェクト テンプレートは、Visual Studio 2022 + .NET 6.0 + Windowsフォームアプリです。

テンプレートに対して、下記の処理を加えました。

 

ソースコード変更内容を解説

/WinFormsApp1.sln

MagicOnion通信インターフェース定義で作成したクラスライブラリをソリューションに追加。

 

/WinFormsApp1/WinFormsApp1.csproj

・MagicOnion.Client NuGetパッケージをインストール。

 

/WinFormsApp1/Form1.Designer.cs/WinFormsApp1/Form1.resx

動作を確認する為に最低限の画面を作成。

 

/WinFormsApp1/Form1.cs

ボタンのクリックイベントに、interfaceを通しサーバ側の SumAsync()/Sum2Asyn()メソッドを呼び出す処理を作成。

 

補足

通信するデータクラスにMessagePackObject/Key属性を付与していないと、MagicOnionの通信実行時に、「MessagePackSerializationException: Failed to serialize」エラーが発生します。
通信する必要のないプロパティは [IgnoreMember]属性を加えると解消します。

 

[Key][IgnoreMember]属性を設定していても、[Key(〇〇〇)]属性の〇〇〇パラメータが重複している場合、「Exception was thrown by handler.」例外が発生します。

 

コメント

タイトルとURLをコピーしました