要求/応答の相関関係
要求/応答の相関関係は、Receive/SendReply のペアと使用すると、ワークフロー サービスに双方向の操作を実装でき、Send/ReceiveReply のペアと使用すると、別の 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.
要求/応答の相関関係の明示的な初期化
他の双方向の操作が並列実行される場合、相関関係を明示的に構成する必要があります。 それには、CorrelationHandle と RequestReplyCorrelationInitializer を指定するか、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.
追加の相関関係が必要な場合は、目的の種類の CorrelationInitializers を使用する各メッセージング アクティビティの CorrelationInitializer
プロパティを使用して、追加の相関関係を構成します。
Send/ReceiveReply による双方向の操作での相関関係の使用
Receive アクティビティは、WorkflowServiceHost によってホストされるワークフロー サービスでのみ使用できますが、Send および Send/ReceiveReply のペアは、Web サービスに対してメソッドを呼び出す必要のあるすべてのワークフローで使用できます。 ワークフローが WorkflowServiceHost を使用してホストされる場合は、前のセクションで説明した既定の相関関係が適用されますが、そうでない場合は、目的の CorrelationInitializer と CorrelationHandle を明示的に使用するか、CorrelationScope による暗黙の処理管理を使用して、相関関係を構成する必要があります。
双方向の操作があるサービスで [サービス参照の追加] を使用する場合は、明示的に指定された要求/応答の相関関係を使用して、内部に Send/ReceiveReply ペア アクティビティをラップするアクティビティが生成されます。