Atividades de mensagem
Atividades que 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 MEP (padrão de troca de mensagens) arbitrariamente complexo.
Padrões de troca de mensagens
Há três padrões básicos de troca de mensagens:
Datagram: ao usar o MEP de datagrama, o cliente envia uma mensagem para o serviço, mas o serviço não responde. Às vezes, isso é chamado de "fire and forget" (disparar e esquecer). Uma troca do tipo disparar e esquecer é aquela que requer confirmação de entrega bem-sucedida fora da faixa. 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 tenha recebido a mensagem. O datagram é um bloco de construção fundamental para mensagens, pois você pode criar seus próprios MEPs sobre ele.
Request-Response: ao usar o MEP Request-Response, o cliente envia uma mensagem para o serviço, o serviço faz o processamento necessário e envia uma resposta de volta para o cliente. O padrão consiste em pares de Request-Response. Exemplos de chamadas de solicitação-resposta são chamadas de procedimento remoto (RPC) e solicitações GET do navegador. Esse padrão também é conhecido como meio duplex.
Duplex: ao usar o MEP duplex, o cliente e o serviço podem enviar mensagens entre si em qualquer ordem. O MEP duplex é como uma conversa telefônica, onde cada palavra que está sendo falada é uma mensagem.
As atividades de mensagens permitem que você implemente qualquer um desses MEPs básicos, bem como qualquer MEP arbitrariamente complexo.
Atividades de mensagem
O .NET Framework 4.6.1 define as seguintes atividades de mensagens:
SendReply- Usa a atividade SendReply para enviar uma resposta a uma mensagem recebida. Essa atividade é usada pelos serviços de fluxo de trabalho ao implementar um MEP de solicitação/resposta.
ReceiveReply- Use a atividade ReceiveReply para responder a uma mensagem. Essa atividade é usada pelos clientes de serviços 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 enviando uma mensagem e um serviço recebendo a mensagem. Se o cliente for um fluxo de trabalho, use uma atividade Send para enviar a mensagem. Para receber essa mensagem em um fluxo de trabalho, use uma atividade Receive. As atividades Send e Receive possuem uma propriedade de Content
cada uma. Essa propriedade contém os dados que estão sendo enviados ou recebidos. Ao implementar o MEP Request-Response, o cliente e o serviço usam pares de atividades. O cliente usa uma atividade Send para enviar a mensagem e uma atividade ReceiveReply para receber a resposta do serviço. Essas duas atividades são associadas uma à outra pela propriedade Request. Essa propriedade é definida como a atividade Send que enviou a mensagem original. O serviço também usa um par de atividades associadas: Receive e SendReply. Essas duas atividades são associadas pela propriedade Request. Essa propriedade é definida como a atividade Receive que enviou a mensagem original. As atividades ReceiveReply e SendReply, como Send e Receive permitem que você envie uma instância Message ou um tipo de contrato de mensagem.
Devido à natureza de execução prolongada dos fluxos de trabalho, é importante que o padrão duplex de comunicação também dê suporte a conversas de longa execução. Para dar suporte a conversas de longa execução, os clientes que iniciam a conversa devem fornecer ao serviço a oportunidade de chamá-lo novamente posteriormente quando os dados estiverem disponíveis. Por exemplo, uma solicitação de pedido 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 retomar após a aprovação. Esse padrão de comunicação duplex tem suporte em fluxos de trabalho usando correlação. Para implementar um padrão duplex, use atividades Send e Receive. Na atividade Receive, inicialize uma correlação usando CorrelationHandle. No conjunto de atividades Send, esse identificador de correlação é definido como o valor da propriedade CorrelatesWith. Para obter mais informações, consulte Duplex durável.
Observação
A implementação de duplex do fluxo de trabalho usando uma correlação de retorno de chamada ("Duplex Durável") destina-se a conversas de longa execução. Isso não é o mesmo que duplex do WCF com contratos de retorno de chamada em que a conversa é curta (o tempo de vida do canal).
Atividades de formatação de mensagens e mensagens
As atividades Receive e ReceiveReply possuem uma propriedade chamada Content
. Essa propriedade é do tipo ReceiveContent e representa os 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 Content
da atividade Receive ou ReceiveReply como uma instância de um desses tipos para receber dados em um serviço de fluxo de trabalho. O tipo a ser usado depende do tipo de dados que a atividade recebe. Se a atividade receber um objeto Message
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 enviar 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 o uso de ReceiveParametersContent com um único parâmetro e o objeto passado diretamente para ReceiveMessageContent é o formato de dados. 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 de tipo qualificado XML (por exemplo, <string>Hello, World</string>
).
As atividades Send e SendReply também possuem uma propriedade chamada Content
. Essa propriedade é do tipo SendContent e representa os dados que a atividade Send ou SendReply envia. O .NET Framework define dois tipos relacionadas chamados SendMessageContent e SendParametersContent, ambos derivados de SendContent. Defina a propriedade Content
da atividade Send ou SendReply como uma instância de um desses tipos para enviar dados de um serviço de fluxo de trabalho. O tipo a ser usado depende do tipo de dados que a atividade envia. Se a atividade enviar um objeto Message
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 enviar um objeto, a mensagem (ou tipo de contrato da mensagem).
Ao programar de forma imperativa com as atividades de mensagens, você usa o genérico InArgument<T> e OutArgument<T> para encapsular os objetos atribuídos às propriedades de mensagens ou parâmetros das atividades Send, SendReply, Receive e ReceiveReply. Use InArgument<T> para atividades Send e SendReply, e OutArgument<T> para as atividade Receive e ReceiveReply. In
os argumentos são usados com as atividades de envio 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 nulo, você deve instanciar uma atividade SendReply e definir a propriedade Content 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 Send e ReceiveReply normais 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 com suporte. 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 que você reconstruiu o projeto. Há uma atividade para cada operação definida no contrato de serviço. Depois de recompilar o projeto, você pode arrastar e soltar as atividades personalizadas no fluxo de trabalho e definir 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 fluxo de trabalho. No serviço, a atividade System.ServiceModel.Activities.Design.ReceiveAndSendReply
adiciona uma atividade Receive seguida por uma atividade SendReply. A propriedade Request é definida automaticamente como a atividade Receive. No cliente, o System.ServiceModel.Activities.Design.SendAndReceiveReply
adiciona uma atividade Send seguida por um ReceiveReply. A propriedade Request é definida automaticamente como a atividade Send. Para usar esses modelos, basta arrastar e soltar o modelo apropriado no fluxo de trabalho.
Atividades e transações de mensagens
Quando uma chamada é feita para um serviço de fluxo de trabalho, talvez você queira fluir uma transação para a operação de serviço. Para fazer isso, coloque a atividade Receive dentro de uma atividade TransactedReceiveScope. A atividade TransactedReceiveScope contém uma atividade e um corpo Receive
. A transação fluiu 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 ser executado. Para obter mais informações sobre fluxos de trabalho e transações, consulte Transações de fluxo de trabalho.