永続的な二重化による親子ワークフロー パターン

複雑で長期的なプロセスのワークフローを実装する場合の一般的な設計アプローチとして、ビジネス ロジックをより小さくて単純で再利用可能なワークフローに分け、その小さなワークフローをメインのワークフローから調整しながら実行するという方法がとられます。たとえば、購入注文処理の場合、出荷のロジックをワークフロー (子) として定義し、メインの購入注文ワークフロー (親) から必要に応じて呼び出されるようにすることができます。

.NET Framework 4 の Windows Workflow Foundation には、長時間実行されるワークフローを別のワークフローから "呼び出す" ための機能は組み込まれていません。しかし、そのようなビヘイビアーを手動で構成する実装オプションは豊富にあります。このサンプルでは、利用可能なすべてのオプションを説明するわけではありません。長時間実行される WCF ワークフロー サービス (XAMLX ワークフロー) のコンテキストに永続的な二重化という "呼び出しワークフロー" パターンを実装するための、最も一般的で汎用的なやり方を集中的に説明します。永続的な二重化パターンの背景にある考え方は単純で、親が、子によって公開されたエンドポイントを呼び出し、コンテキスト トークン (相関関係に使用)、コールバック アドレス、および要求メッセージを渡します。その後、子の処理が完了した時点で、子が親をコールバックして完了を通知します。

永続的な二重化の手動設定の詳細については、MSDN の記事「永続的な二重」 (https://go.microsoft.com/fwlink/?LinkId=196632) と関連する WF の「永続的な二重化のサンプル (https://go.microsoft.com/fwlink/?LinkId=194430)、および「方法: 別のワークフロー サービスを呼び出すワークフロー サービスの作成」を参照してください。

このサンプルの大きな目標は、IActivityTemplateFactory インターフェイスに基づき、構成プロセスを自動化することによって永続的な二重化を簡単に実装できるようにした、2 つのカスタム アクティビティを提供することです。Workflow Callable Sequence アクティビティは、ワークフローの作成時に生成される既定の Receive アクティビティや Send アクティビティの代わりに子ワークフローで使用されます。Call Workflow Sequence アクティビティは親ワークフローで使用され、子ワークフローとの通信に必要なアクティビティとその関連構成を生成します。これらのアクティビティは再利用可能で、Visual Studio ツールボックスに追加できます。

サンプルは次の 2 つのソリューションで構成されます。

  • 第 1 のソリューション (CallWorkflowActivities) には、上記 2 つのアクティビティが含まれます。Visual Studio ワークフロー デザイナーでこれら 2 つのアクティビティを使用できるように、このソリューションをコンパイルして、生成されたアセンブリからアクティビティを Visual Studio ツールボックスに追加します。

  • 第 2 のソリューション (DurableDuplex_with_CallWorkflowActivities) は、Workflow Callable Sequence アクティビティと Call Workflow Sequence アクティビティを使用して構成された親ワークフローと子ワークフローの永続的な二重化による通信を実装するサンプルです。

ヒント

サンプルは学習用としてのみ提供されています。運用環境での使用を目的としておらず、運用環境でのテストも行われていません。サンプルについてマイクロソフトのテクニカル サポートは提供されません。

前提条件

このサンプル アプリケーションは、次の経験または知識レベルを持つ読者を対象にしています。

  • インターネット インフォメーション サービス (IIS) の基礎知識

  • WCF および Windows Workflow Foundation (WF) アプリケーションの基本的知識

  • Windows PowerShell の基礎知識

  • Microsoft SQL Server の基礎知識

また、DurableDuplex_with_CallWorkflowActivities ソリューションを実行するには、Microsoft AppFabric 1.1 for Windows Server のホスティング サービス ランタイム機能がインストールされていて、次の機能が構成されている必要があります。

  • 永続化ストア

  • 監視ストア

サンプル アプリケーションの場所とファイル

ソリューション 1: CallWorkflowActivities

ファイル名 説明

CallWorkflowActivities.sln

CallWorkflowActivities ソリューションのソリューション ファイル

CallWorkflowActivities

プロジェクト フォルダー

CallWorkflowActivities.csproj

プロジェクト ファイル

Properties\AssemblyInfo.cs

アセンブリ情報ファイル

Activities\WorkflowCallableSequence.cs、Activities \CallWorkflowService.cs

2 つの IActivityTemplateFactory アクティビティ (WorkflowCallableSequence および CallWorkflowService) のソース ファイル

UI\CallWorkflowConfiguration.xaml、UI\CallWorkflowConfiguration.xaml.cs、UI\WebConfigContent.xaml、UI\WebConfigContent.xaml.cs、UI\WorkflowCallableSequenceConfiguration.xaml、UI\WorkflowCallableSequenceConfiguration.xaml.cs

永続的な二重化の構成に使用されるダイアログの UI デザイン ファイルとソース ファイル

Code\Helpers.cs

補助クラスを含むソース コード

Images\requiredBang.gif

必須のフィールド イメージ ファイル

ソリューション 2: DurableDuplex_with_CallWorkflowActivities

ファイル名 説明

DurableDuplex_with_CallWorkflowActivities.sln

DurableDuplex_with_CallWorkflowActivities ソリューションのソリューション ファイル

SampleChildService

Sample Child サービスのプロジェクト フォルダー

SampleChildService.csproj

Sample Child サービスのプロジェクト ファイル

Properties\AssemblyInfo.cs

アセンブリ情報ファイル

ChildWorkflow.xamlx

子サービスのワークフロー定義 (XAMLX)

Web.config

子サービスの Web 構成ファイル

SampleParentService

Sample Parent サービスのプロジェクト フォルダー

SampleParentService.csproj

Sample Parent サービスのプロジェクト ファイル

Properties\AssemblyInfo.cs

アセンブリ情報ファイル

ParentWorkflow.xamlx

親サービスのワークフロー定義 (XAMLX)

Web.config

親サービスの Web 構成ファイル

SampleClient

テスト クライアントのフォルダー

SampleClient.csproj

テスト クライアントのプロジェクト ファイル

mainForm.cs、mainForm.Designer.cs、mainForm.resx、Program.cs

メイン フォームとアプリケーションのソース ファイル

Properties\Resources.Designer.cs、Properties\Resources.resx、Properties\Settings.Designer.cs、Properties\Settings.settings

リソース関連ファイルとプロジェクト設定

Properties\AssemblyInfo.cs

アセンブリ情報ファイル

app.config

テスト クライアントのアプリケーション設定ファイル

このサンプルの設定

  1. 管理用のアクセス許可を使用して Visual Studio 2010 を起動します。

    ヒント

    ここでは、CallWorkflowActivities ソリューションと DurableDuplex_with_CallWorkflowActivities ソリューションを Visual Studio 2010 でビルドして展開し、これらのサービスでアプリケーション プールを使用できるように構成する方法を示します。

  2. <samples>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\CallWorkflowActivities.sln を開きます。<samples> の部分は、AppFabric サンプルがインストールされているパスです。

  3. [ビルド] メニューの [ソリューションのビルド] をクリックします。プロジェクトがビルドされ、出力ウィンドウにエラーが表示されないことを確認します。

    ヒント

    これで、WorkflowCallableSequence アクティビティと CallWorkflowService アクティビティを含むアセンブリのコンパイルが完了し、ツール バーに追加する準備ができました (詳細については「このサンプルの実行」を参照してください)。

  4. <samples>\ Samples\Integration\Call Workflow (DurableDuplex)\ DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln を開きます。<samples> の部分は、AppFabric サンプルがインストールされているパスです。

  5. SampleParentService プロジェクトと SampleChildService プロジェクトの仮想ディレクトリの作成を求めるメッセージが表示されたら、[はい] をクリックします。

  6. [ビルド] メニューの [ソリューションのビルド] をクリックします。3 つのプロジェクトがビルドされ、出力ウィンドウにエラーが表示されないことを確認します。

  7. インターネット インフォメーション サービス (IIS) マネージャーを起動します。[スタート] ボタンをクリックし、[すべてのプログラム]、[Microsoft AppFabric 1.1 for Windows Server]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。

  8. 左側のツリー ビューでサーバー ノードを展開し、[アプリケーション プール] をクリックします。

  9. 一覧で、サンプル サーバーを実行するプール (既存のプールを使用することも、新しいプールを作成することもできます) を右クリックし、[詳細設定] をクリックします。

  10. [.NET Framework バージョン] ボックスの一覧で [v4.0] を選択して [OK] をクリックします。

  11. 左側のウィンドウで、[サイト] を展開し、[既定の Web サイト] を展開します。

  12. [SampleChildService] アプリケーションを見つけて右クリックし、[アプリケーションの管理] を選択して [詳細設定] をクリックします。

  13. "有効なプロトコル" プロパティを [http] から [http,net.pipe] に更新します。コンマの後にスペースがないことに注意してください。[OK] をクリックして、変更を確定します。

  14. "アプリケーション プール" プロパティで、手順 9. で構成したアプリケーション プールを探して選択します。

  15. [SampleParentService] アプリケーションを見つけて右クリックし、[アプリケーションの管理] を選択して [詳細設定] をクリックします。

  16. "有効なプロトコル" プロパティを [http] から [http,net.pipe] に更新します。コンマの後にスペースがないことに注意してください。[OK] をクリックして、変更を確定します。

  17. "アプリケーション プール" プロパティで、手順 9. で構成したアプリケーション プールを探して選択します。

    ヒント

    手順の 13. ~ 16. によって、net.pipe プロトコルが親および子のサービス アプリケーションに追加されます。これは、永続化ワークフロー インスタンスの管理に必要です。

このサンプルの実行: オプション 1

  1. 管理用のアクセス許可を使用して Visual Studio 2010 を起動します。

    重要

    このサンプルを実行するには 2 とおりの方法があり、ここでは両方の手順について説明します。オプション 1 では WorkflowCallableSequence アクティビティと CallWorkflowService アクティビティを使用して親ワークフローから子ワークフローを呼び出す手順を詳しく示します。一方、オプション 2 では、設計作業を完全に省略して、実行準備の整った永続的な二重化の実装が完成します。詳細については、後の「デモ」セクションを参照してください。

    ヒント

    CallWorkflowActivities ソリューションは、永続的な二重化の実装の設計を体験することを目的としています。そのため、"実行" するものはありません。ただし、以下の手順では、親ワークフローが子ワークフローを呼び出すという単純なソリューションにおけるアクティビティの使い方を詳しく説明します。

  2. 新しいプロジェクトを作成して種類を [WCF ワークフロー サービス アプリケーション] に設定し (このプロジェクト テンプレートはワークフロー プロジェクトの下にあります)、新しいプロジェクトの名前を「ChildService」と指定します。

  3. サンプルのカスタム アクティビティをツールボックスに追加する: WF デザイナーが表示されたら、ツールボックスを [メッセージング] アクティビティ グループの中で右クリックします。

  4. [アイテムの選択] を選択して [System.Activities コンポーネント] タブをクリックします。

  5. [参照] をクリックし、<samples>\ Samples\Integration\Call Workflow (DurableDuplex)\ CallWorkflowActivities\ CallWorkflowActivities\bin\Debug を表示します。その後、CallWorkflowActivities.dll アセンブリを選択し、[開く] をクリックします (これは、このドキュメントの「このサンプルの設定」セクションの手順 3. でコンパイルしたアセンブリです)。System.Activities コンポーネント一覧の一番上に 2 つの新しいエントリがあります。

  6. [OK] をクリックして、CallWorkflowService アクティビティと WorkflowCallableSequence アクティビティをツールボックスに追加します。ツールボックスは次のスクリーン ショットのようになっています。

  7. ChildService ワークフローを実装する: ソリューション エクスプローラーで、Service1.xamlx の名前を ChildService.xamlx に変更します。

  8. ChildService の主要デザイナー領域で [シーケンシャル サービス] アクティビティを選択し、Del キーを押します。

  9. ツールボックスから WorkflowCallableSequence アクティビティを WF デザイナー画面にドラッグします。構成ダイアログが開きます。指示に従って、ChildService を永続的な二重化の参加者として設定します。

  10. WorkflowCallableSequence を構成する: 次のスクリーン ショットに示されたプロパティを入力して、[OK] をクリックします。

  11. web.config ファイルを更新する: 永続的な二重化の実装の機能は、web.config エントリが適切であることに大きく依存しています。Web.config の更新画面では、子ワークフローの web.config ファイルに必要なエントリが自動生成されます。

    ヒント

    web.config ファイル自体は自動更新されません。次の手順で、必要なエントリを web.config ファイルにコピーして貼り付けます。

  12. [クリップボードにコピーして閉じる] をクリックします。ハイライト表示された必須エントリがクリップボードにコピーされ、web.config ファイルに貼り付ける準備ができます。メッセージ ボックスで [OK] をクリックします。

  13. ChildService サービス プロジェクトの web.config ファイルを開き、<system.serviceModel> タグの直後にクリップボード (手順 12.) の内容を貼り付けます。

    ...
      <system.serviceModel>
    
        <services>
          <service name="ChildService">
            <endpoint address="" binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceStartWorkflow" />
          </service>
        </services>
        <client>
          <endpoint binding="wsHttpContextBinding" contract="ICallChildService" name="ChildServiceICallChildServiceWorkflowCompleted" />
        </client>
    
        <behaviors>
      ...
    
  14. ChildService 実装を完了する: 単純にするために、このワークフローのボディでは要求の値を応答に割り当てるだけです (どちらも既定の文字列ですが、実際の実装ではデータ コントラクトに更新できます)。

    1. ツールボックスから [Delay] アクティビティを [Body] シーケンスにドラッグします。[Delay] アクティビティでプロパティを構成し、[Duration = New TimeSpan(0, 2, 0)] を設定します。

    2. ツールボックスから [Assign] アクティビティを [Body] シーケンスにドラッグし、[Delay] シーケンスの直後に配置します。[Assign] アクティビティでプロパティを構成し、[To = response; Value = request] を設定します。

    3. プロジェクトを保存します。

  15. IIS/WAS ホスティング用にサービスを有効化する: ワークフローを IIS/WAS および AppFabric でのホスティング用に構成するには、ソリューション エクスプローラーで ChildService プロジェクト (ソリューションではない) を右クリックし、[プロパティ] を選択します。

  16. 3 番目の構成ページ [Web] を選択し、サーバーの選択で [ローカル IIS Web サーバーを使用する] を選択します。[仮想ディレクトリの作成] をクリックした後、ポップアップ メッセージ ボックスで [OK] をクリックします。プロジェクトを保存します。

  17. ParentService ワークフローの作成: ソリューション エクスプローラーで、ソリューション (プロジェクトではない) を右クリックし、[追加] をポイントして [新しいプロジェクト] をクリックします。プロジェクトの種類に [WCF ワークフロー サービス アプリケーション] を選択し、新しいプロジェクトの名前を「ParentService」と指定します。[OK] をクリックします。

  18. ソリューション エクスプローラーで [Service1.xamlx] の名前を [ParentService.xamlx] に変更します。

  19. ツールボックスから [CallWorkflowService] アクティビティを WF デザイナー画面にドラッグし、[SendResponse] アクティビティの直後に配置します。CallWorkflowService の構成ダイアログが表示されます。

  20. 省略記号ボタン ([...]) をクリックして、以前の手順で作成した ChildService.xamlx ワークフロー定義を参照し、手順 10. で選択したプロトコルに合わせて [wsHttpContextBinding] を選択します。構成ウィンドウは次のスクリーン ショットのようになっています。

    ヒント

    要求/応答サービス コントラクトと操作の名前に関するすべての設定は、子サービス定義から自動的に検出されています。

  21. [OK] をクリックします。

  22. web.config ファイルを更新する: [Web.config の更新] ダイアログが表示されます。子サービスとの接続に必要なエントリが設定されています。実際の子エンドポイント アドレスだけでなくコールバック エンドポイント アドレスの入力も必要です。

  23. [クリップボードにコピーして閉じる] をクリックします。ハイライト表示された web.config エントリがクリップボードにコピーされ、web.config ファイルに貼り付ける準備ができます。ポップアップ メッセージ ボックスで [OK] をクリックします。

  24. ParentService プロジェクトの web.config ファイルを開き、<system.serviceModel> 要素の直後にクリップボードの内容を貼り付けます。

    ヒント

    XML の IMPORTANT コメントに注意してください。親サービスもクライアントに対してエンドポイントを公開する必要があります。このサンプルでは、コメント部分に定義されたサンプル <endpoint> を使用できます。web.config ファイルは次のようになっています。

    ...
      <system.serviceModel>
    
        <services>
          <service name="Service1">
            <endpoint address="" binding="basicHttpBinding" contract="IService" />
            <endpoint address="ChildCallback" binding="wsHttpContextBinding" contract="ICallChildService" name="Service1ICallChildServiceWorkflowCompleted" />
          </service>
        </services>
        <client>
          <endpoint address="https://localhost/ChildService/ChildService.xamlx" binding="wsHttpContextBinding" bindingConfiguration="Service1ICallChildService_InitCallback" contract="ICallChildService" name="Service1ICallChildServiceStartWorkflow" />
        </client>
        <bindings>
          <wsHttpContextBinding>
            <binding name="Service1ICallChildService_InitCallback" clientCallbackAddress="https://localhost/ParentService/ParentService.xamlx/ChildCallback" />
          </wsHttpContextBinding>
        </bindings>
    
        <behaviors>
          <serviceBehaviors>
      ...
    
  25. ParentService 実装を完了する: 親ワークフローは、パラメーター値を子サービスのサービス呼び出しに渡す必要があります。

    1. 値を要求に割り当てるには、ツールボックスから [Assign] アクティビティを [Call Workflow] シーケンスにドラッグし、[Send Request] アクティビティの直前に配置します。[Assign] アクティビティでプロパティを構成し、[To = request; Value = data.ToString] を設定します。

    2. プロジェクトを保存します。

  26. IIS/WAS ホスティング用に ParentService を有効化する: ワークフローを IIS/WAS および AppFabric でのホスティング用に構成するには、ソリューション エクスプローラーで ParentService プロジェクト (ソリューションではない) を右クリックし、[プロパティ] を選択します。

  27. 3 番目の構成ページ [Web] を選択し、サーバーの選択で [ローカル IIS Web サーバーを使用する] を選択します。[仮想ディレクトリの作成] をクリックした後、ポップアップ メッセージ ボックスで [OK] をクリックします。プロジェクトを保存します。

  28. ソリューションをビルドします。

  29. 永続的な ParentService サービスと ChildService サービスのホスティング用に IIS/WAS を構成する: インターネット インフォメーション サービス (IIS) マネージャーを起動します。[スタート] ボタンをクリックし、[すべてのプログラム]、[Microsoft AppFabric 1.1 for Windows Server]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。

  30. 左側のウィンドウで、[サイト] を展開し、[既定の Web サイト] を展開します。

  31. [ChildService] アプリケーションを見つけて右クリックし、[アプリケーションの管理] を選択して [詳細設定] をクリックします。

  32. "有効なプロトコル" プロパティを http から [http,net.pipe] に更新します (コンマの後にスペースがないことに注意してください)。[OK] をクリックして、変更を確定します。

  33. [ParentService] アプリケーションを見つけて右クリックし、[アプリケーションの管理] を選択して [詳細設定] をクリックします。

  34. "有効なプロトコル" プロパティを http から [http,net.pipe] に更新します (コンマの後にスペースがないことに注意してください)。[OK] をクリックして、変更を確定します。

  35. WCFTestClient を実行して親ワークフロー インスタンスを開始します。次のコマンドを実行して WCF テスト クライアント アプリケーションを実行します。C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe (32 ビット プラットフォームの場合) または C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe (64 ビット プラットフォームの場合)。

  36. [Add]、[Add Service] を順に選択して親サービス (https://localhost/ParentService/ParentService.xamlx) への参照を追加します。

  37. 参照を追加した後、GetData() メソッドをダブルクリックし、整数パラメーター値として左側のウィンドウに「123」と入力します。[呼び出す] をクリックします。

  38. AppFabric ダッシュボードを使用して、ParentService インスタンスと ChildService インスタンスのステータスをチェックします。ChildService の完了後、親は子から完了通知を受け取るため、親も完了することがわかります。

このサンプルの実行: オプション 2

  1. 管理用のアクセス許可を使用して Visual Studio 2010 を起動します。

    重要

    このサンプルを実行するには 2 とおりの方法があり、ここでは両方の手順について説明します。オプション 1 では WorkflowCallableSequence アクティビティと CallWorkflowService アクティビティを使用して親ワークフローから子ワークフローを呼び出す手順を詳しく示します。一方、オプション 2 では、設計作業を完全に省略して、実行準備の整った永続的な二重化の実装が完成します。詳細については、後の「デモ」セクションを参照してください。

  2. <samples>\ Samples\Integration\Call Workflow (DurableDuplex)\ DurableDuplex_with_CallWorkflowActivities\ DurableDuplex_with_CallWorkflowActivities.sln を開きます。<samples> の部分は、AppFabric サンプルがインストールされているパスです。

  3. SampleClient がスタートアップ プロジェクトとして設定されていることを確認します (SampleClient プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] をクリックします)。

  4. F5 キーを押してサンプルを実行します。サンプル テスト クライアント アプリケーションが起動します。

  5. [Call Parent Service] をクリックします。

  6. Workflow Instances というテキストを確認します。親ワークフローと子ワークフローの開始/完了イベントが表示されます。このサンプルでは、親は ParallelForEach アクティビティを使用して子サービスの 3 つのインスタンスを並行して開始し、3 つの子がすべて完了した時点で完了します。AppFabric ダッシュボードを使用して、親/子サービスの実行インスタンスを追跡することもできます。

    ヒント

    子ワークフローは 2 分間休止した後に開始されます。この間、親と子のすべてのインスタンスはアイドル モードに入り、永続化ストアで保持されます。2 分間の経過後に完了イベントが発生します。

このサンプルの削除

  1. インターネット インフォメーション サービス (IIS) マネージャーを起動します。[スタート] ボタンをクリックし、[すべてのプログラム]、[Microsoft AppFabric 1.1 for Windows Server]、[インターネット インフォメーション サービス (IIS) マネージャー] の順にクリックします。

  2. 左側のツリー ビューでサーバー ノードを展開します。[サイト] を展開し、[既定の Web サイト] を展開します。

  3. [SampleChildService] ノードをクリックして [削除] をクリックします。

  4. 選択したアプリケーションの削除を確認するメッセージが表示されたら、[はい] をクリックします。

  5. [SampleParentService] ノードをクリックして [削除] をクリックします。

  6. 選択したアプリケーションの削除を確認するメッセージが表示されたら、[はい] をクリックします。

  7. 「このサンプルの実行」のオプション 1 の手順を実行していた場合は、次の操作も実行する必要があります。

    1. [ChildService] ノードをクリックして [削除] をクリックします。

    2. 選択したアプリケーションの削除を確認するメッセージが表示されたら、[はい] をクリックします。

    3. [ParentService] ノードをクリックして [削除] をクリックします。

    4. 選択したアプリケーションの削除を確認するメッセージが表示されたら、[はい] をクリックします。

デモ

このサンプルを実行するには 2 とおりの方法があり、ここでは両方の手順について説明します。オプション 2 よりもオプション 1 をお勧めします。オプション 1 では WorkflowCallableSequence アクティビティと CallWorkflowService アクティビティを使用して親ワークフローから子ワークフローを呼び出す手順を詳しく見ることができ、それがこのサンプルの主な目的であるためです。オプション 2 では、設計作業を完全に省略して、実行準備の整った永続的な二重化の実装が完成します。

「このサンプルの実行」のオプション 1 では、プロジェクトで 2 つのカスタム アクティビティを使用する方法を示しています。

最初に、子ワークフロー サービスが作成されます。既定のシーケンシャル サービス アクティビティを削除し、WorkflowCallableSequence "アクティビティ" で置き換えます。WorkflowCallableSequence は、アクティビティ テンプレート ファクトリです。ユーザー入力に基づいて、コールバック相関関係をサポートするようにメッセージング アクティビティ (Receive と Send) が生成および構成されます。コールバック相関関係には、要求コンテキストと、コールバック アドレスが必要です。要求コンテキストは一意なコンテキスト トークンを格納し、相関関係を親に返すために使用されます。コールバック アドレスは完了通知の送信先です。Receive アクティビティでは、受信した要求からのコールバック相関関係ハンドルが初期化されます。Send アクティビティでは、そのハンドルを使用し、最初の要求と共に渡された動的なコールバック アドレスで親に完了通知が返信されます。

また、WorkflowCallableSequence ロジックでは、サービスの web.config エントリ、サービスとクライアントのエンドポイント、および必須のバインディング エントリが生成されます。

次の手順で、親ワークフロー サービスが作成されます。CallWorkflowService アクティビティ テンプレート ファクトリでは、子定義を要求し、その構成を検証し、これに基づいて子との永続的な二重化通信に必要なメッセージング アクティビティ (Send と Receive) が生成されます。Send アクティビティでは、コールバック相関関係が初期化され (論理的には、ここで一意なコンテキスト トークンが生成され、要求と共に子ワークフローに渡されます)、Receive アクティビティでは、子ワークフローから同じコンテキスト トークンを使用して返された完了通知を関連付けます (Send アクティビティで初期化された相関関係ハンドルと関連付けます)。

また、CallWorkflowService ロジックでは、サービスの web.config エントリ、サービスとクライアントのエンドポイント、および必須のバインディング エントリが生成されます。カスタムのバインディング構成の定義で clientCallbackAddress 属性が使用されることに注意してください。これは、適切な呼び出し元 (この場合は親ワークフロー) に動的に返信できるように、クライアントへの要求メッセージに含められるアドレスです。

「このサンプルの実行」のオプション 2 では、子ワークフローの WorkflowCallableSequence と親ワークフローの CallWorkflowService を使用して実装された永続的な二重化ソリューションが、実行準備の整った状態で提供されます。

クライアントは親サービスを呼び出し、親はこれを受けて ParallelForEach アクティビティを使用して子サービスの 3 つのインスタンスを並行して開始します。子サービスは、親からの最初のメッセージを受信した後、2 分間休止し (Delay アクティビティを使用)、その後、完了通知を親に返信します。親は子サービスのすべてのインスタンスが完了した時点でのみ完了します。親インスタンスと子インスタンスはどちらも、"Samples" をソースとして使用してアプリケーション イベント ログにエントリを書き込みます。クライアントの UI では、アプリケーション イベント ログでこのイベント ソースを監視し、完了イベントを [Workflow Instances] ボックスに表示します。

  2012-03-05