More Related Content
Similar to WCFのパイプ通信を .NET 5に向けてgRPCへ置き換える話 (20)
WCFのパイプ通信を .NET 5に向けてgRPCへ置き換える話
- 2. 自己紹介
ID:suusanex( connpass・Twitter・GitHub共通)
名前:須藤圭太
サイエンスパーク株式会社という独立系ソフトウェアベンダーに所属
4年ほど受託開発で、上流から下流まで全部を回す
ここ6年ほどは、自社製品開発を担当
Windowsアプリ開発のネタが多い
勉強会もやってます。最近は開けていませんがそのうち再開します
https://yokohama-win-dev-tips.connpass.com/
https://sciencepark.connpass.com
- 4. しかし、WCFは.NET 5で引退
.NET 5ではWCFサーバーを実装出来ないし、今後もサポート予定なし
MSも丁寧なドキュメントでgRPCへの移行を促している
ASP.NET Core gRPC に WCF を移行する理由 Microsoft Docs
https://docs.microsoft.com/ja-jp/aspnet/core/grpc/why-migrate-wcf-to-dotnet-
grpc?view=aspnetcore-5.0
- 11. 少し詳しい実装方法 コマンドの定義
WCFのコントラクトの代わりに、protoファイルで定義を書く
色々書き方があるが、下記のようにするとWCFと同じイメージで使える
message UserSesionToServiceRequest {
oneof action {
RegisterUserSessionRequest RegisterUserSession = 1;
GetDataRequestParam GetDataRequest = 2;
SendDataResponseParam SendDataResponse = 3;
}
}
message RegisterUserSessionRequest{
int32 sessionId = 1;
}
メソッド(イメージ)
クラス(イメージ)
メソッドのパラメータ(イメージ)
- 12. 少し詳しい実装方法 送信側
ProtoファイルからC#のクラスを生成してくれる
開いたストリームにクラスをWriteすると送信になる
await m_DuplexStream.RequestStream.WriteAsync(new UserSesionToServiceRequest
{
RegisterUserSession = new RegisterUserSessionRequest
{
SessionId = Process.GetCurrentProcess().SessionId
}
});
クラス用のストリーム
メソッド(イメージ)
クラス(イメージ)
メソッドのパラメータ
(イメージ)
- 13. 少し詳しい実装方法 受信側
ProtoファイルからC#のクラスを生成してくれる
開いたStreamをReadすると、受信したら制御が戻る
await foreach (var req in subscribe.RequestStream.ReadAllAsync(cancellationToken))
{
switch (req.ActionCase)
{
case UserSesionToServiceRequest.ActionOneofCase.RegisterUserSession:
{
var val = req.RegisterUserSession;
クラス用のストリーム
メソッド(イメージ)
クラス(イメージ)
メソッドのパラメータ
(イメージ)