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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание.

Реализация дуплексного рабочего процесса с помощью корреляции обратного вызова ("Устойчивый дуплекс") предназначена для длительных бесед. Это не то же самое, что «дуплекс» WCF с контрактами обратного вызова, в которых диалоги являются кратковременными (на время существования канала).

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

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

Примечание.

ReceiveMessageContent также можно использовать с одним контрактом данных или типом XML, который может быть сериализован. Разница между использованием класса ReceiveParametersContent с одним параметром и передачей объекта напрямую классу ReceiveMessageContent заключается в формате сообщений. Содержимое параметра упаковывается в элемент 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. Задайте для свойства Send действия SendReply или Content значение экземпляра одного из этих типов для отправки данных из службы рабочего процесса. Используемые типы зависят от типа данных, отправляемых действием. Если действие отправляет объект Message или тип контракта сообщения, следует использовать SendMessageContent. Если действие отправляет тип контракта, используйте SendParametersContent. SendParametersContent позволяет отправлять несколько параметров, SendMessageContent позволяет отправлять только один объект - сообщение (или тип контракта сообщения).

При императивном программировании действий обмена сообщениями следует использовать универсальные аргументы InArgument<T> и OutArgument<T> для упаковки объектов, назначенных для сообщения или свойств параметров для действий Send, SendReply, Receive и ReceiveReply. Используется InArgument<T> для Send действий и SendReply действий и ReceiveOutArgument<T>ReceiveReply действий. С действиями по передаче сообщений используются аргументы In, поскольку в действия передаются данные. С действиями по получению сообщений используются аргументы Out, поскольку данные принимаются от действий, как показано в следующем примере.

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 значение пустого экземпляра одного из типов содержимого (SendMessageContent или 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 2012 создает пользовательские действия обмена сообщениями, которые инкапсулируют обычные Send действия и ReceiveReply действия, используемые в meP запроса или ответа. Чтобы использовать эту функцию, щелкните правой кнопкой мыши клиентский проект в Visual Studio и выберите "Добавить>ссылку на службу". Введите базовый адрес службы в поле адреса и щелкните «Перейти». Доступные службы отображаются в поле "Службы". Разверните узел службы для отображения поддерживаемых контрактов. Выберите контракт, который нужно вызвать, и список доступных операций отображается в поле "Операции ". Затем можно указать пространство имен для созданного действия и нажмите кнопку ОК. Появится диалоговое окно с сообщением, что операция была завершена успешно, а созданные пользовательские действия появятся в области элементов после повторного построения проекта. Для каждой операции, определенной в контракте службы, существует одно действие. После повторного построения проекта пользователь сможет перетаскивать пользовательские действия в рабочий процесс и задавать любые необходимые свойства в окне свойств.

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

Чтобы упростить настройку meP запроса и ответа на клиенте и службе, Visual Studio 2012 предоставляет два шаблона действий обмена сообщениями. System.ServiceModel.Activities.Design.ReceiveAndSendReply используется в службе, а System.ServiceModel.Activities.Design.SendAndReceiveReply используется на клиенте. В обоих случаях шаблоны добавят соответствующие действия обмена сообщениями в рабочий процесс. Для службы шаблон System.ServiceModel.Activities.Design.ReceiveAndSendReply добавит действие Receive, за которым следует действие SendReply. Свойство Request автоматически задается для действия Receive. Для клиента шаблон System.ServiceModel.Activities.Design.SendAndReceiveReply добавит действие Send, за которым следует действие ReceiveReply. Свойство Request автоматически задается для действия Send. Чтобы использовать эти шаблоны, перетащите соответствующий шаблон в рабочий процесс.

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

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

См. также