コンテキスト交換

このトピックの内容は、Windows Workflow Foundation 4 に該当します。

コンテキスト相関関係は、.NET コンテキスト交換プロトコルの仕様で説明されているコンテキスト交換メカニズムに基づきます。コンテキスト相関関係では、既知のコンテキスト ヘッダーまたは Cookie を使用して、メッセージを正しいインスタンスに関連付けます。コンテキスト相関関係を使用するには、BasicHttpContextBindingWSHttpContextBindingNetTcpContextBinding などのコンテキスト ベースのバインディングが、WorkflowServiceHost に提供されるエンドポイントで使用される必要があります。このトピックでは、メッセージング アクティビティを指定したコンテキスト相関関係をワークフロー サービス内で使用する方法について説明します。

コンテキスト相関関係の使用

クライアントがワークフロー サービスに繰り返し呼び出しを行う必要があり、そのサービスがコンテキスト バインディングの 1 つを使用してホストされている場合に、コンテキスト相関関係が使用されます。この種類の相関関係は、ワークフロー サービス内で Receive/SendReply のペアによって初期化されます。コンテキストは、応答と共にクライアントに送り返されます。その後、クライアントによって、サービスへの以降の呼び出しにアタッチされます。

ワークフロー サービス内でのコンテキスト相関関係の構成

コンテキスト相関関係は、最初の受信メッセージに応答する SendReply アクティビティと関連付けられている、ContextCorrelationInitializer を使用して初期化されます。次の例では、コンテキスト相関関係を初期化するように SendReply が構成されています。

Variable<string> Item = new Variable<string>();
Variable<CorrelationHandle> OrderHandle = new Variable<CorrelationHandle>();

Receive StartOrder = new Receive
{
    CanCreateInstance = true,
    ServiceContractName = "IOrderService",
    OperationName = "StartOrder"
};

SendReply ReplyToStartOrder = new SendReply
{
    Request = StartOrder,
    CorrelationInitializers =
    {
        new ContextCorrelationInitializer
        {
            CorrelationHandle = OrderHandle
        }
    }
};
Ee358724.note(ja-jp,VS.100).gif注 :
Receive/SendReply ペアは、WorkflowServiceHost の暗黙の CorrelationHandle 管理で提供される、既定の要求/応答の相関関係を使用しています。詳細については、次のトピックを参照してください。要求/応答.

ワークフロー サービス内の以降の Receive アクティビティは、前の例の SendReply で初期化された CorrelationHandle を参照できます。

Receive AddItem = new Receive
{
    ServiceContractName = "IOrderService",
    OperationName = "AddItem",
    CorrelatesWith = OrderHandle
};

エンドポイントは、WorkflowServiceHost で、BasicHttpContextBinding などのコンテキスト ベースのバインディングを使用するように構成されます。

<endpoint
  contract=”IOrderContract”
  binding = “basicHttpContextBinding”
  address=”https://localhost:8080/OrderService” />

ワークフロー クライアント内でのコンテキスト相関関係の構成

クライアントが別のワークフローである場合は、コンテキスト相関関係をクライアントでも構成する必要があります。クライアント ワークフローでは、ワークフロー サービスへの最初の呼び出しを行う Send/ReceiveReply ペアの ReceiveReply が、ContextCorrelationInitializer で構成される必要があります。

Variable<CorrelationHandle> cchandle = new Variable<CorrelationHandle>();
Send request = new Send
{
    // Activity configuration omitted.
};

ReceiveReply reply = new ReceiveReply
{
    Request = request,
    CorrelationInitializers = 
    {
        new ContextCorrelationInitializer
        {
            CorrelationHandle = cchandle
        }
    }
};

相関関係が初期化されると、以降の Send アクティビティでは、CorrelationHandle を使用して、同じサービス インスタンスでメソッドを呼び出すことができます。

Send request2 = new Send
{
    CorrelatesWith = cchandle,
    // Remaining activity configuration omitted.
};

これらの例では、コンテキスト相関関係が明示的に構成されています。クライアント ワークフローが WorkflowServiceHost でもホストされていない場合は、アクティビティが CorrelationScope アクティビティ内に含まれていない限り、相関関係を明示的に構成する必要があります。

ワークフロー サービスへの呼び出しを行うクライアントがワークフローではない場合でも、ワークフロー サービスへの最初の呼び出しで返されたコンテキストを明示的に渡す限り、呼び出しを繰り返して行うことができます。サービス参照を Visual Studio 2010 ストアに追加することでプロキシが生成され、このコンテキストが既定で渡されます。