要求と応答の関連付けは、ワークフロー サービスで双方向操作を実装するために Receive/SendReply ペアと、別の Web サービスで双方向操作を呼び出す Send/ReceiveReply ペアと共に使用されます。 WCF サービスで双方向操作を呼び出す場合、サービスは従来の命令型コード ベースの Windows Communication Foundation (WCF) サービスでも、ワークフロー サービスでもかまいません。 要求と応答の相関関係を使用するには、 BasicHttpBindingなどの双方向バインディングを使用する必要があります。 双方向操作を呼び出すか実装するかに関係なく、相関関係の初期化手順は似ています。このセクションで説明します。
Receive/SendReply を使用した Two-Way 操作での相関関係の使用
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を指定するか、Receive内に/SendReplyCorrelationScopeを配置します。 この例では、要求と応答の相関関係が 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 を使用した Two-Way 操作での相関関係の使用
Receive アクティビティは、WorkflowServiceHostによってホストされるワークフロー サービスでのみ使用できますが、SendとSend/ReceiveReplyのペアは、Web サービスでメソッドを呼び出す必要がある任意のワークフローで使用できます。 ワークフローが WorkflowServiceHost を使用してホストされている場合は、前のセクションで説明した既定の相関関係が適用されますが、そうでない場合は、目的の CorrelationInitializer と CorrelationHandleを使用するか、 CorrelationScopeの暗黙的なハンドル管理を使用して、相関関係を明示的に構成する必要があります。
双方向操作で サービスに対してサービス参照の追加 を使用すると、要求/応答の相関関係を明示的に指定して Send/ReceiveReply ペア アクティビティを内部的にラップするアクティビティが生成されます。