SlideShare une entreprise Scribd logo
1  sur  14
WCFのパイプ通信を
.NET 5に向けて
gRPCへ置き換える話
自己紹介
 ID:suusanex( connpass・Twitter・GitHub共通)
 名前:須藤圭太
 サイエンスパーク株式会社という独立系ソフトウェアベンダーに所属
 4年ほど受託開発で、上流から下流まで全部を回す
 ここ6年ほどは、自社製品開発を担当
 Windowsアプリ開発のネタが多い
 勉強会もやってます。最近は開けていませんがそのうち再開します
 https://yokohama-win-dev-tips.connpass.com/
 https://sciencepark.connpass.com
WCFのパイプ通信とは何の話?
 Windowsアプリ開発で、ピンポイントで便利だった実装方法
 Windowsサービスとデスクトップアプリで高速な通信をしたい
 しかも双方向通信したい
 そのためのパイプ通信を、.NET Frameworkでは
WCFで簡単に実装できた
 WCFらしく、クラスにメソッドを定義して
関数呼び出しの感覚で使える
しかし、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
gRPCというやつに乗り換えよう!
 気になるポイントがいくつかある
 パイプ通信できる?
 関数呼び出しの感覚で使える?
 双方向通信できる?
 .NET Frameworkのクライアントから呼べる?
 こういう疑問に答えつつ、軽くだけ実装方法を紹介します
パイプ通信できる?
 できない
 しかし、localhostでのTCP/IP通信になるので、十分に速いはず
 通信セッション開始・通信1回・通信セッション終了までを1セットとして計測
 注意:開発環境での雑な実測結果
 遜色なし
WCF(Pipe) gRPC
初回の通信 0.1s 0.2s
2回目の通信 0.02s 0.005s
10回連続通信 0.2s 0.05s
関数呼び出しの感覚で使える?
 近いことはできる
 一方的に送るだけなので、戻り値という考え方は無い
 リクエストとレスポンスをペアで定義すれば良い
 使用感はAsyncのメソッドと同じ
双方向通信できる?
 できる
 Bidirectional streaming RPC
 最初のSubscribeで2つのストリームを作る
 サーバーとクライアントがそれぞれストリームを読む
.NET Frameworkのクライアントから呼べ
る?
 できる
 同じ定義を共有することで、.NET 5のクライアントとも共存可能
いけそう
 気になる点は問題なかったので、移行して行けそう
 移行していく上での実装方法を軽く紹介します
少し詳しい実装方法 コマンドの定義
 WCFのコントラクトの代わりに、protoファイルで定義を書く
 色々書き方があるが、下記のようにするとWCFと同じイメージで使える
message UserSesionToServiceRequest {
oneof action {
RegisterUserSessionRequest RegisterUserSession = 1;
GetDataRequestParam GetDataRequest = 2;
SendDataResponseParam SendDataResponse = 3;
}
}
message RegisterUserSessionRequest{
int32 sessionId = 1;
}
メソッド(イメージ)
クラス(イメージ)
メソッドのパラメータ(イメージ)
少し詳しい実装方法 送信側
 ProtoファイルからC#のクラスを生成してくれる
 開いたストリームにクラスをWriteすると送信になる
await m_DuplexStream.RequestStream.WriteAsync(new UserSesionToServiceRequest
{
RegisterUserSession = new RegisterUserSessionRequest
{
SessionId = Process.GetCurrentProcess().SessionId
}
});
クラス用のストリーム
メソッド(イメージ)
クラス(イメージ)
メソッドのパラメータ
(イメージ)
少し詳しい実装方法 受信側
 ProtoファイルからC#のクラスを生成してくれる
 開いたStreamをReadすると、受信したら制御が戻る
await foreach (var req in subscribe.RequestStream.ReadAllAsync(cancellationToken))
{
switch (req.ActionCase)
{
case UserSesionToServiceRequest.ActionOneofCase.RegisterUserSession:
{
var val = req.RegisterUserSession;
クラス用のストリーム
メソッド(イメージ)
クラス(イメージ)
メソッドのパラメータ
(イメージ)
まとめ
 全く同じではないが、WCFに近いイメージでプロセス間通信を実現できる
 同期でレスポンスを待つクラスを作れば、影響軽微で差し替えもできそう
 WCFを使っている人は、 .NET 5に向けて乗り換えを模索していきましょう

Contenu connexe

Tendances

オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
Yoshinori Matsunobu
 

Tendances (20)

がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
 
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみて
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
3週連続DDDその2  深いモデルの探求(ドメイン駆動設計 第3部)3週連続DDDその2  深いモデルの探求(ドメイン駆動設計 第3部)
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
 
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること 【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum NovemberDDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
 
Unicode文字列処理
Unicode文字列処理Unicode文字列処理
Unicode文字列処理
 

Similaire à WCFのパイプ通信を .NET 5に向けてgRPCへ置き換える話

Lync でできる? 仕事効率化
Lync でできる? 仕事効率化Lync でできる? 仕事効率化
Lync でできる? 仕事効率化
Manato KAMEYA
 

Similaire à WCFのパイプ通信を .NET 5に向けてgRPCへ置き換える話 (20)

Windowsサービスも.NET Coreで作ろう
Windowsサービスも.NET Coreで作ろうWindowsサービスも.NET Coreで作ろう
Windowsサービスも.NET Coreで作ろう
 
Web開発の 今までとこれから
Web開発の 今までとこれからWeb開発の 今までとこれから
Web開発の 今までとこれから
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのか
 
NSA NB委員会セミナー「モバイルアプリ開発業務におけるmonacaの活用」
NSA NB委員会セミナー「モバイルアプリ開発業務におけるmonacaの活用」NSA NB委員会セミナー「モバイルアプリ開発業務におけるmonacaの活用」
NSA NB委員会セミナー「モバイルアプリ開発業務におけるmonacaの活用」
 
まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送
まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送
まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送
 
Visual Studio Code のこれまでとこれから at OSC 2021 Online/Spring
Visual Studio Code のこれまでとこれから at OSC 2021 Online/SpringVisual Studio Code のこれまでとこれから at OSC 2021 Online/Spring
Visual Studio Code のこれまでとこれから at OSC 2021 Online/Spring
 
自社製品のバージョン管理 進化と問題解決の道のり
自社製品のバージョン管理 進化と問題解決の道のり自社製品のバージョン管理 進化と問題解決の道のり
自社製品のバージョン管理 進化と問題解決の道のり
 
〜laravel で学ぶ MVC
 〜laravel で学ぶ MVC 〜laravel で学ぶ MVC
〜laravel で学ぶ MVC
 
[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform
[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform
[REV UP] あなたならどう使う?最新Azureレシピ for LINE Platform
 
C++CLIで、ネイティブCの保守開発に.NETを使って楽をしよう
C++CLIで、ネイティブCの保守開発に.NETを使って楽をしようC++CLIで、ネイティブCの保守開発に.NETを使って楽をしよう
C++CLIで、ネイティブCの保守開発に.NETを使って楽をしよう
 
IPv6 アプリケーション開発入門
IPv6 アプリケーション開発入門IPv6 アプリケーション開発入門
IPv6 アプリケーション開発入門
 
PyCon JP 2014 plone terada
PyCon JP 2014 plone teradaPyCon JP 2014 plone terada
PyCon JP 2014 plone terada
 
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
アイデアを形にする  ③3時間でアプリ公開!ゼロからのプログラミング講座アイデアを形にする  ③3時間でアプリ公開!ゼロからのプログラミング講座
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
 
5 年続く 「はてなブックマーク」 アプリを継続開発する技術
5 年続く 「はてなブックマーク」 アプリを継続開発する技術5 年続く 「はてなブックマーク」 アプリを継続開発する技術
5 年続く 「はてなブックマーク」 アプリを継続開発する技術
 
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
 
ネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConViewネットワーク分散型フレームワークConView
ネットワーク分散型フレームワークConView
 
【デブサミ関西2014】Web技術で作るエンタープライズアプリ
【デブサミ関西2014】Web技術で作るエンタープライズアプリ【デブサミ関西2014】Web技術で作るエンタープライズアプリ
【デブサミ関西2014】Web技術で作るエンタープライズアプリ
 
組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)
 
JavaScript使いならきっととっつきやすいNode-REDについて
JavaScript使いならきっととっつきやすいNode-REDについてJavaScript使いならきっととっつきやすいNode-REDについて
JavaScript使いならきっととっつきやすいNode-REDについて
 
Lync でできる? 仕事効率化
Lync でできる? 仕事効率化Lync でできる? 仕事効率化
Lync でできる? 仕事効率化
 

WCFのパイプ通信を .NET 5に向けてgRPCへ置き換える話