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