.NET Framework 4 では、Windows Workflow Foundation に多数の機能が追加されています。 このドキュメントでは、いくつかの新機能について説明し、役に立つ可能性があるシナリオについて詳しく説明します。
メッセージング アクティビティ
メッセージング アクティビティ (Receive、 SendReply、 Send、 ReceiveReply) は、ワークフローからの WCF メッセージの送受信に使用されます。 Receive SendReply アクティビティは、標準の WCF Web サービスと同様に WSDL を介して公開される Windows Communication Foundation (WCF) サービス操作を形成するために使用されます。 Send と ReceiveReply は、WCF ChannelFactoryと同様の Web サービスを使用するために使用されます。サービス 参照の追加 エクスペリエンスは、事前構成済みのアクティビティを生成する Workflow Foundation にも存在します。
メッセージング アクティビティの概要
Visual Studio 2012 で、WCF ワークフロー サービス アプリケーション プロジェクトを作成します。 ReceiveとSendReplyのペアがキャンバスに配置されます。
プロジェクトを右クリックし、[ サービス参照の追加] を選択します。 既存の Web サービス WSDL をポイントし、[ OK] をクリックします。 プロジェクトをビルドして、生成されたアクティビティ ( Send と ReceiveReplyを使用して実装) をツールボックスに表示します。
メッセージング アクティビティのシナリオ例
BestPriceFinder
サービスでは、複数の航空会社サービスに呼び出され、特定のルートに最適な航空券価格が見つかります。 このシナリオを実装するには、メッセージ アクティビティを使用して価格要求を受信し、バックエンド サービスから価格を取得し、価格要求に最適な価格で応答する必要があります。 また、他の既定のアクティビティを使用して、最適な価格を計算するためのビジネス ロジックを作成する必要もあります。
WorkflowServiceHost
WorkflowServiceHostは、複数のインスタンス、構成、WCF メッセージングをサポートする既定のワークフロー ホストです (ただし、ワークフローはホストするためにメッセージングを使用する必要はありません)。 また、一連のサービス動作を通じて永続化、追跡、およびインスタンス制御と統合されます。 WCF の ServiceHostと同様に、 WorkflowServiceHost はコンソール/WinForms/WPF アプリケーションまたは Windows サービスでセルフホステッドすることも、IIS または WAS で (.xamlx ファイルとして) Web ホストすることもできます。
ワークフロー サービス ホストの概要
Visual Studio 2010 で、WCF ワークフロー サービス アプリケーション プロジェクトを作成します。このプロジェクトは、Web ホスト環境で WorkflowServiceHost を使用するように設定されます。
メッセージング以外のワークフローをホストするには、メッセージに基づいてインスタンスを作成するカスタム WorkflowHostingEndpoint を追加します。
ワークフロー インスタンスは、WorkflowServiceHostにWorkflowControlEndpointを追加し、WorkflowControlClientを使用して制御できます (中断または終了など)。
WorkflowServiceHostのサンプルについては、次のセクションを参照してください。
アプリケーション: 中断されたインスタンス管理
WorkflowServiceHost シナリオ
BestPriceFinderサービスは、特定のルートの最良のチケット価格を見つけるために複数の航空会社サービスに呼び出します。 このシナリオを実装するには、 WorkflowServiceHostでワークフローをホストする必要があります。 また、メッセージ アクティビティを使用して価格要求を受け取り、バックエンド サービスから価格を取得し、価格要求に最適な価格で応答します。
相関
相関関係は、次の 2 つのいずれかです。
メッセージをグループ化する方法。つまり、要求メッセージとその応答の関係です。
データの一部をサービス インスタンスにマッピングする方法
はじめに
関連付けの使用を開始するには、Visual Studio で新しいプロジェクトを作成します。 CorrelationHandle型の変数を作成します。
メッセージをグループ化するために使用される相関関係の例として、メッセージをグループ化する Request-Reply 関連付けがあります。
Receive アクティビティで、CorrelationInitializers プロパティをクリックし、上記の最初の手順で作成した CorrelationHandle を使用してRequestReplyCorrelationInitializerを追加します。
Receiveを右クリックし、[SendReply の作成] をクリックして、SendReply アクティビティを作成します。 Receive アクティビティの後にワークフローに貼り付けます。
データの一部をサービス インスタンスにマッピングする例としては、データの一部 (注文 ID など) を特定のワークフロー インスタンスにマップするコンテンツ ベースの相関関係があります。
- メッセージング アクティビティで、
CorrelationInitializers
プロパティをクリックし、上記で作成したCorrelationHandle変数を使用してQueryCorrelationInitializerを追加します。 ドロップダウン メニューからメッセージの目的のプロパティ (OrderID など) をダブルクリックします。CorrelatesWith
プロパティを、上記で使用したCorrelationHandle変数に設定します。
- メッセージング アクティビティで、
相関関係のシナリオ
注文処理ワークフローは、新しい注文の作成と処理中の既存の注文の更新を処理するために使用されます。 このシナリオを実装するには、 WorkflowServiceHost でワークフローをホストし、メッセージング アクティビティを使用する必要があります。 また、正しいワークフローに対する更新が確実に行われるように、 orderId
に基づく相関関係も必要になります。
簡略化された構成
WCF 構成スキーマは複雑であり、ユーザーに多くの見つけにくい機能を提供します。 .NET Framework 4.6.1 では、WCF ユーザーが次の機能を使用してサービスを構成できるように支援することに重点を置いてきた。
明示的なサービスごとの構成が不要になります。 サービスの <service> 要素を構成せず、サービスがプログラムによってエンドポイントを定義していない場合、一連のエンドポイントがサービスに自動的に追加され、サービスベースアドレスごとに 1 つ、サービスによって実装されたコントラクトごとに 1 つ追加されます。
ユーザーが WCF バインディングと動作の既定値を定義できるようにします。この値は、明示的な構成なしでサービスに適用されます。
標準エンドポイントは、再利用可能な事前構成済みエンドポイントを定義します。このエンドポイントには、1 つ以上のエンドポイント プロパティ (アドレス、バインド、コントラクト) の固定値があり、カスタム プロパティの定義が可能です。
最後に、 ConfigurationChannelFactory<TChannel> を使用すると、WCF クライアント構成を一元的に管理できます。これは、アプリケーション ドメインの読み込み時間後に構成が選択または変更されるシナリオで役立ちます。
はじめに
簡略化された構成シナリオ
経験豊富な ASMX 開発者が WCF の使用を開始したいと考えています。 ただし、WCF は複雑すぎるようです。 構成ファイルに書き込む必要があるすべての情報は何ですか? .NET 4 では、構成ファイルをまったく持たないようにすることもできます。
WCF サービスの既存のセットは、構成と保守が非常に困難です。 構成ファイルには、非常に危険な何千行もの XML コードがあります。 コードの量を管理しやすいものに減らすには、ヘルプが必要です。
データ コントラクト リゾルバー
.NET Framework 3.5 では、既知の型の設計にはいくつかの制限がありました。
シリアル化または逆シリアル化中に既知の型を動的に追加できませんでした。
シリアライザーは、不明な xsi:type 情報を処理できませんでした。
たとえば、ネットワーク上のシリアル化インスタンスのサイズを小さくする場合など、ネットワークに表示する xsi:type をユーザーが指定することはできませんでした。
DataContractResolver は、.NET Framework 4.5 でこれらの問題を解決します。
はじめに
データ コントラクト リゾルバーのシナリオ
サービスで数十個の KnownTypeAttribute オブジェクトを宣言する必要がなくなります。
XML BLOB のサイズを小さくする。
フローチャート
フローチャートは、ドメインの問題を視覚的に表すよく知られたパラダイムです。 これは、.NET Framework 4 で導入される新しい制御フロー スタイルです。 フローチャートの主な特徴は、特定の時点で 1 つのアクティビティのみが実行されるということです。 フローチャートではループや代替結果を表現できますが、複数のノードの同時実行をネイティブに表現することはできません。
はじめに
Visual Studio 2012 で、ワークフロー コンソール アプリケーションを作成します。 ワークフロー デザイナーでフローチャートを追加します。
フローチャート機能では、次のクラスを使用します。
サンプル:
デザイナーのドキュメント:
フローチャート シナリオ
フローチャート アクティビティを使用して、推測ゲームを実装できます。 推測ゲームは非常に簡単です:コンピュータは乱数を選択し、プレイヤーはその数を推測する必要があります。 プレイヤーが各推測を送信すると、コンピューターにヒントが表示されます (つまり、"小さい数値を試す" など)。 プレイヤーが 7 回未満で数を見つけた場合は、コンピューターから特別なお祝いを受け取ります。 このゲームは、次の手続き型アクティビティの組み合わせで実装できます。
手続き型アクティビティ (Sequence、If、ForEach、Switch、Assign、DoWhile、While)
手続き型アクティビティは、プログラマにとってなじみのある概念を使用してシーケンシャル制御フローをモデル化するメカニズムを提供します。 これらのアクティビティにより、従来の構造化されたプログラミング言語コンストラクトが可能になり、必要に応じて、C# や Visual Basic などの一般的な手続き型言語と同等の言語が提供されます。
はじめに
Visual Studio 2012 で、ワークフロー コンソール アプリケーションを作成します。 ワークフロー デザイナーで手続き型アクティビティを追加します。
サンプル:
デザイナーのドキュメント:
手続き型アクティビティのシナリオ
Parallel: イントラネット ドキュメント管理システムには、ドキュメント承認ワークフローがあります。 イントラネットに発行するには、複数の部門のユーザーがドキュメントを承認する必要があります。 承認のための確立された順序はありません。これらは、ドキュメントが "承認保留中" フェーズにある間、いつでも発生する可能性があります。 ユーザーがレビューのためにドキュメントを送信する場合は、直接管理者、イントラネット管理者、および内部通信マネージャーによって承認される必要があります。
ParallelForEach<T>: WF アプリケーションは、大企業内の企業の購入を管理します。 企業ルールでは、購買操作を計画する前に、3 つの異なる仕入先の評価が必要であることが規定されています。 購買部門の従業員が、会社の仕入先一覧から 3 つのベンダーを選択します。 これらのベンダーを選択して通知した後、会社は経済提案を待ちます。 提案は任意の順序で行うことができます。 WF でこのシナリオを実装するために、ベンダーのコレクションを反復処理し、経済的提案を求める ParallelForEach<T> を使用します。 すべてのオファーが収集されると、最適なプランが選択されて表示されます。
InvokeMethod
InvokeMethod アクティビティを使用すると、スコープ内のオブジェクトまたは型でパブリック メソッドを呼び出すことができます。 パラメーター (パラメーター配列を含む) の有無に関係なく、インスタンスメソッドと静的メソッドの呼び出しとジェネリック メソッドをサポートします。 また、メソッドを同期的および非同期的に実行することもできます。
はじめに
Visual Studio 2012 で、ワークフロー コンソール アプリケーションを作成します。 ワークフロー デザイナーで InvokeMethod アクティビティを追加し、静的メソッドとインスタンス メソッドを構成します。
デザイナーのドキュメント: InvokeMethod アクティビティ デザイナー
InvokeMethod のシナリオ
スコープ内のオブジェクト内のメソッドを呼び出す必要があります。 たとえば、値をディクショナリに追加する必要があります。 ディクショナリのインスタンスの Add メソッドが呼び出され、キーと値が提供されます。
従来の CLR オブジェクトでメソッドを呼び出す必要があります。 そのレガシ クラスへの呼び出しをラップするカスタム アクティビティを作成する代わりに、ワークフローの実行中にスコープ内にある場合は、 InvokeMethod 使用できます。
エラー処理アクティビティ
TryCatch アクティビティは、一連の包含アクティビティの実行中に発生する例外をキャッチするためのメカニズムを提供します (C# および Visual Basic の Try/Catch コンストラクトに似ています)。 TryCatch は、ワークフロー レベルで例外処理を提供します。 ハンドルされない例外がスローされると、ワークフローは中止され、Finally ブロックは実行されません。 この動作は C# と一致します。
はじめに
Visual Studio 2012 で、ワークフロー コンソール アプリケーションを作成します。 ワークフロー デザイナーで TryCatch アクティビティを追加します。
デザイナーのドキュメント: エラー処理アクティビティ デザイナー
エラー処理シナリオ
一連のアクティビティを実行する必要があり、エラーが発生したときに特定のロジックを実行する必要があります。 そのエラー処理ロジック中にエラーが回復できないことがわかった場合は、例外が再スローされ、親アクティビティ (またはホスト) が問題に対処します。
アクティビティの選択
Pick アクティビティは、WF でのイベント ベースの制御フロー モデリングを提供します。 Pick には、各ブランチが実行する前に特定のイベントが発生するのを待機する多数のブランチが含まれています。 このセットアップでは、 Pick は、アクティビティがリッスンしているイベントのセットの 1 つだけを実行する Switch<T> と同様に動作します。 各ブランチはイベント ドリブンであり、発生したイベントは最初に対応するブランチを実行します。 他のすべてのブランチは、イベントのリッスンを取り消して停止します。
はじめに
Visual Studio 2012 で、ワークフロー コンソール アプリケーションを作成します。 ワークフロー デザイナーで Pick アクティビティを追加します。
サンプル: Pick アクティビティの使用
デザイナーのドキュメント: アクティビティ デザイナーの選択
シナリオの選択
ユーザーに入力を求めるメッセージが表示される必要があります。 通常の状況では、開発者は ReadLine などのメソッド呼び出しを使用して、ユーザーの入力を求めます。 このセットアップの問題は、ユーザーが何かを入力するまでプログラムが待機することです。 このシナリオでは、ブロックアクティビティのブロックを解除するためにタイムアウトが必要です。 一般的なシナリオは、特定の期間内にタスクを完了する必要があるシナリオです。 ブロック アクティビティのタイムアウトは、Pick によって多くの値が追加されるシナリオです。
WCF ルーティング サービス
ルーティング サービスは、クライアントとサービスの間で WCF メッセージがどのように流れるかを制御できる汎用ソフトウェア ルーターとして設計されています。 ルーティング サービスを使用すると、クライアントをサービスから切り離すことができます。これにより、サポートできる構成と、サービスをホストする方法を検討する際の柔軟性の点で、はるかに自由になります。 .NET Framework 3.5 では、クライアントとサービスは緊密に結合されていました。クライアントは、通信に必要なすべてのサービスと、その場所について知る必要がありました。 さらに、.NET Framework 3.5 の WCF には次の制限がありました。
このロジックをクライアントにハードコーディングする必要があったので、エラー処理は複雑でした。
クライアントとサービスでは、常に同じバインディングを使用する必要がありました。
サービスが十分に考慮されることはほとんどありませんでした。複数のサービスを選択する必要はなく、すべてを実装する 1 つのサービスとクライアントが通信する方が簡単です。
.NET 4 のルーティング サービスは、これらの問題を解決しやすくするために設計されています。 新しいルーティング サービスには、次の機能があります。
コンテンツ ベースのルーティング (MessageFilter オブジェクトはメッセージを調べて、送信先を決定します)。
プロトコル ブリッジング (トランスポートとメッセージ)
エラー処理 (ルーターは通信例外をキャッチし、バックアップ エンドポイントにフェールオーバーします)
MessageFilterTable<TFilterData>とルーティング構成の動的 (メモリ内) 更新。
はじめに
ドキュメント: ルーティング
サンプル: ルーティング サービス [WCF サンプル]
ブログ: ルーティング規則!
ルーティング シナリオ
ルーティング サービスは、次のシナリオで役立ちます。
クライアントは、すべてのサービスに直接対処しなくても、複数のサービスと通信できます。
クライアントは、クライアント要求に対して追加のロジックを実行して、それをルーティングする場所を決定できます
クライアントが実行する操作を、クライアントをリファクタリングせずに複数のサービス実装に分解します。
クライアントとサービスは、異なるセキュリティ設定で異なるバインディングを話すことができます。
クライアントは、障害やサービスの利用不可に対してより堅牢にすることができます。
WCF 検出
WCF Discovery は、探索メカニズムをアプリケーション インフラストラクチャに組み込むことができるフレームワーク テクノロジです。 これを使用して、サービスを検出可能にし、サービスを検索するようにクライアントを構成できます。 クライアントをエンドポイントでハードコーディングする必要がなくなり、アプリケーションの堅牢性とフォールト トレラント性が高くなります。 Discovery は、自動構成機能をアプリケーションに組み込むのに最適なプラットフォームです。
プロダクトは WS-Discovery の標準の上に造られる。 相互運用可能、拡張可能、汎用に設計されています。 この製品では、次の 2 つの動作モードがサポートされています。
マネージド: ネットワーク上に既存のサービスに関する知識があるエンティティがある場合、クライアントは情報を直接照会します。 これは Active Directory に似ています。
アドホック: クライアントがマルチキャスト メッセージを使用してサービスを検索する場所。
さらに、探索メッセージはネットワーク プロトコルに依存しません。モード要件をサポートする任意のプロトコルでこれらを使用できます。 たとえば、探索マルチキャスト メッセージは、UDP チャネルまたはマルチキャスト メッセージングをサポートする他のネットワーク経由で送信できます。 これらの設計ポイントと機能の柔軟性を組み合わせることで、検出をソリューションに特に適応することができます。
はじめに
ドキュメント: WCF Discovery
サンプル: 検出 (サンプル)
探索シナリオ
開発者は、自分のサービスがいつ利用可能になるかは不明であるため、エンドポイントをハード コーディングすることを望んでいません。 代わりに、開発者は実行時にサービスを選択したいと考えています。 アプリケーションのコンポーネント間には、より多くの分離、堅牢性、自動構成が必要です。
トラッキング
ワークフロー追跡は、ワークフロー インスタンスの実行に関する分析情報を提供します。 追跡イベントは、ワークフロー インスタンス レベルでワークフローから生成され、ワークフロー内のアクティビティが実行されるときに生成されます。 追跡レコードをサブスクライブするには、ワークフロー追跡参加要素をワークフロー ホストに追加する必要があります。 追跡レコードは、追跡プロファイルを使用してフィルター処理されます。 .NET Framework には ETW (Windows イベント トレーシング) 追跡参加要素が用意されており、基本的なプロファイルが machine.config ファイルにインストールされます。
はじめに
Visual Studio 2010 で、WCF ワークフロー サービス アプリケーション プロジェクトを作成します。 開始するには、 Receive と SendReply のペアがキャンバスに配置されます。
web.config を開き、プロファイルのない ETW 追跡動作を追加します。
既定のプロファイルが使用されます。
イベント ビューアーを開き、次のノードで分析チャネルを有効にします。 イベント ビューアー、 アプリケーションとサービス ログ、 Microsoft、 Windows、 Application Server-Applications。 [分析] を右クリックし、 [ログの有効化] を選択します。
ワークフロー サービスを実行します。
イベント ビューアーでワークフロー追跡イベントを観察します。
サンプル: 追跡
概念ドキュメント: ワークフローの追跡とトレース
SQL ワークフロー インスタンス ストア
SqlWorkflowInstanceStoreは、インスタンス ストアの SQL Server ベースの実装です。 インスタンス ストアには、実行中のインスタンスの状態と、そのインスタンスの読み込みと再開に必要なすべてのデータが格納されます。 サービス ホストは、ワークフローが継続する場合はインスタンスの状態を保存するようにインスタンス ストアに指示し、そのインスタンスのメッセージが到着したとき、または遅延アクティビティの有効期限が切れたときにインスタンスの状態を読み込むようインスタンス ストアに指示します。
はじめに
Visual Studio 2012 で、暗黙的または明示的な Persist アクティビティを含むワークフローを作成します。 ワークフロー サービス ホストに SqlWorkflowInstanceStore 動作を追加します。 これは、コードまたはアプリケーション構成ファイルで行うことができます。
サンプル: 永続化
概念ドキュメント: SQL ワークフロー インスタンス ストア。
.NET