Partilhar via


Atividades de mensagens

As atividades de mensagens permitem que os fluxos de trabalho enviem e recebam mensagens WCF. Ao adicionar atividades de mensagens a um fluxo de trabalho, você pode modelar qualquer padrão de troca de mensagens arbitrariamente complexo (MEP).

Padrões de troca de mensagens

Existem três padrões básicos de troca de mensagens:

  • Datagrama - Ao usar o datagrama MEP o cliente envia uma mensagem para o serviço, mas o serviço não responde. Isso às vezes é chamado de "fogo e esquecimento". Uma troca de fogo e esquecimento é aquela que requer confirmação fora da banda de entrega bem-sucedida. A mensagem pode ser perdida em trânsito e nunca chegar ao serviço. Se o cliente enviar uma mensagem com êxito, ele não garante que o serviço recebeu a mensagem. O datagrama é um alicerce fundamental para as mensagens, uma vez que pode criar os seus próprios deputados em cima dele.

  • Solicitação-resposta - Ao usar o MEP solicitação-resposta, o cliente envia uma mensagem para o serviço, o serviço faz o processamento necessário e, em seguida, envia uma resposta de volta para o cliente. O padrão consiste em pares solicitação-resposta. Exemplos de chamadas de solicitação-resposta são chamadas de procedimento remoto (RPC) e solicitações GET do navegador. Este padrão também é conhecido como half-duplex.

  • Duplex - Ao usar o duplex MEP, o cliente e o serviço podem enviar mensagens um para o outro em qualquer ordem. O MEP duplex é como uma conversa telefónica, em que cada palavra dita é uma mensagem.

As atividades de mensagens permitem que você implemente qualquer um desses eurodeputados básicos, bem como qualquer deputado arbitrariamente complexo.

Atividades de mensagens

O .NET Framework 4.6.1 define as seguintes atividades de mensagens:

  • Send- Use a Send atividade para enviar uma mensagem.

  • SendReply - Use a SendReply atividade para enviar uma resposta a uma mensagem recebida. Esta atividade é utilizada pelos serviços de fluxo de trabalho ao implementar um pedido de resposta MEP.

  • Receive- Use a Receive atividade para receber uma mensagem.

  • ReceiveReply - Use a ReceiveReply atividade para receber uma mensagem de resposta. Esta atividade é usada por clientes de serviço de fluxo de trabalho ao implementar um MEP de solicitação/resposta.

Atividades de mensagens e padrões de troca de mensagens

Um MEP de datagrama envolve um cliente que envia uma mensagem e um serviço recebe a mensagem. Se o cliente for um fluxo de trabalho, use uma Send atividade para enviar a mensagem. Para receber essa mensagem em um fluxo de trabalho, use uma Receive atividade. As Send atividades e Receive cada uma tem uma propriedade chamada Content. Esta propriedade contém os dados que estão sendo enviados ou recebidos. Ao implementar o MEP solicitação-resposta, tanto o cliente quanto o serviço usam pares de atividades. O cliente usa uma Send atividade para enviar a mensagem e uma ReceiveReply atividade para receber a resposta do serviço. Estas duas atividades estão associadas uma à Request outra pela propriedade. Esta propriedade é definida como a Send atividade que enviou a mensagem original. O serviço também utiliza um par de atividades associadas: Receive e SendReply. Estas duas atividades estão associadas pelo Request imóvel. Esta propriedade é definida como a Receive atividade que recebeu a mensagem original. As ReceiveReply atividades e SendReply permitem SendReceive que você envie uma Message instância ou um tipo de contrato de mensagem.

Devido à natureza de longa duração dos fluxos de trabalho, é importante que o padrão duplex de comunicação também ofereça suporte a conversas de longa duração. Para dar suporte a conversas de longa duração, os clientes que iniciam a conversa devem fornecer ao serviço a oportunidade de chamá-lo de volta em um momento posterior, quando os dados estiverem disponíveis. Por exemplo, uma solicitação de ordem de compra é enviada para aprovação do gerente, mas pode não ser processada por um dia, uma semana ou até mesmo um ano; O fluxo de trabalho que gerencia a aprovação da ordem de compra deve saber ser retomado após a aprovação ser dada. Esse padrão de comunicação duplex é suportado em fluxos de trabalho usando correlação. Para implementar um padrão duplex, uso Send e Receive atividades. Receive Na atividade, inicialize uma correlação usando CorrelationHandle. No conjunto de atividades, Send essa correlação é tratada como o valor da CorrelatesWith propriedade. Para obter mais informações, consulte Duplex durável.

Nota

A implementação do fluxo de trabalho de duplex usando uma correlação de retorno de chamada ("Duplex durável") destina-se a conversas de longa duração. Isso não é o mesmo que WCF duplex com contratos de retorno de chamada onde a conversa é de curta duração (o tempo de vida do canal).

Formatação de mensagens e atividades de mensagens

As Receive e ReceiveReply atividades têm uma propriedade chamada Content. Esta propriedade é do tipo ReceiveContent e representa os dados que a Receive atividade recebe ReceiveReply . O .NET Framework define duas classes relacionadas chamadas ReceiveMessageContent e ReceiveParametersContent ambas derivadas de ReceiveContent. Defina a Receive propriedade ou ReceiveReply atividade Content como uma instância de um desses tipos para receber dados em um serviço de fluxo de trabalho. O tipo a utilizar depende do tipo de dados que a atividade recebe. Se a atividade receber um Message objeto ou um tipo de contrato de mensagem, use ReceiveMessageContent. Se a atividade receber um conjunto de contratos de dados ou tipos XML que podem ser serializados, use ReceiveParametersContent. ReceiveParametersContent permite que você envie vários parâmetros, enquanto ReceiveMessageContent só permite que você envie um objeto, a mensagem (ou tipo de contrato de mensagem).

Nota

ReceiveMessageContent também pode ser usado com um único contrato de dados ou tipo XML que pode ser serializado. A diferença entre usar ReceiveParametersContent com um único parâmetro e o objeto passado diretamente para ReceiveMessageContent é o formato de fio. O conteúdo do parâmetro é encapsulado em um elemento XML que corresponde ao nome da operação e o objeto serializado é encapsulado em um elemento XML usando o nome do parâmetro (por exemplo, <Echo><msg>Hello, World</msg></Echo>). O conteúdo da mensagem não é encapsulado pelo nome da operação. Em vez disso, o objeto serializado é colocado dentro de um elemento XML usando o nome do tipo qualificado para XML (por exemplo, <string>Hello, World</string>).

As Send atividades e SendReply também têm uma propriedade chamada Content. Esta propriedade é do tipo SendContent e representa os dados que a Send atividade envia SendReply . O .NET Framework define dois tipos relacionados chamados SendMessageContent e SendParametersContent ambos derivados de SendContent. Defina a Send propriedade ou SendReplyContent atividade como uma instância de um desses tipos para enviar dados de um serviço de fluxo de trabalho. O tipo a utilizar depende do tipo de dados que a atividade envia. Se a atividade enviar um Message objeto ou um tipo de contrato de mensagem, use SendMessageContent. Se a atividade enviar um tipo de contrato de dados, use SendParametersContent. SendParametersContent permite que você envie vários parâmetros, enquanto SendMessageContent só permite que você envie um objeto, a mensagem (ou o tipo de contrato de mensagem).

Ao programar imperativamente com as atividades de mensagens, você usa o genérico InArgument<T> e para encapsular os objetos atribuídos às propriedades de mensagem ou parâmetros das atividades , SendReplySend, Receivee ReceiveReply .OutArgument<T> Uso InArgument<T> para as Send e SendReply atividades e OutArgument<T> para Receive e ReceiveReply atividades. In Os argumentos são usados com as atividades Send porque os dados estão sendo passados para as atividades. Out Os argumentos são usados com as atividades de recebimento porque os dados estão sendo passados para fora das atividades, conforme mostrado no exemplo a seguir.

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) }
        }
    },
};

Ao implementar um serviço de fluxo de trabalho que define uma operação de solicitação/resposta que retorna void, você deve instanciar uma SendReply atividade e definir a Content propriedade como uma instância vazia de um dos tipos de conteúdo (SendMessageContent ou SendParametersContent), conforme mostrado no exemplo a seguir.

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();
};

Adicionar referência de serviço

Ao chamar um serviço de fluxo de trabalho de um aplicativo de fluxo de trabalho, o Visual Studio 2012 gera atividades de mensagens personalizadas que encapsulam as atividades usuais Send e ReceiveReply usadas em um MEP de solicitação/resposta. Para usar esse recurso, clique com o botão direito do mouse no projeto cliente no Visual Studio e selecione Adicionar>referência de serviço. Digite o endereço base do serviço na caixa de endereço e clique em Ir. Os serviços disponíveis são exibidos na caixa Serviços: . Expanda o nó de serviço para exibir os contratos suportados. Selecione o contrato que você deseja chamar e a lista de operações disponíveis é exibida na caixa Operações . Em seguida, você pode especificar o namespace para a atividade gerada e clicar em OK. Em seguida, você verá uma caixa de diálogo que diz que a operação foi concluída com êxito e que as atividades personalizadas geradas estão na caixa de ferramentas depois de ter reconstruído o projeto. Existe uma atividade para cada operação definida no contrato de prestação de serviços. Depois de reconstruir o projeto, você pode arrastar e soltar as atividades personalizadas em seu fluxo de trabalho e definir todas as propriedades necessárias na janela de propriedades.

Modelos de atividade de mensagens

Para facilitar a configuração de um MEP de solicitação/resposta no cliente e no serviço, o Visual Studio 2012 fornece dois modelos de atividade de mensagens. System.ServiceModel.Activities.Design.ReceiveAndSendReply é usado no serviço e System.ServiceModel.Activities.Design.SendAndReceiveReply é usado no cliente. Em ambos os casos, os modelos adicionam as atividades de mensagens apropriadas ao seu fluxo de trabalho. No serviço, o System.ServiceModel.Activities.Design.ReceiveAndSendReply adiciona uma Receive atividade seguida de uma SendReply atividade. A Request propriedade é definida automaticamente para a Receive atividade. No cliente, o System.ServiceModel.Activities.Design.SendAndReceiveReply adiciona uma Send atividade seguida por um ReceiveReplyarquivo . A Request propriedade é definida automaticamente para a Send atividade. Para usar esses modelos, basta arrastar e soltar o modelo apropriado em seu fluxo de trabalho.

Atividades e transações de mensagens

Quando uma chamada é feita para um serviço de fluxo de trabalho, você pode querer fluir uma transação para a operação de serviço. Para fazer isso, coloque a atividade dentro de Receive uma TransactedReceiveScope atividade. A TransactedReceiveScope atividade contém uma Receive atividade e um corpo. A transação fluída para o serviço permanece ambiente durante toda a execução do corpo do TransactedReceiveScope. A transação é concluída quando o corpo termina de executar. Para obter mais informações sobre fluxos de trabalho e transações, consulte Transações de fluxo de trabalho.

Consulte também