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 tipo "disparar e esquecer" é aquela que requer confirmação externa da 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, onde cada palavra falada é 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 atividade ReceiveReply para receber uma mensagem de retorno. 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 num fluxo de trabalho, use a atividade Receive. As atividades Send 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 de solicitação-resposta, o cliente e o serviço utilizam conjuntos de atividades. O cliente usa uma Send atividade para enviar a mensagem e uma ReceiveReply atividade para receber a resposta do serviço. A propriedade Request associa estas duas atividades entre si. 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 pela propriedade Request. Esta propriedade é definida para a Receive atividade que recebeu a mensagem original. As atividades ReceiveReply e SendReply, tal como Send e Receive, permitem-lhe enviar uma instância de Message 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, use as atividades Send e Receive. Inicialize uma correlação na Receive atividade usando CorrelationHandle. No conjunto de atividades, Send essa correlação é tratada como o valor da CorrelatesWith propriedade. Para obter mais informações, consulte Durable Duplex.

Observação

A implementação de fluxo de trabalho do duplex usando uma correlação de retorno de chamada ("Duplex Durável") é destinada a conversas de longa duração. Isso não é o mesmo que WCF duplex com contratos de callback onde a duração da conversa é curta (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 dados que a atividade Receive ou ReceiveReply recebe. O .NET Framework define duas classes relacionadas chamadas ReceiveMessageContent e ReceiveParametersContent ambas derivadas de ReceiveContent. Defina a propriedade Receive da atividade ReceiveReply ou Content como uma instância de um desses tipos para receber dados num serviço workflow. 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).

Observação

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 transmissão. 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 atividades Send e SendReply também têm uma propriedade chamada Content. Esta propriedade é do tipo SendContent e representa os dados que a atividade Send ou SendReply envia. O .NET Framework define dois tipos relacionados chamados SendMessageContent e SendParametersContent ambos derivados de SendContent. Defina a propriedade Send da atividade SendReply ou Content como uma instância de um destes tipos para enviar dados de um serviço de workflow. 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, usa o genérico InArgument<T> e OutArgument<T> para encapsular os objetos atribuídos às propriedades de mensagem ou parâmetros das atividades Send, SendReply, Receive e ReceiveReply. Uso InArgument<T> para as Send e SendReply atividades e OutArgument<T> para Receive e ReceiveReply atividades. In Os argumentos são usados nas atividades de send porque os dados são 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 por outra SendReply. A Request propriedade é definida automaticamente para a Receive atividade. No cliente, o System.ServiceModel.Activities.Design.SendAndReceiveReply adiciona uma Send atividade seguida por um ReceiveReply. 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, pode desejar transferir uma transação para o processo de serviço. Para fazer isso, coloque a atividade Receive dentro de uma atividade TransactedReceiveScope. A atividade TransactedReceiveScope contém a atividade Receive e um corpo. A transação que flui para o serviço permanece no ambiente durante toda a execução do corpo do TransactedReceiveScope. A transação é concluída quando a execução do corpo termina. Para obter mais informações sobre fluxos de trabalho e transações, consulte Transações de fluxo de trabalho.

Ver também