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


корреляция Request-Reply

Корреляция "Запрос-ответ" используется с парой Receive/SendReply для осуществления двусторонней операции в службе рабочего процесса и с парой Send/ReceiveReply, чтобы вызвать двустороннюю операцию в другой веб-службе. При вызове двусторонней операции в службе WCF служба может быть либо традиционной императивной службой Windows Communication Foundation (WCF), либо службой рабочего процесса. Чтобы использовать корреляцию "запрос-ответ", необходимо использовать двусторонняя привязка, например BasicHttpBinding. Независимо от того, выполняется ли вызов или реализация двусторонней операции, шаги инициализации корреляции аналогичны и рассматриваются в этом разделе.

Использование корреляции в операции 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.  

Явная инициализация корреляции Request-Reply

Если другие двусторонние операции выполняются параллельно, необходимо явно настроить корреляцию. Это можно сделать, указав 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 предоставляет неявную связь с действиями обмена сообщениями, которые в нем содержатся. В этом примере пара 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.

Использование корреляции в операции Two-Way с отправкой и получением ответа.

Хотя активность Receive может использоваться только в службе рабочего процесса, размещенной системой WorkflowServiceHost, пара SendSend/ReceiveReply может использоваться в любом рабочем процессе, который должен вызывать метод в веб-службе. Если рабочий процесс размещен с помощью WorkflowServiceHost, то применяются корреляция по умолчанию, описанная в предыдущем разделе, но если нет, то корреляция должна быть настроена явно с помощью требуемых CorrelationInitializer и CorrelationHandle, либо с помощью неявного управления обработчиком CorrelationScope.

При использовании Add Service Reference для службы с двусторонними операциями создаются действия, которые содержат пару действий Send/ReceiveReply с явно указанной корреляцией запроса и ответа.