要求/応答

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

要求/応答の相関関係は、ReceiveReplySend のペアと使用すると、ワークフロー サービスに双方向の操作を実装でき、SendReplyReceive のペアと使用すると、別の Web サービスの双方向の操作を呼び出すことができます。WCF サービスの双方向の操作を呼び出す場合、このサービスには、従来の命令型のコード ベースの Windows Communication Foundation (WCF) サービスを使用することも、ワークフロー サービスを使用することもできます。要求/応答の相関関係を使用するには、BasicHttpBinding などの双方向のバインドを使用する必要があります。双方向の操作を呼び出す場合と実装する場合では、相関関係の初期化に同様の手順が使用されます。これらの手順については、このセクションで説明します。

Receive/SendReply による双方向の操作での相関関係の使用

Receive/SendReply のペアは、ワークフロー サービスに双方向の操作を実装するために使用されます。ランタイムは、要求/応答の相関関係を使用して、応答が正しい呼び出し元にディスパッチされるようにします。ワークフローが WorkflowServiceHost を使用してホストされている場合、つまり、ワークフロー サービスの場合は、既定の相関関係の初期化で十分です。このシナリオでは、Receive/SendReply のペアがワークフローによって使用されます。特定の相関関係の構成は不要です。

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

SendReply ReplyToStartOrder = new SendReply
{
    Request = StartOrder,
    Content = … // Contains the return value, if any.
};

// Construct a workflow using StartOrder and ReplyToStartOrder.

要求/応答の相関関係の明示的な初期化

他の双方向の操作が並列実行される場合、相関関係を明示的に構成する必要があります。それには、CorrelationHandleRequestReplyCorrelationInitializer を指定するか、CorrelationScope 内に Receive/SendReply を設定します。この例では、要求/応答の相関関係が Receive/SendReply のペアを使用して構成されています。

Variable<CorrelationHandle> RRHandle = new Variable<CorrelationHandle>();

Receive StartOrder = new Receive
{
    CanCreateInstance = true,
    ServiceContractName = OrderContractName,
    OperationName = "StartOrder",
    CorrelationInitializers =
    {
        new RequestReplyCorrelationInitializer
        {
            CorrelationHandle = RRHandle
        }
    }
};

SendReply ReplyToStartOrder = new SendReply
{
    Request = StartOrder,
    Content = … // Contains the return value, if any.
};

// Construct a workflow using StartOrder and ReplyToStartOrder.

相関関係を明示的に構成する代わりに、CorrelationScope アクティビティを使用することもできます。CorrelationScope は内包しているメッセージング アクティビティに暗黙の CorrelationHandle を提供します。この例では、Receive/SendReply ペアが CorrelationScope に内包されています。明示的な相関関係の構成は不要です。

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

SendReply ReplyToStartOrder = new SendReply
{
    Request = StartOrder,
    Content = … // Contains the return value, if any.
};

CorrelationScope s = new CorrelationScope
{
    Body = new Sequence
    {
        Activities = 
        {
            StartOrder,
            // Activities that create the reply.
            ReplyToStartOrder
        }
    }
};

// Construct a workflow using the CorrelationScope.

追加の相関関係が必要な場合は、目的の種類の CorrelationInitializer を使用する各メッセージング アクティビティの CorrelationInitializers プロパティを使用して、追加の相関関係を構成します。

Send/ReceiveReply による双方向の操作での相関関係の使用

Receive アクティビティは、WorkflowServiceHost によってホストされるワークフロー サービスでのみ使用できますが、Send および Send/ReceiveReply のペアは、Web サービスに対してメソッドを呼び出す必要のあるすべてのワークフローで使用できます。ワークフローが WorkflowServiceHost を使用してホストされる場合は、前のセクションで説明した既定の相関関係が適用されますが、そうでない場合は、目的の CorrelationInitializerCorrelationHandle を明示的に使用するか、CorrelationScope による暗黙の処理管理を使用して、相関関係を構成する必要があります。

双方向の操作があるサービスで [サービス参照の追加] を使用する場合は、明示的に指定された Request/Reply 相関関係を使用して、内部に Send/ReceiveReply ペア アクティビティをラップするアクティビティが生成されます。