ワークフロー サービスの概要

ワークフロー サービスは、ワークフローを使用して実装される WCF ベースのサービスです。 ワークフローサービスは、メッセージング アクティビティを使用して Windows Communication Foundation (WCF) メッセージを送受信するワークフローです。 .NET Framework 4.5 では、ワークフロー内からメッセージを送受信できるようにする多数のメッセージ アクティビティが導入されています。 メッセージング アクティビティの詳細、およびこれらを使用してさまざまなメッセージ交換パターンを実装する方法については、「メッセージング アクティビティ」を参照してください。

ワークフロー サービスを使用するベネフィット

アプリケーションが分散型になるにつれ、負荷を軽減させるために、個々のサービスが他のサービスを呼び出す役割を果たすようになっています。 これらの呼び出しを非同期操作として実装すると、コードがやや複雑になります。 エラー処理によって、例外処理と詳細な追跡情報の形式がさらに複雑になります。 一部のサービスには、長時間実行されることが多く、入力を待機する間に貴重なシステム リソースを占有するものがあります。 このような問題があるため、分散アプリケーションは、非常に複雑で、作成と保守が困難であることがよくあります。 ワークフローは、特に外部サービスへの呼び出しなど、非同期操作の連携を表す方法として最適です。 また、実行時間が長いビジネス プロセスを表す場合にも効率的です。 ワークフローが、分散環境でのサービス構築に役立つ資産となるのは、これらの特性があるためです。

ワークフロー サービスの実装

WCF サービスを実装するときは、サービスおよびそれが送受信するデータを説明する一連のコントラクトを定義します。 データは、データ コントラクトとメッセージ コントラクトで表されます。 WCF サービスもワークフロー サービスも、サービスの説明の一環として、データ コントラクトとメッセージ コントラクトの定義を使用します。 サービス自体は、(WSDL の形で) メタデータを公開して、サービスの操作を説明します。 WCF では、サービス コントラクトと操作コントラクトによって、サービス、およびサービスがサポートする操作を定義します。 ただし、ワークフロー サービスでは、これらのコントラクトはビジネス プロセス自体の一部です。 これらは、コントラクト推論と呼ばれるプロセスによってメタデータとして公開されます。 ワークフロー サービスが WorkflowServiceHost を使用してホストされている場合は、ワークフローで見つかった一連のメッセージ アクティビティに基づいて、ワークフロー定義が確認され、コントラクトが生成されます。 具体的には、次のアクティビティとプロパティが、コントラクトの生成に使用されます。

Receive の利用状況

SendReply の利用状況

TransactedReceiveScope の利用状況

コントラクト推論の結果は、WCF サービスと操作コントラクトと同じデータ構造を使用するサービスの説明になります。 この情報を使用して、ワークフロー サービス用に WSDL が公開されます。

Note

.NET Framework 4.6.1 では、ツール サポートを追加せずに、既存のコントラクト定義を使用してワークフロー サービスを記述することはできません。 ワークフロー サービスのコントラクトは、前述のコントラクト推論プロセスによって作成されます。 ただし、メッセージ コントラクトおよびデータ コントラクトは完全にサポートされます。

ワークフロー サービスと MSMQ ベースのバインディング

WCF は、2 つの MSMQ ベースのバインディングである NetMsmqBindingMsmqIntegrationBinding を定義します。 MSMQ ベースのバインディングは、多くの場合、ワークフロー サービスと共に使用されます。これは、これらのサービスに、実行時間が長いという性質があるためです。 MSMQ ベースのバインディングには、MSMQ メッセージが有効と見なされる時間を指定する ValidityDuration プロパティがあります。 ワークフロー サービスは本質的に実行時間が長いため、ワークフロー サービスによるメッセージの処理が可能になる前に、MSMQ メッセージの有効期間が切れることがあります。 そのため、MSMQ バインディングの有効期間を適切な値に設定することが重要です。 この値は、ワークフローとそのメッセージの処理方法に基づいて選択する必要があります。 たとえば、Receive アクティビティがあり、これに続いて 10 分間実行されるカスタム アクティビティがあり、その後に別の Receive アクティビティがある場合、ValidityDuration の適切な値は 10 分を超えることになります。

ワークフロー サービスのホスティング

WCF サービスと同様、ワークフロー サービスがホストされている必要があります。 WCF サービスでは ServiceHost クラスを使用してサービスがホストされ、ワークフロー サービスでは WorkflowServiceHost を使用してサービスがホストされます。 WCF サービスと同様に、ワークフロー サービスはさまざまな方法でホストできます。次に例を示します。

  • マネージド .NET Framework アプリケーション。

  • インターネット インフォメーション サービス (IIS)。

  • Windows プロセス アクティブ化サービス (WAS)。

  • マネージド Windows サービス。

マネージド .NET Framework アプリケーションまたはマネージド Windows サービスでホストされるワークフロー サービスでは、WorkflowServiceHost クラスのインスタンスが作成され、これに Body プロパティ内のワークフロー定義を含む WorkflowService のインスタンスが渡されます。 メッセージ アクティビティを格納するワークフロー定義は、ワークフロー サービスとして公開されます。

ワークフロー サービスを IIS または WAS でホストするには、ワークフロー サービス定義を格納する .xamlx ファイルを仮想ディレクトリに配置します。 既定のエンドポイント (BasicHttpBinding を使用) は自動的に作成されます。詳細については、「簡略化された構成」を参照してください。 また、Web.config ファイルを仮想ディレクトリに配置し、独自のエンドポイントを指定することもできます。 ワークフロー定義がアセンブリ内にある場合は、.svc ファイルを仮想ディレクトリに配置し、ワークフロー アセンブリを App_Code ディレクトリに配置できます。 この .svc ファイルには、サービス ホスト ファクトリと、ワークフロー サービスを実装するクラスを指定する必要があります。 次の例に、サービス ホスト ファクトリを指定し、ワークフロー サービスを実装するクラスを指定する方法を示します。

<%@ServiceHost Factory="System.ServiceModel.Activities.Activation.WorkflowServiceHostFactory"
Service="EchoService"%>