.NET Framework 4.6.1 には、ワークフロー サービスをホストするための WorkflowServiceHost クラスが用意されています。 このクラスは、マネージド アプリケーションまたは Windows サービスでワークフロー サービスを自己ホストする場合に使用されます。 このクラスは、インターネット インフォメーション サービス (IIS) または Windows プロセス アクティブ化サービス (WAS) を使用してワークフロー サービスをホストする場合にも使用されます。 WorkflowServiceHost クラスは、カスタム拡張機能の追加、アイドル動作の変更、サービス以外のワークフロー (メッセージング アクティビティを使用しないワークフロー) のホストを可能にする拡張ポイントを提供します。
ワークフロー サービス ホスト拡張機能
WorkflowServiceHostには、WorkflowExtensionsに拡張機能を追加するメソッドを提供するWorkflowInstanceExtensionManager型のWorkflowServiceHost プロパティが含まれています。 Add メソッドを使用して、各ワークフロー サービス インスタンスの拡張機能を追加します。 ワークフロー サービス インスタンスが作成されたとき、または永続化ストアから読み込まれるときに、新しい拡張機能を作成するために指定されたデリゲートが呼び出されます。 Addメソッドを使用して、各ワークフロー サービス ホストの拡張機能を追加します。拡張機能の 1 つのインスタンスがすべてのワークフロー サービス インスタンスで共有されます。
未処理の例外に対処する
WorkflowUnhandledExceptionBehaviorを使用すると、ワークフロー サービス内でハンドルされない例外が発生した場合に実行するアクションを指定できます。 Action プロパティは、次のいずれかのWorkflowUnhandledExceptionAction値を指定します。
Abandon – ワークフロー サービス インスタンスを中止します。
AbandonAndSuspend – 最後に永続化された状態にロールバックし、ワークフロー サービス インスタンスを中断します。 これは、ワークフローが既に 1 回以上永続化されている場合にのみ発生します。 そうでない場合、ワークフロー インスタンスは中止されます。
Cancel – インスタンスを取り消します。
Terminate – インスタンスを終了します。
この動作は、次の例に示すようにコードで構成できます。
host.Description.Behaviors.Add(new WorkflowUnhandledExceptionBehavior { Action = WorkflowUnhandledExceptionAction.Abandon });
次の例に示すように、構成ファイルで構成することもできます。
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<workflowUnhandledExceptionBehavior action="Abandon" />
</behavior>
</serviceBehaviors>
</behaviors>
サービス以外のワークフローのホスト
WorkflowServiceHost は、サービス以外のワークフロー、または Receive アクティビティで始まないワークフロー、またはメッセージング アクティビティを使用しないワークフローをホストするために使用できます。 ワークフロー サービスは通常、 Receive アクティビティから始まります。 WorkflowServiceHostがワークフロー サービスのメッセージを受信すると、まだ実行されていない (または永続化されていない) 場合は、新しいワークフロー サービス インスタンスが作成されます。 ワークフローが受信アクティビティで始まらない場合は、メッセージを受信するアクティビティがないため、メッセージを送信して開始することはできません。 サービス以外のワークフローをホストするには、 WorkflowHostingEndpoint からクラスを派生させ、 OnGetInstanceId、 OnGetCreationContext、および OnResolveBookmarkをオーバーライドします。 優先インスタンス ID を指定する場合は、 OnGetInstanceId をオーバーライドします。 OnGetCreationContextをオーバーライドしてカスタム ワークフロー作成コンテキストを作成するか、既存のWorkflowCreationContextのインスタンスを設定します。 OnResolveBookmarkをオーバーライドして、受信メッセージからブックマークを手動で抽出します。 このメソッドをオーバーライドする場合は、WorkflowHostingEndpoint に送信されたメッセージに応答するように、本文で SendResponse を呼び出す必要があります。 そうしないと、最終的に MaxConcurrentCalls 制限を超える可能性があります。 双方向コントラクトでは、クライアントが応答を受信できなかったために、 SendResponse を呼び出すことができなかったことを検出できる場合があります。 一方向コントラクトでは、SendResponseの呼び出しに失敗した間違いを手遅れになるまで認識できず、MaxConcurrentCallsのスロットル制限を超えてしまうことがあります。 サービス以外のワークフローの新しいインスタンスを作成するには、新しいインスタンスを作成する操作を定義するサービス コントラクトを宣言します。 作成操作では、必要なワークフロー パラメーターを渡すために IDictionary<string、object> を受け取る必要があります。 このコントラクトは、 WorkflowHostingEndpoint派生クラスによって暗黙的に実装されます。 ワークフローをホストする場合は、WorkflowHostingEndpointを呼び出してAddServiceEndpointを呼び出して、Open派生クラスのインスタンスをホストに追加します。 ワークフローのインスタンスを作成するには、サービス コントラクトの種類の ChannelFactory<TChannel> を作成し、 CreateChannelを呼び出します。 その後、サービス コントラクトで定義されている作成操作を呼び出すことができます。