요청-회신 상관 관계
요청-회신 상관 관계는 워크플로 서비스에서 양방향 작업을 구현하려는 경우에는 Receive/SendReply 쌍과 함께 사용되고 다른 웹 서비스에서 양방향 서비스를 호출하려는 경우에는 Send/ReceiveReply 쌍과 함께 사용됩니다. WCF 서비스에서 양방향 작업을 호출하는 경우 해당 서비스는 일반적인 명령적 코드 기반의 WCF(Windows Communication Foundation) 서비스이거나 워크플로 서비스일 수 있습니다. 요청-회신 상관 관계를 사용하려면 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 쌍은 웹 서비스에 대한 메서드를 호출해야 하는 모든 워크플로에서 사용할 수 있습니다. 워크플로가 WorkflowServiceHost를 사용하여 호스트된 경우 이전 단원에서 설명한 기본 상관 관계가 적용됩니다. 그렇지 않은 경우 원하는 CorrelationInitializer 및 CorrelationHandle을 명시적으로 사용하거나 CorrelationScope의 암시적 핸들 관리를 사용하여 상관 관계를 구성해야 합니다.
양방향 작업이 있는 서비스에서 서비스 참조 추가를 사용하면 명시적으로 지정된 요청/회신 상관 관계를 사용하여 Send/ReceiveReply 쌍 작업을 내부적으로 래핑하는 작업이 생성됩니다.