Запрос-ответ
Данный раздел относится к версии Windows Workflow Foundation 4.
Корреляция «запрос-ответ» используется вместе с парой действий 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.
Явная инициализация корреляции «запрос-ответ»
Если параллельно работают другие двусторонние операции, корреляция должна быть явно настроена. Для этого можно задать объекты CorrelationHandle и RequestReplyCorrelationInitializer или поместить пару Receive/SendReply в область 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 в явно заданной корреляции «запрос-ответ».