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


Использование действий обмена сообщениями

Данный раздел относится к версии Windows Workflow Foundation 4.

Действия обмена сообщениями позволяют рабочим процессам отправлять или получать сообщения WCF. Добавляя действия обмена сообщениями в рабочий процесс, можно моделировать шаблоны обмена сообщениями любого уровня сложности.

Шаблоны обмена сообщениями

Существует три основных шаблона обмена сообщениями.

  • Датаграмма — при использовании шаблона обмена сообщениями «датаграмма», клиент отправляет сообщение службе, но служба не отвечает. Такой метод иногда называют «отправить и забыть». В этом случае требуется внешнее подтверждение успешной доставки. Сообщение может быть потеряно при передаче и может не достичь службы. Если клиент успешно отправил сообщение, это не гарантирует, что удаленная служба получила его. Датаграмма — это фундаментальный элемент обмена сообщениями, на основе которого можно строить собственные шаблоны обмена сообщениями.

  • Запрос-ответ — при использовании шаблона обмена сообщениями «запрос-ответ» клиент отправляет сообщение службе, служба выполняет необходимые вычисления и отправляет ответ клиенту. Шаблон состоит из пар "запрос-ответ". Примерами вызовов "запрос-ответ" являются удаленные вызовы процедур (RPC) и запросы GET веб-обозревателя. Этот шаблон также называют полудуплексным.

  • Дуплекс — при использовании шаблона обмена сообщения «дуплекс» клиент и служба могут отправлять сообщения друг другу в любом порядке. Применение дуплексного шаблона похоже на разговор по телефону, когда каждое произносимое слово является сообщением.

Действия обмена сообщениями позволяют реализовать любой из этих базовых шаблонов обмена сообщениями, а также любые другие шаблоны обмена сообщениями любого уровня сложности.

Действия обмена сообщениями

Платформа .NET Framework, версия 4 определяет следующие действия обмена сообщениями.

  • Send — используется для отправки сообщения.

  • SendReply — используется для отправки ответа на полученное сообщение. Это действие используется службами рабочего процесса при реализации шаблона обмена сообщениями «запрос-ответ».

  • Receive — используется для получения сообщения.

  • ReceiveReply — используется для получения ответного сообщения. Это действие используется клиентами службы рабочего процесса при реализации шаблона обмена сообщениями «запрос-ответ».

Действия обмена сообщениями и шаблоны обмена сообщениями

В шаблоне обмена сообщениями «датаграмма» участвуют клиент, отправляющий сообщение, и служба, получающая его. Если клиент — это рабочий процесс, то следует использовать действие Send для отправки сообщения. Для получения этого сообщения в рабочем процессе следует использовать действие Receive. Действия Send и Receive имеют свойство с именем Content. Это свойство содержит отправляемые или получаемые данные. При реализации шаблона обмена сообщениями «запрос-ответ» клиент и службы используют пары действий. Клиент использует действие Send для отправки сообщения и действие ReceiveReply для получения ответа от службы. Эти два действия связаны друг с другом свойством Request. Значение этого свойства — действие Send, отправившее исходное сообщение. Служба также использует пару связанных действий: Receive и SendReply. Эти два действия связаны свойством Request. Значение этого свойства — действие Receive, получившее исходное сообщение. Действия ReceiveReply и SendReply, как и действия Send и Receive, позволяют отправить экземпляр Message или тип контракта сообщения.

Поскольку рабочие процессы выполняются в течение долгого времени, очень важно, чтобы шаблон обмена сообщениями «дуплекс» также поддерживал долговременные диалоги. Для поддержки долговременных диалогов клиенты, инициирующие диалоги, должны предоставлять службу с возможностью ее повторного вызова позднее, когда данные станут доступны. Например, заказ на покупку подается на одобрение менеджера, но он может быть обработан спустя день, неделю или даже год; рабочий процесс, управляющий заказом на покупку должен иметь возможность продолжить работу с ним после получения одобрения. Шаблон обмена сообщениями «дуплекс» поддерживается в рабочих процессах, использующих корреляцию. Для реализации шаблона «дуплекс» следует использовать действия Send и Receive. В действии Receive следует инициализировать корреляцию с использованием значения специального ключа CallbackHandleName. В действии Send задайте дескриптор взаимосвязи как значение свойства CorrelatesWith. Дополнительные сведения см. в разделе Устойчивый дуплекс.

Ee358739.note(ru-ru,VS.100).gifПримечание
Реализация шаблона «дуплекс» в рабочем процессе с использованием корреляции обратного вызова («устойчивый дуплекс») предназначена для работы с долговременными диалогами. Это не то же самое, что «дуплекс» WCF с контрактами обратного вызова, в которых диалоги являются кратковременными (на время существования канала).

Форматирование сообщений и действия обмена сообщениями

Действия Receive и ReceiveReply имеют свойство с именем Content. Это свойство имеет тип ReceiveContent и представляет данные, получаемые действием Receive или ReceiveReply. В платформе .NET Framework определены два связанных класса с именами RecieveMessageContent и ReceiveParametersContent, которые являются производными от ReceiveContent. Задайте для свойства Content действия Receive или ReceiveReply значение экземпляра одного из этих типов для получения данных в службе рабочего процесса. Используемые типы зависят от типа данных, получаемых действием. Если действие получает объект Message или тип контракта сообщения, следует использовать ReceiveMessageContent. Если действие получает контракт набора данных или типы XML, которые могут быть сериализованы, используйте ReceiveParametersContent. ReceiveParametersContent позволяет отправлять несколько параметров, ReceiveMessageContent позволяет отправлять только один объект — сообщение (или тип контракта сообщения).

Ee358739.note(ru-ru,VS.100).gifПримечание
ReceiveMessageContent также можно использовать с одним контрактом данных или типом XML, который может быть сериализован. Разница между использованием класса ReceiveParametersContent с одним параметром и передачей объекта напрямую классу RecieveMessageContent заключается в формате сообщений. Содержимое параметра упаковывается в элемент XML, соответствующий имени операции, а сериализуемый объект упаковывается в элемент XML с использованием имени параметра (например, <Echo><msg>Hello, World</msg></Echo>). Содержимое сообщения не упаковывается в имя операции. Вместо этого сериализуемый объект размещается в элементе XML с использованием полного имени типа XML (например, <string>Hello, World</string>).

Действия Send и SendReply также имеют свойство с именем Content. Это свойство имеет тип SendContent и представляет данные, отправляемые действием Send или SendReply. В платформе .NET Framework определены два связанных типа с именами SendMessageContent и SendParametersContent, которые являются производными от SendContent. Задайте для свойства Content действия Send или SendReply значение экземпляра одного из этих типов для отправки данных из службы рабочего процесса. Используемые типы зависят от типа данных, отправляемых действием. Если действие отправляет объект Message или тип контракта сообщения, следует использовать SendMessageContent. Если действие отправляет тип контракта данных, следует использовать тип SendParametersContent. Тип SendParametersContent позволяет отправлять несколько параметров, тип SendMessageContent позволяет отправить только один объект — сообщение (или тип контракта сообщения).

При императивном программировании действий обмена сообщениями следует использовать универсальные аргументы InArgument и OutArgument для упаковки объектов, назначенных для сообщения или свойств параметров для действий Send, SendReply, Receive и ReceiveReply. Используйте аргумент InArgument для действий Send и SendReply, а аргумент OutArgument для действий Receive и ReceiveReply. Аргументы In используются с действиями «send», поскольку данные передаются действиям. Аргументы Out используются с действиями «recieve», поскольку данные принимаются от действий, как это демонстрируется в следующем примере.

Receive reserveSeat = new Receive
{ 
    ... 
    Content = new ReceiveParametersContent
    {
        Parameters =
        {
            { "ReservationInfo", new OutArgument<ReservationRequest>(reservationInfo) }
        }
    }
};
SendReply reserveSeat = new SendReply
{ 
    ... 
    Request = reserveSeat,
    Content = new SendParametersContent
    {
        Parameters =
        {
            { "ReservationId", new InArgument<string>(reservationId) }
        }
    },
};

При реализации службы рабочего процесса, определяющей операцию «запрос-ответ», возвращающую пустое значение, необходимо создать экземпляр действия SendReply и задать для свойства Content значение пустого экземпляра одного из типов содержимого (SendMesageContent или SendParametersContent), как это показано в следующем примере.

Receive rcv = new Receive()
{
ServiceContractName = "IService",
OperationName = "NullReturningContract",
Content = new ReceiveParametersContent( new Dictionary<string, OutArgument>() { { "message", new OutArgument<string>() } } )
};
SendReply sr = new SendReply()
{
Request = rcv
   Content = new SendParametersContent();
};

Добавление ссылки на службу

При вызове службы рабочего процесса в приложении рабочего процесса среда Visual Studio 2010 создает пользовательские действия обмена сообщениями, которые инкапсулируют обычные действия Send и ReceiveReply, используемые в шаблоне обмена сообщениями «запрос-ответ». Для использовании этой функции щелкните правой кнопкой мыши клиентский проект в среде Visual Studio 2010 и выберите Добавить ссылку на службу. Введите базовый адрес службы в поле адреса и щелкните «Перейти». Доступные службы отображаются в поле Службы:. Разверните узел службы для отображения поддерживаемых контрактов. Выберите контракт, который следует вызвать, и в поле Операции будет отображен список доступных операций. Затем можно указать пространство имен для создаваемого действия и нажать кнопку ОК. Появится диалоговое окно с сообщением, что операция была завершена успешно, а созданные пользовательские действия появятся в области элементов после повторного построения проекта. Для каждой операции, определенной в контракте службы, существует одно действие. После повторного построения проекта пользователь сможет перетаскивать пользовательские действия в рабочий процесс и задавать любые необходимые свойства в окне свойств.

Шаблоны действий обмена сообщениями

Для облегчения настройки шаблона обмена сообщениями «запрос-ответ» на клиенте и в службе среда Visual Studio 2010 предоставляет два шаблона обмена сообщениями. Шаблон ReceiveAndSendReply используется для службы, шаблон SendAndReceiveReply — для клиента. В обоих случаях шаблоны добавят соответствующие действия обмена сообщениями в рабочий процесс. Для службы шаблон ReceiveAndSendReply добавит действие Receive, за которым следует действие SendReply. Свойство Request автоматически задается для действия Receive. Для клиента шаблон SendAndReceiveReply добавит действие Send, за которым следует действие ReceiveReply. Свойство Request автоматически задается для действия Send. Чтобы использовать эти шаблоны, перетащите соответствующий шаблон в рабочий процесс.

Действия обмена сообщениями и транзакции

При вызове службы рабочего процесса может быть полезно выделить для операции службы транзакцию. Чтобы сделать это, поместите действие Receive в действие TransactedReceiveScope. Действие TransactedReceiveScope содержит действие Receive и текст. Транзакция, выделяемая службе, остается внешней в течение выполнения текста TransactedReceiveScope. Транзакция завершает работу, когда завершается выполнение текста. Дополнительные сведения рабочих процессах и транзакциях см. в разделе Транзакции рабочих процессов.