n階層システム設計の考慮点

第6回 WCFとWFを統合したアプリケーションの設計について

この記事を読むのに必要な時間:およそ 4.5 分

④ WCFとWFを統合したアプリケーションの設計時の注意点

このように,WCFとWFを統合すると,ワークフローをサービスとしてさまざまな分散システム技術を通して公開することが容易にできます。また,公開されたサービスをWFから使用することもできます。しかし,次の点について考慮する必要があります。

ワークフローでカスタムメイドしたWCFを含むアクティビティは多用しない

ワークフローとサービスは基本的に非同期で実行されます。そのため,WCFを含むアクティビティを使用する場合,意図しない時間がかかることがあります。また,WCFでの通信にはコストがかかるものもあります。これらを多用することにより,リソースを圧迫することもあります。

長時間ワークフローをWCFと連携して構築してサービス化する場合はリソースに注意する

長時間ワークフローでは途中経過のデータを保持する必要があります。これらは通常セッションとして保持されますが,WCFと連携する場合,連携時に生成されたデータも保持する必要があります。これにより,設計時には意図しなかったリソースを圧迫することもあります。

Webサービスとして公開する場合はさまざまな入力アクティビティを用意する必要がある場合がある

Webサービスとして公開する場合,接続されるクライアントが多枝にわたる場合があります。そのため,それぞれのクライアントにあったプロパティを持ったアクティビティを作成する必要があります。ここで,動的なプロパティを持ったWCFの構築を検討する方法もありますが,あまりお勧めできません。なぜならば管理が煩雑になるばかりでなく,実行が遅くなる可能性があります。

⑤ .NET Framework 3.5でのWCFとWFの統合

.NET Framework 3.5ではWFに2つのアクティビティが追加されました。

ReceiveActivity

図5 ビジュアルデザイナー上のReceiveActivity

図5 ビジュアルデザイナー上のReceiveActivity

WCFサービスコントラクトによって定義された操作を実装するサービス側アクティビティ。

ワークフローでWCFサービスコントラクトに定義された操作を実装する場合は,ReceiveActivityアクティビティが使用されます。ReceiveActivityは既に定義されたサービスコントラクトの操作を実装できるか,またはワークフロー自体内のサービスコントラクトおよび操作を定義できます。後者はワークフロー優先コントラクトと呼ばれます。

ReceiveActivityアクティビティでは,定義済みメッセージの交換パターンのセットをサポートします。次のようなパターンが含まれます。

一方向の受信

メッセージを送信するクライアントは,応答を送信するサービスを想定していません。

図6 一方向の受信イメージ

図6 一方向の受信イメージ
要求の受信 - 応答の送信

メッセージはReceiveActivityアクティビティによって受信および処理されてから,応答はクライアントに送信されます。

図7 要求の受信 - 応答の送信イメージ

図7 要求の受信 - 応答の送信イメージ
要求の受信 - エラーの送信

メッセージはReceiveActivityアクティビティによって受信および処理されてから,応答またはエラーはクライアントに送信されます。

図8 要求の受信 - エラーの送信イメージ

図8 要求の受信 - エラーの送信イメージ
(出典:Microsoft社 MSDNライブラリ)

SendActivity

図9 ビジュアルデザイナー上のSendActivity

図9 ビジュアルデザイナー上のSendActivity

WCFサービス操作の同期呼び出しをモデル化するクライアント側アクティビティ。

SendActivityアクティビティを使用すると,定義済みメッセージ交換パターンを使用してWCFサービスとのメッセージ交換に参加することができます。SendActivityアクティビティでサポートされるメッセージ交換パターンには,次が含まれます。

一方向の送信メッセージ

SendActivityアクティビティはメッセージを送信しますが,サービスからの応答を想定していません。

図10 一方向の送信メッセージイメージ

図10 一方向の送信メッセージイメージ
要求を送信し,応答を読み取り

SendActivityアクティビティはメッセージを送信し,応答をサービスから受信するまで待ちます。

図11 要求を送信し,応答を読み取りイメージ

図11 要求を送信し,応答を読み取りイメージ
要求を送信し,エラーを読み取り

SendActivityアクティビティはメッセージを送信し,応答またはエラーをサービスから受信するまで待ちます。

図12 要求を送信し,エラーを読み取りイメージ

図12 要求を送信し,エラーを読み取りイメージ
(出典:Microsoft社 MSDNライブラリ)

これらのアクティビティが追加されたことにより,WCFとの統合がとても容易になりました。しかし,前述したような作業手順および注意点はあまり変わりません。

今まではWFからWCFの呼び出しを行う場合,各操作ごとにカスタムアクティビティを作成し,これをワークフローに追加する必要がありました。しかし,.NET Framework 3.5から新しく追加された2つのアクティビティから,既に作成されているWCFサービスを呼び出す設定をするだけで作成することができるようになりました。これは作業手順,工数の大幅な削減が図ることができます。

また,今回の変更はアプリケーション開発者だけにとどまらず,Microsoft SharePoint ServicesやBizTalk等といった製品にも影響を与えています。今後,これらの機能を利用したアプリケーション構築はますます増えることと思われます。

著者プロフィール

露木敏博(つゆきとしひろ)

1966年神奈川県横浜市生まれ。1990年,株式会社日立システムアンドサービス(旧日立システムエンジニアリング株式会社)に入社。

流通系SE,営業所駐在SEなどを経て,2003年から生産技術部門で.NET技術に関する技術支援業務に携り,.NET技術に関する各種基準書および標準化,設計ガイドなどを作成。

マイクロソフトMVPアワードプログラムよりDevelopment Platforms - ASP/ASP.NETのカテゴリで2008年7月よりMVPアワードを受賞。