WCF 一方向サービス + WSHttpBinding の場合は信頼できるセッションを有効にする

一方向サービス を作成した場合、サービス提供側が ConcurrencyMode=ConcurrencyMode.Multiple であればメソッド自体はすぐに完了するが、クライアント側のプロキシインスタンスにを終了 Close しようとした場合にすべてのメソッドについてサービス提供側で完了するのを待つという現象が発生する。

これは、一方向サービスといえどメッセージ送信失敗はタイムアウトするまで待って本当に失敗したら例外を発生させるという仕様があり、信頼できるセッションではない場合 HTTPの返答があるのを待つためのようだ。 (What is the difference between WCF’s one way operation and .NET 2.0 asynchronous web service call? を参考にした。通信を実際に確認まではしていない)

一方で信頼できるセッション WS-ReliableMessaging を有効にした場合は、内部的に順序を保証するためのバッファが生成されるため、サービス提供側にリクエストメッセージが到着した時点でHTTP的には正常終了の返答が返ってくる。このためタイムアウトまで待つということがなくなる。

要するにバッファが生成されたことによる副作用なのであるが、オーバーヘッドよりは順序を保証してくれる方が嬉しいことが多いので、そういう点も含めて信頼できるセッションを有効にした方がよいだろう。

(逆にオーバーヘッドを嫌い軽量インターフェースとして実装したいのであれば、WS-*など使わず RESTful に振るべきだ。)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。