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


Запрос-ответ

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