方法:Workflow Manager 1.0 のワークフローを発行および実行する

 

Workflow Manager 1.0 の入門チュートリアル」のこの手順では、スコープを作成し、アクティビティとワークフローを発行し、ワークフローを呼び出す Workflow Client アプリケーションを作成します。さらにこの手順では、Workflow Resource Browser の例も紹介します。

System_CAPS_noteメモ

ビデオ チュートリアルを視聴する、または Workflow Resource Browser の例を含むスターター ファイルとチュートリアルの完全なバージョンをダウンロードするには、「Workflow Manager 1.0 - 入門チュートリアル」を参照してください。

Microsoft.Workflow.Samples.Common プロジェクトには、スコープ、アクティビティ、ワークフローの発行といったワークフロー マネージャー プロジェクトの管理を簡単にするヘルパー クラスや拡張メソッドが含まれています。これは、この手順でソリューションに追加します。

  1. Workflow Manager 1.0 - 入門チュートリアル」からチュートリアル用のスターター ファイルをダウンロードします。

  2. 方法:Workflow Manager 1.0 のカスタム アクティビティを作成する にソリューションが表示されていない場合は、チュートリアルの前の手順「Visual Studio 2012」のソリューションを開きます。

  3. ソリューション エクスプローラーで [WFMgrGettingStarted] を右クリックし、[追加]、[Existing Project] (既存のプロジェクト) の順に選択します。

  4. チュートリアルのスターター ファイルを展開した場所を参照し、次のフォルダーに移動します。

    <スターター ファイルの場所>\Start\Microsoft.Workflow.Samples.Common

  5. [Microsoft.Workflow.Samples.Common.csproj] を選択して、[開く] をクリックします。

  6. Ctrl+Shift+B キーを押してソリューションをビルドします。

この手順では、Workflow Client アプリケーションを作成します。Workflow Client アプリケーションは、スコープを作成し、アクティビティとワークフローを発行し、ワークフローを呼び出します。ワークフローの実行中、クライアント アプリケーションは状態の更新をポーリングし、検索で取得した製品を含む状態を表示します。アプリケーションが終了すると、スコープがクリーンアップされ、ワークフローの成果物が削除されます。

  1. ソリューション エクスプローラーで [WFMgrGettingStarted] を右クリックし、[追加]、[新しいプロジェクト] の順に選択します。

  2. [インストール済み] ノードで、[Visual C#]、[Windows] の順に選択します。[.NET Framework バージョン] ドロップダウン リストで [.NET Framework 4.5] が選択されていることを確認します。一覧から [コンソール アプリケーション] を選択します。[名前] ボックスに「GetProductsWorkflowClient」と入力し、[OK] をクリックします。

  3. ソリューション エクスプローラーで [GetProductsWorkflowClient] を右クリックし、[参照の追加] を選択します。

  4. [参照の追加] の一覧から [ソリューション] を選択し、[Microsoft.Workflow.Samples.Common] と [GetProductsActivities] の横にあるチェック ボックスをオンにします。

  5. [参照] ボタンをクリックし、C:\Program Files\Reference Assemblies\Microsoft\Workflow Manager\1.0 に移動します。

  6. [Microsoft.Workflow.Client.dll] と [Microsoft.Activities.dll] を選択して、[追加] をクリックします。

  7. [OK] をクリックして、[Reference Manager] (参照マネージャー) ウィンドウを閉じて参照を追加します。

  8. ソリューション エクスプローラー で [Program.cs] をダブルクリックしてコードを表示します。

  9. ステートメントを使用して、ファイルの一番上に次のコードを追加します。それ以外の場合にもステートメントを使用します (Snippet3)。

    using Microsoft.Workflow.Client;
    using Microsoft.Workflow.Samples.Common;
    
    System_CAPS_tipヒント

    チュートリアルにはスニペット ファイルが用意されています。これらを使用するには、「Workflow Manager 1.0 - 入門チュートリアル」からチュートリアル用のスターター ファイルをダウンロードします。Visual Studio で、[ツール] メニューから [Code Snippets Manager] (コード スニペット マネージャー) を選択します。[言語] ドロップダウンから [Visual C#] を選択し、[追加] ボタンをクリックします。スターター ファイルを展開した場所を参照し、Assets\WFMgrGettingStarted フォルダーを選択します。[Select Folder] (フォルダーの選択) をクリックし、[OK] をクリックします。コード ファイルでスニペットを挿入する場所を右クリックし、[Insert Snippet] (スニペットの挿入) を選択します。一覧を下にダウンロードして、[WFMgrGettingStarted] をダブルクリックし、必要なスニペットをダブルクリックします。

  10. 次の 2 つの静的メンバー変数を Program クラスに追加します (Snippet4)。

    static string workflowName = "GetProductsWorkflow";
    static string baseAddress = "https://<Base address>:12290/";
    
    System_CAPS_important重要

    baseAddress は Workflow Manager サーバーをポイントする必要があります。Workflow Manager サーバーを開発用コンピューターにホストしている場合は、コンピューター名を確認することでこの名前を取得することができます。コンピューター名を確認するには、[スタート] をクリックし、[コンピューター] を右クリックして、フル コンピューター名を表示します。フル コンピューター名を使用して、baseAddress を次のように構成します。https://Full computer name:12290 (例: https://mycomputername:12290/ または https://myserver.mydomain.mycompany.com:12290/)。

  11. 次のコード行を Main メソッドに追加します (Snippet5)。

    Console.Write("Setting up scope...");
    WorkflowManagementClient client = WorkflowUtils.CreateForSample(baseAddress, "WFMgrGettingStarted");
    WorkflowUtils.PrintDone();
    
    Console.Write("Publishing GetProducts activity...");
    client.PublishActivity("GetProducts", @"..\..\..\GetProductsActivities\GetProducts.xaml");
    WorkflowUtils.PrintDone();
    
    Console.Write("Publishing Workflow...");
    client.PublishWorkflow(workflowName, @"..\..\..\GetProductsActivities\GetProductsWorkflow.xaml");
    WorkflowUtils.PrintDone();
    
    

    このコードは Microsoft.Workflow.Samples.Common プロジェクトに定義されている拡張メソッドとヘルパー クラスを使用して、スコープ、アクティビティ、ワークフローの発行やそれらの管理といったタスクを簡略化します。この手順で説明するコードは、スコープを作成し、返された WorkflowManagementClient インスタンスを使用して GetProductsGetProductsWorkflow をスコープに発行します。

  12. 次のコード行を、前のコード行に続くように Main メソッドに追加します。このコードがあると、Northwind OData サービスの検索時に使用する検索用語の入力を求められます (Snippet6)。

    Console.Write("Enter a search keyword: ");
    string SearchKeyword = Console.ReadLine();
    
  13. 前の手順のコードの後に次のコード行を追加して、ワークフロー インスタンスを開始します (Snippet7)。

    Console.Write("Starting workflow instance...");
    WorkflowStartParameters startParameters = new WorkflowStartParameters();
    startParameters.Content.Add("SearchKeyword", SearchKeyword);
    string instanceId = client.Workflows.Start(workflowName, startParameters);
    WorkflowUtils.PrintDone();
    

    このコードはワークフローの開始パラメーター (ワークフローの In 引数にマッピング) をアセンブルし、それらを使用してワークフローのインスタンスを開始します。

  14. 前の手順のコードに続くように次のコードを Main に追加します (Snippet8)。

    Console.WriteLine("\nPolling UserStatus...\n");
    string finalUserStatus = client.WaitForWorkflowCompletion(workflowName, instanceId);
    WorkflowUtils.Print("Completed with status: " + finalUserStatus, ConsoleColor.Green);
    

    このコードは、WaitForWorkflowCompletion プロジェクトに定義されている Microsoft.Workflow.Samples.Common 拡張メソッドを使用して、ワークフローが終了するのを待ち、待機中に SetStatus アクティビティに設定される状態の更新をポーリングします。

  15. 前の手順のコードに続くように次のコードを Main の最後に追加します (Snippet9)。

    Console.WriteLine("Press any key to clean up scope.");
    Console.ReadKey();
    
    client.CleanUp();
    
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
    

    スコープがクリーンアップされると、ワークフローの成果物が削除され、その後スコープが削除されます。本番シナリオでは、通常これらのタスクは管理者が行いますが、この例ではコードで実行しています。

    次の例には、Program クラス全体が含まれています (Snippet10)。

    class Program
    {
        static string workflowName = "GetProductsWorkflow";
        static string baseAddress = "https:<Base address>:12290/";
    
        static void Main(string[] args)
        {
            Console.Write("Setting up scope...");
            WorkflowManagementClient client = WorkflowUtils.CreateForSample(baseAddress, "WFMgrGettingStarted");
            WorkflowUtils.PrintDone();
    
            Console.Write("Publishing GetProducts activity...");
            client.PublishActivity("GetProducts", @"..\..\..\GetProductsActivities\GetProducts.xaml");
            WorkflowUtils.PrintDone();
    
            Console.Write("Publishing Workflow...");
            client.PublishWorkflow(workflowName, @"..\..\..\GetProductsActivities\GetProductsWorkflow.xaml");
            WorkflowUtils.PrintDone();
    
            Console.Write("Enter a search keyword: ");
            string SearchKeyword = Console.ReadLine();
    
            Console.Write("Starting workflow instance...");
            WorkflowStartParameters startParameters = new WorkflowStartParameters();
            startParameters.Content.Add("SearchKeyword", SearchKeyword);
            string instanceId = client.Workflows.Start(workflowName, startParameters);
            WorkflowUtils.PrintDone();
    
            Console.WriteLine("\nPolling UserStatus...\n");
            string finalUserStatus = client.WaitForWorkflowCompletion(workflowName, instanceId);
            WorkflowUtils.Print("Completed with status: " + finalUserStatus, ConsoleColor.Green);
    
            Console.WriteLine("Press any key to clean up scope.");
            Console.ReadKey();
    
            client.CleanUp();
    
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
    

System_CAPS_important重要

このセクションの手順では、Visual Studio を管理モードで実行する必要があります。Visual Studio を管理モードで起動していない場合は、Visual Studio を閉じてから管理モードで再起動し、ソリューションを開き直します。

  1. ソリューション エクスプローラーで [GetProductsWorkflowClient] を右クリックし、[スタートアップ プロジェクトに設定] を選択します。

  2. Ctrl+F5 キーを押してアプリケーションを起動します。

    System_CAPS_tipヒント

    サンプルの実行時に問題が生じた場合は、「トラブルシューティングの手順」でよくある問題の解決方法を参照してください。

  3. スコープがセットアップされ、GetProducts アクティビティと GetProductsWorkflow が発行され後で、入力を求められたら「choc」などの検索用語を入力して ENTER キーを押します。この検索用語は、Northwind サンプル データベースの製品の検索に使用されます。データベース内の最初の 20 個 (このサンプルが返す最大数) の製品が返されるようにするには、検索用語を入力せずに ENTER キーを押します。

    GetProducts アクティビティは、http://services.odata.org/Northwind/Northwind.svc にホストされる Northwind OData サービスを検索し、検索キーワードに一致する製品を含む DynamicValue を返します。その後、GetProductsWorkflow はその中を反復し、SetUserStatus アクティビティを使用してユーザーの状態の更新として指定します。クライアント アプリケーションはこれらの状態の更新をポーリングし、製品を表示します。アプリケーションが終了すると、スコープをクリーンアップするために何かキーを押すよう求められます。

  4. 任意のキーを押すとスコープがクリーンアップされ、さらに任意のキーを押すと終了します。

  5. Ctrl+F5 キーを押してアプリケーションを再実行し、別の検索用語を試してみます。

    このチュートリアルの手順のビデオ チュートリアルを視聴するには、「Workflow Manager 1.0 - 入門チュートリアル」を参照してください。

このタスクでは、Workflow Resource Browser のサンプルを使用して、Workflow Client アプリケーションが作成したスコープやワークフローの成果物を参照します。Workflow Resource Browser は個別にダウンロード可能ですが、「Microsoft.Workflow.Samples.Common プロジェクトを追加する」セクションでダウンロードしたチュートリアルのスターター ファイルにも含まれています。

  1. Visual Studio 2012 の新しいインスタンスを開き、[ファイル] メニューから [開く]、[プロジェクト/ソリューション] の順に選択します。

    System_CAPS_important重要

    この手順の Workflow Resource Browser のサンプルとともに使用しますので、WFMgrGettingStarted ソリューションは閉じないでください。

  2. チュートリアルのスターター ファイルを展開した場所を参照し、次のフォルダーに移動します。

    <スターター ファイルの場所>\Workflow Resource Browser Tool

  3. [WFExplorer.sln] を選択して、[開く] をクリックします。

  4. Ctrl+F5 キーを押してアプリケーションをビルドして実行します。

  5. [Workflow Service のアドレス] の入力を求められた場合に、ボックス内に正しいアドレスが表示されていない場合は、チュートリアルの起動時に使用したベース アドレスを使用して、[接続] をクリックします。

  6. 子スコープがないことに注意してください。前の Visual Studio インスタンスに戻り、GetProductsWorkflowClient アプリケーションを再度実行します。検索用語を入力しますが、ワークフローが終了しても、任意のキーを押してスコープをクリーンアップしないでください。

  7. [Workflow Explorer] ウィンドウに戻り、F5 キーを押してビューを更新します。

  8. WFMgrGettingStarted スコープがないことに注意してください。[WFMgrGettingStarted] をクリックして選択し、アクティビティが 2 つ、ワークフローが 1 つあることに注意してください。これは、GetProducts アクティビティと GetProductsWorkflow の 2 つがアクティビティであり、GetProductsWorkflow のみがワークフローとして発行されているためです。

  9. 右側のウィンドウでさまざまな要素をクリックしてスコープ内のアイテムを調査し、ウィンドウの上部にある戻るボタンを押してスコープの既定のビューに戻ります。

  10. [GetProductsWorkflowClient] コンソール ウィンドウに戻り、任意のキーを押してスコープをクリーンアップしてから、[Workflow Explorer] ウィンドウに戻り、F5 キーを押して更新し、スコープが削除されていることを確認してください。

次のサービスが起動していることを確認し、アプリケーションを再度実行します。

  • Service Bus ゲートウェイ

  • Service Bus メッセージ ブローカー

  • SQL Server (SQLEXPRESS または使用しているサーバー)

  • Workflow Manager Backend

コンピューターがインターネットに接続していることを確認します。サンプルは http://services.odata.org/Northwind/Northwind.svc にホストされている Northwind OData サービスを検索します。コンピューターがインターネットに接続されていない場合は、サンプルは正常に動作しません。仮想マシンの場合は、システム トレイのネットワーク アイコンをクリックして [問題のトラブルシューティング] クリックすると、この問題を解決できる場合があります。インターネットへの接続が回復したら、サンプルを再度実行します。

baseAddress が Workflow Manager サーバーを参照していることを確認します。Workflow Manager サーバーが現在のコンピューターでホストされている場合は、[スタート] をクリックして [コンピューター] を右クリックし、フル コンピューター名を表示して、フル コンピューター名を使用して baseAddress を次のように構成します。https://Full computer name:12290 (例: https://mycomputer:12290/ または https://myserver.mydomain.mycompany.com:12290/)。

これらの問題が解消されない場合は、スコープが破損している可能性があります。サンプルを実行時に終了させ、スコープが完全に設定またはクリーンアップされていない場合にこのような状況が発生することがあります。サービスが実行中で、ベース アドレスが正しいのにも関わらず、問題が解消されない場合は、サンプルのスコープ名を別の名前 (次の例の WFMgrGettingStarted2 など) に変更してみてください。

WorkflowManagementClient client = WorkflowUtils.CreateForSample(baseAddress, "WFMgrGettingStarted2");

ベース アドレスと IIS の証明書に使用されているアドレスと一致していない、または SSL 証明書が構成されていない (ローカルの開発用コンピューターの場合) ときに、この問題が発生することがあります。解決するには、ベース アドレスが証明書のアドレスと一致していることを確認するか、次のコードをアプリケーションに追加して、ワークフロー マネージャーに初めてアクセスする前にコードを呼び出すようにします。

// The following code allows a client to use a non-fully qualified name and resolves https issues such as:
// System.Net.WebException: The underlying connection was closed: Could not establish trust 
// relationship for the SSL/TLS secure channel
// NOT for production, only for limited local development.
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate(object sender,
            System.Security.Cryptography.X509Certificates.X509Certificate certificate,
            System.Security.Cryptography.X509Certificates.X509Chain chain,
            System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
};

Visual Studio が管理者権限を使用して起動されておらず、サンプルを Visual Studio から実行している場合に、この例外が発生することがあります。解決するには、Visual Studio を管理モードで起動します。

以前に発行したアクティビティを参照するワークフローを発行したときにこのエラーが発生したときは、次の項目を確認します。

カスタム アクティビティを含むプロジェクトの Assembly.cs を開き、次の行があることを確認します。

[assembly: XmlnsDefinition("wf://workflow.windows.net/$Current/$Activities", "GetProductsActivities")]

2 番目のパラメーターは、カスタム アクティビティを含むプロジェクトの名前空間と一致する必要があります。この行がない場合は追加し、System.Windows.Markup; を使用してファイルの先頭に追加します。カスタム アクティビティ プロジェクトを再度ビルドし、アクティビティを削除して、ワークフローにアクティビティを再度追加します。アクティビティをワークフローに再度追加したら、ワークフロー Xaml を開き (ソリューション エクスプローラー でワークフローを右クリックして、[開く]、[XML (Text) Editor] (XML (テキスト) エディター) の順に選択して [OK] をクリック)、次の行があることを確認します。

xmlns:p1="wf://workflow.windows.net/$Current/$Activities"

ワークフロー デザイナーでワークフローを開く際にこのエラーが発生したら、Ctrl+Shift+B キーを押してソリューションをビルドします。これにより、ワークフロー デザイナーに表示するのに必要なカスタム アクティビティがビルドされます。

サンプルと最新バージョンの Visual Studio 2012 用ワークフロー マネージャー ツール 1.0 が一致していないために、このようなエラーが発生することがあります。解決するには、まず ワークフロー マネージャー ツール にある Workflow Manager Tools 1.0 for Visual Studio 2012 のインストール の最新バージョンがインストールされていることを確認し、XAML ファイル内の次の行のすべてのインスタンスを後続の行に置き換えます。

次のように置き換えます。

xmlns:p="http://schemas.microsoft.com/workflow/2012/xaml/activities"

置き換える行:

xmlns:p="http://schemas.microsoft.com/workflow/2012/07/xaml/activities"
表示: