Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
As atividades de mensagens permitem que os fluxos de trabalho enviem e recebam mensagens WCF. Adicionando atividades de mensagens a um fluxo de trabalho, você pode modelar qualquer MEP (padrões de troca de mensagens) arbitrariamente complexos.
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 "atira e esquece". 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 recebeu a mensagem. O datagrama é um bloco de construção fundamental para mensagens, pois você pode criar seus próprios MEPs com base nele.
Solicitação-Resposta – Ao usar o MEP de solicitação-resposta, o cliente envia uma mensagem para o serviço, o serviço faz o processamento necessário e envia uma resposta de volta ao 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. Esse padrão também é conhecido como half-duplex.
Duplex – Ao usar o MEP duplex, o cliente e o serviço podem enviar mensagens uns aos outros 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 mensagens
O .NET Framework 4.6.1 define as seguintes atividades de mensagens:
SendReply - Use 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 que a recebe. 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 atividade Receive. As atividades Send e Receive têm cada uma uma propriedade chamada Content. Essa 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 fazem uso de pares de atividades. O cliente usa uma Send atividade para enviar a mensagem e uma ReceiveReply atividade para receber a resposta do serviço. Essas duas atividades são associadas uma à outra pela propriedade Request. Esta propriedade é configurada para a Send atividade 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 é atribuída à atividade Receive que recebeu 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 longo prazo dos fluxos de trabalho, é importante que o padrão duplex de comunicação também mantenha suporte a conversas de longa duração. Para dar suporte a conversas de longa execução, os clientes que iniciam a conversa devem fornecer ao serviço uma oportunidade de chamá-lo novamente em um momento posterior em que os dados ficam 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 as 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 Durable Duplex.
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).
Formatação de mensagens e atividades de mensagens
As atividades Receive e ReceiveReply têm 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 Receive ou ReceiveReply da atividade Content 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 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 que só permite enviar um objeto, a mensagem (ou o 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 por XML (por exemplo, <string>Hello, World</string>).
As atividades Send e SendReply também têm uma propriedade chamada Content. Essa propriedade é do tipo SendContent e representa dados que a Send atividade envia.SendReply O .NET Framework define dois tipos relacionados chamados SendMessageContent e SendParametersContent ambos derivados de SendContent. Defina a propriedade Send ou SendReply da atividade Content 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 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 que só permite enviar um objeto, a mensagem (ou o tipo de contrato de mensagem).
Ao programar imperativamente com as atividades de mensagens, você usa os genéricos InArgument<T> e OutArgument<T> para encapsular os objetos que você atribui à mensagem ou às propriedades de parâmetros das atividades Send, SendReply, Receive e ReceiveReply. Use InArgument<T> para as atividades Send e SendReply e OutArgument<T> para as atividades Receive e ReceiveReply. Os argumentos In são usados com as atividades de envio porque os dados estão sendo passados para as atividades. Os argumentos Out 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 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 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 informando 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 é automaticamente definida para a atividade Receive. No cliente, o System.ServiceModel.Activities.Design.SendAndReceiveReply adiciona uma Send atividade seguida por um ReceiveReply. A propriedade Request é automaticamente definida para 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 Receive atividade dentro de uma TransactedReceiveScope atividade. 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.