Корреляция запросов и ответов
Корреляция "Запрос-ответ" используется с Receive/SendReply парой для реализации двусторонней операции в службе рабочего процесса и Send/ReceiveReply с парой, которая вызывает двусторонняя операция в другой веб-службе. При вызове двусторонней операции в службе 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( или) разместивSendReply/Receive внутри CorrelationScopeобъекта . В этом примере корреляция "запрос-ответ" настраивается в паре 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 помещают действие пары внутри с помощью явно указанной корреляции запроса и ответа.