ワークフロー サービス ホストの拡張機能
.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 がワークフロー サービスに対するメッセージを受信すると、ワークフロー サービスが実行 (または永続化) されていない場合は、新しいワークフロー サービス インスタンスが作成されます。 ワークフローが Receive アクティビティで開始されない場合は、メッセージを受信するアクティビティがないため、このワークフローは、メッセージを送信して開始することはできません。 サービス以外のワークフローをホストするには、WorkflowHostingEndpoint から派生クラスを作成し、OnGetInstanceId、OnGetCreationContext、および OnResolveBookmark をオーバーライドします。 OnGetInstanceId をオーバーライドすると、優先するインスタンスの ID を指定できます。 OnGetCreationContext をオーバーライドすると、カスタムのワークフロー作成コンテキストを作成したり、既存の WorkflowCreationContext インスタンスを設定したりできます。 OnResolveBookmark をオーバーライドすると、受信メッセージから手動でブックマークを抽出できます。 このメソッドをオーバーライドすると、WorkflowHostingEndpoint に送信されたメッセージに応答するために本文で SendResponse を呼び出す必要があります。 これを呼び出さないと、MaxConcurrentCalls の制限を最終的に超過する可能性があります。 双方向コントラクトでは、応答を受信するために発生したクライアントのエラーのために、SendResponse の呼び出しで発生したエラーを検出できる可能性があります。 一方向コントラクトでは、SendResponse スロットルの制限を超過するまで MaxConcurrentCalls を呼び出していないというミスを認識しない可能性があります。 サービス以外のワークフローの新しいインスタンスを作成するには、新しいインスタンスを作成する操作を定義するサービス コントラクトを宣言します。 作成操作は、必要なワークフロー パラメーターを渡すために、IDictionary<string, object> を受け取る必要があります。 このコントラクトは、WorkflowHostingEndpoint の派生クラスによって、暗黙で実装されます。 ワークフローをホストする場合は、WorkflowHostingEndpoint を呼び出して AddServiceEndpoint の派生クラスのインスタンスをホストに追加し、Open を呼び出します。 ワークフローのインスタンスを作成するには、使用するサービス コントラクト型の ChannelFactory<TChannel> を作成し、CreateChannel を呼び出します。 これで、サービス コントラクトに定義されている作成操作を呼び出すことができます。