ワークフロー サービスは、ワークフローを使用して実装される WCF ベースのサービスです。 ワークフロー サービスは、メッセージング アクティビティを使用して Windows Communication Foundation (WCF) メッセージを送受信するワークフローです。 .NET Framework 4.5 には、ワークフロー内からメッセージを送受信できるメッセージング アクティビティが多数導入されています。 メッセージング アクティビティの詳細と、それらのアクティビティを使用してさまざまなメッセージ交換パターンを実装する方法については、「 メッセージング アクティビティ」を参照してください。
ワークフロー サービスを使用する利点
アプリケーションの分散が増えるにつれて、個々のサービスが他のサービスを呼び出して作業の一部をオフロードする役割を担うようになった。 これらの呼び出しを非同期操作として実装すると、コードが複雑になります。 エラー処理では、例外を処理し、詳細な追跡情報を提供する形式で複雑さが増します。 多くの場合、一部のサービスは実行時間が長く、入力を待っている間に貴重なシステム リソースを占有する可能性があります。 このような問題のため、分散アプリケーションは、多くの場合、非常に複雑で、書き込みと保守が困難です。 ワークフローは、非同期作業 (特に外部サービスの呼び出し) の調整を表す自然な方法です。 ワークフローは、実行時間の長いビジネス プロセスを表す場合にも有効です。 分散環境でサービスを構築するための優れた資産となるのは、これらの品質です。
ワークフロー サービスの実装
WCF サービスを実装する場合は、サービスと、サービスが送受信するデータを記述するコントラクトを多数定義します。 データは、データ コントラクトとメッセージ コントラクトとして表されます。 WCF サービスとワークフロー サービスはどちらも、サービスの説明の一部としてデータ コントラクト定義とメッセージ コントラクト定義を使用します。 サービス自体は、(WSDL の形式で) メタデータを公開して、サービスの操作を記述します。 WCF では、サービス コントラクトと操作コントラクトによって、サポートされるサービスと操作が定義されます。 ただし、ワークフロー サービスでは、これらのコントラクトはビジネス プロセス自体の一部です。 これらは、コントラクト推論と呼ばれるプロセスによってメタデータで公開されます。 ワークフロー サービスが WorkflowServiceHostを使用してホストされている場合、ワークフロー定義が調べられ、ワークフロー内で見つかったメッセージング アクティビティのセットに基づいてコントラクトが生成されます。 特に、コントラクトの生成には、次のアクティビティとプロパティが使用されます。
Receive 活動
SendReply 活動
コントラクト推論の最終的な結果は、WCF サービスおよび操作コントラクトと同じデータ構造を使用するサービスの説明です。 この情報は、ワークフロー サービスの WSDL を公開するために使用されます。
注
.NET Framework 4.6.1 では、追加のツールサポートなしで、既存のコントラクト定義を使用してワークフロー サービスを記述することはできません。 ワークフロー サービス コントラクトは、前に説明したコントラクト推論プロセスによって作成されます。 ただし、メッセージ コントラクトとデータ コントラクトは完全にサポートされています。
ワークフロー サービスと MSMQ ベースのバインド
WCF では、との 2 つの MSMQ ベースのバインドが定義されています。 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"%>