Поделиться через


Корреляция запросов и ответов

Корреляция "Запрос-ответ" используется с 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 помещают действие пары внутри с помощью явно указанной корреляции запроса и ответа.