Enfileiramento no WCF

Esta seção descreve como usar a comunicação em fila no Windows Communication Foundation (WCF).

Filas como uma ligação de transporte WCF

No WCF, os contratos especificam o que está sendo trocado. Os contratos são trocas de mensagens dependentes da empresa ou específicas do aplicativo. O mecanismo usado para trocar mensagens (ou o "como") é especificado nas ligações. As ligações no WCF encapsulam detalhes da troca de mensagens. Eles expõem botões de configuração para o usuário controlar vários aspetos do transporte ou do protocolo que as ligações representam. O enfileiramento no WCF é tratado como qualquer outra ligação de transporte, o que é uma grande vantagem para muitos aplicativos de enfileiramento. Hoje, muitos aplicativos de enfileiramento são escritos de forma diferente de outros aplicativos distribuídos no estilo RPC (chamada de procedimento remoto), dificultando o acompanhamento e a manutenção. Com o WCF, o estilo de escrever um aplicativo distribuído é praticamente o mesmo, facilitando o acompanhamento e a manutenção. Além disso, ao considerar o mecanismo de troca separadamente da lógica de negócios, é mais fácil configurar o transporte ou fazer alterações nele sem afetar o código específico do aplicativo. A figura a seguir ilustra a estrutura de um serviço WCF e cliente usando MSMQ como um transporte.

Queued Application Diagram

Como você pode ver na figura anterior, o cliente e o serviço devem definir apenas a semântica do aplicativo, ou seja, o contrato e a implementação. O serviço configura uma ligação em fila com configurações preferenciais. O cliente usa a ServiceModel Metadata Utility Tool (Svcutil.exe) para gerar um cliente WCF para o serviço e para gerar um arquivo de configuração que descreve as associações a serem usadas para enviar mensagens ao serviço. Assim, para enviar uma mensagem em fila, o cliente instancia um cliente WCF e invoca uma operação nele. Isso faz com que a mensagem seja enviada para a fila de transmissão e transferida para a fila de destino. Todas as complexidades da comunicação em fila estão ocultas do aplicativo que está enviando e recebendo mensagens.

As advertências sobre a vinculação em fila no WCF incluem:

  • Todas as operações de serviço devem ser unidirecionais porque a associação em fila padrão no WCF não oferece suporte à comunicação duplex usando filas. Um exemplo de comunicação bidirecional (Comunicação bidirecional) ilustra como usar dois contratos unidirecionais para implementar comunicação duplex usando filas.

  • Para gerar um cliente WCF usando a troca de metadados requer um ponto de extremidade HTTP adicional no serviço para que ele possa ser consultado diretamente para gerar o cliente WCF e obter informações de ligação para configurar adequadamente a comunicação em fila.

  • Com base na ligação em fila, é necessária uma configuração extra fora do WCF. Por exemplo, a classe que é fornecida com o NetMsmqBinding WCF requer que você configure as associações, bem como minimamente configurar o serviço de enfileiramento de mensagens (MSMQ).

As seções a seguir descrevem as ligações em fila específicas fornecidas com o WCF, que são baseadas no MSMQ.

MSMQ

O transporte em fila no WCF usa MSMQ para sua comunicação em fila.

O MSMQ é fornecido como um componente opcional com o Windows e é executado como um serviço NT. Ele captura mensagens para transmissão em uma fila de transmissão e para entrega em uma fila de destino. Os gerenciadores de filas MSMQ implementam um protocolo confiável de transferência de mensagens para que as mensagens não sejam perdidas na transmissão. O protocolo pode ser nativo ou baseado em SOAP, como o SOAP Reliable Message Protocol (SRMP).

No MSMQ, as filas podem ser transacionais ou não transacionais. Uma fila transacional permite que as mensagens sejam capturadas e entregues em uma transação e, em seguida, armazenadas de forma durável na fila. As mensagens enviadas para uma fila transacional são transferidas exatamente uma vez na ordem. Você pode usar uma fila não transacional para enviar mensagens voláteis e duráveis. Uma mensagem enviada para uma fila não transacional não possui garantias de transferência confiáveis; assim, as mensagens podem ser perdidas.

As filas MSMQ também podem ser protegidas usando uma identidade do Windows registrada no serviço de diretório do Ative Directory. Ao instalar o MSMQ, você pode instalar a integração do Ative Directory, que requer que o computador faça parte de uma rede de domínio do Windows.

Para obter mais informações sobre o MSMQ, consulte Instalando o serviço de enfileiramento de mensagens (MSMQ).

NetMsmqBinding

O <netMsmqBinding> é a ligação em fila que o WCF fornece para dois pontos de extremidade WCF para se comunicar usando o MSMQ. A ligação, portanto, expõe propriedades que são específicas para MSMQ. No entanto, nem todos os recursos e propriedades do MSMQ são expostos no NetMsmqBinding. O compacto NetMsmqBinding é projetado com um conjunto ideal de recursos que a maioria dos clientes deve achar suficiente.

O NetMsmqBinding manifesta os principais conceitos de fila discutidos até agora na forma de propriedades nas ligações. Essas propriedades, por sua vez, comunicam ao MSMQ como transferir e entregar as mensagens. Uma discussão sobre as categorias de propriedade está nas seções a seguir. Para obter mais informações, consulte os tópicos conceituais que descrevem propriedades específicas mais completamente.

ExatamenteUma vez e propriedades duráveis

As ExactlyOnce propriedades e Durable afetam como as mensagens são transferidas entre filas:

  • ExactlyOnce: Quando definido como true (o padrão), o canal em fila garante que a mensagem, se entregue, não seja duplicada. Também garante que a mensagem não seja perdida. Se a mensagem não puder ser entregue ou se o tempo de vida da mensagem expirar antes que a mensagem possa ser entregue, a mensagem com falha, juntamente com o motivo da falha de entrega, será registrada em uma fila de mensagens mortas. Quando definido como false, o canal em fila faz um esforço para transferir a mensagem. Nesse caso, você pode, opcionalmente, escolher uma fila de mensagens mortas.

  • Durable: Quando definido como true (o padrão), o canal em fila garante que o MSMQ armazene a mensagem de forma durável no disco. Assim, se o serviço MSMQ parar e reiniciar, as mensagens no disco serão transferidas para a fila de destino ou entregues ao serviço. Quando definido como false, as mensagens são armazenadas em armazenamento volátil e são perdidas ao parar e reiniciar o serviço MSMQ.

Para ExactlyOnce uma transferência confiável, o MSMQ exige que a fila seja transacional. Além disso, o MSMQ requer uma transação para ler de uma fila transacional. Como tal, quando utilizar o NetMsmqBinding, lembre-se de que é necessária uma transação para enviar ou receber mensagens quando ExactlyOnce estiver definido como true. Da mesma forma, o MSMQ exige que a fila não seja transacional para garantias de melhor esforço, como quando ExactlyOnce está false e para mensagens voláteis. Assim, ao definir ExactlyOnce como false ou durável para false, você não pode enviar ou receber usando uma transação.

Nota

Certifique-se de que a fila correta (transacional ou não transacional) seja criada com base nas configurações nas associações. Se ExactlyOnce for true, use uma fila transacional, caso contrário, use uma fila não transacional.

Propriedades da fila de mensagens mortas

A fila de mensagens mortas é usada para armazenar mensagens que falham na entrega. O usuário pode escrever uma lógica de compensação que lê mensagens fora da fila de mensagens mortas.

Muitos sistemas de fila fornecem uma fila de mensagens mortas em todo o sistema. O MSMQ fornece uma fila de mensagens mortas não transacionais em todo o sistema para mensagens que falham na entrega para filas não transacionais e uma fila de cartas mortas transacionais em todo o sistema para mensagens que falham na entrega para filas transacionais.

Se vários clientes que enviam mensagens para filas de destino diferentes compartilham o serviço MSMQ, todas as mensagens enviadas pelos clientes vão para a mesma fila de mensagens mortas. Nem sempre é preferível. Para um melhor isolamento, o WCF e o MSMQ no Windows Vista fornecem uma fila de mensagens mortas personalizada (ou fila de cartas mortas específica do aplicativo) que o usuário pode especificar para armazenar mensagens que falham na entrega. Portanto, clientes diferentes não compartilham a mesma fila de mensagens mortas.

A ligação tem duas propriedades de interesse:

  • DeadLetterQueue: Esta propriedade é uma enumeração que indica se uma fila de letras mortas é solicitada. A enumeração também contém o tipo de fila de letras mortas, se for solicitada. Os valores são None, Systeme Custom. Para obter mais informações sobre a interpretação dessas propriedades, consulte Usando filas de mensagens mortas para lidar com falhas de transferência de mensagens

  • CustomDeadLetterQueue: Esta propriedade é o endereço URI (Uniform Resource Identifier) da fila de letras mortas específica do aplicativo. Isto é necessário se DeadLetterQueue.Custom é escolhida.

Propriedades de manipulação de mensagens suspeitas

Quando o serviço lê mensagens da fila de destino em uma transação, o serviço pode falhar ao processar a mensagem por vários motivos. A mensagem é então colocada de volta na fila para ser lida novamente. Para lidar com mensagens que falham repetidamente, um conjunto de propriedades de manipulação de mensagens suspeitas pode ser configurado na associação. Existem quatro propriedades: ReceiveRetryCount, MaxRetryCycles, RetryCycleDelay, e ReceiveErrorHandling. Para obter mais informações sobre essas propriedades, consulte Tratamento de mensagens suspeitas.

Propriedades de Segurança

O MSMQ expõe seu próprio modelo de segurança, como listas de controle de acesso (ACLs) em uma fila ou enviando mensagens autenticadas. O NetMsmqBinding expõe essas propriedades de segurança como parte de suas configurações de segurança de transporte. Há duas propriedades na associação para segurança de transporte: MsmqAuthenticationMode e MsmqProtectionLevel. As configurações nessas propriedades dependem de como o MSMQ está configurado. Para obter mais informações, consulte Protegendo mensagens usando a segurança de transporte.

Além da segurança de transporte, a própria mensagem SOAP pode ser protegida usando a segurança da mensagem. Para obter mais informações, consulte Protegendo mensagens usando a segurança de mensagens.

MsmqTransportSecurity também expõe duas propriedades, MsmqEncryptionAlgorithm e MsmqHashAlgorithm. Estas são enumerações de algoritmos diferentes para escolher para criptografia de transferência de fila para fila de mensagens e hashing das assinaturas.

Outros Imóveis

Além das propriedades anteriores, outras propriedades específicas do MSMQ expostas na associação incluem:

  • UseSourceJournal: Uma propriedade para indicar que o registro no diário de origem está ativado. O registro no diário de origem é um recurso do MSMQ que controla as mensagens que foram transmitidas com êxito da fila de transmissão.

  • UseMsmqTracing: Uma propriedade para indicar que o rastreamento MSMQ está ativado. O rastreamento MSMQ envia mensagens de relatório para uma fila de relatórios sempre que uma mensagem sai ou chega a uma máquina que hospeda um gerenciador de filas MSMQ.

  • QueueTransferProtocol: Uma enumeração do protocolo a ser usado para transferências de mensagens de fila para fila. O MSMQ implementa um protocolo de transferência nativo de fila para fila e um protocolo baseado em SOAP chamado SOAP Reliable Messaging Protocol (SRMP). O SRMP é usado ao usar o transporte HTTP para transferências de fila para fila. O SRMP secure é usado ao usar HTTPS para transferências de fila para fila.

  • UseActiveDirectory: Um valor booleano para indicar se o Ative Directory deve ser usado para resolução de endereços de fila. Por padrão, isso está desativado. Para obter mais informações, consulte Pontos de extremidade de serviço e endereçamento de fila.

MsmqIntegrationBinding

O MsmqIntegrationBinding é usado quando você deseja que um ponto de extremidade WCF se comunique com um aplicativo MSMQ existente escrito em APIs C, C++, COM ou System.Messaging.

As propriedades de vinculação são as mesmas que para NetMsmqBinding. No entanto, aplicam-se as seguintes diferenças:

  • O contrato de operação para MsmqIntegrationBinding é restrito a tomar um único parâmetro de tipo MsmqMessage<T> onde o parâmetro de tipo é o tipo de corpo.

  • Grande parte das propriedades de mensagens nativas do MSMQ são expostas no MsmqMessage<T> para uso.

  • Para ajudar com a serialização e desserialização do corpo da mensagem, serializadores como XML e ActiveX são fornecidos.

Código de Exemplo

Para obter instruções passo a passo sobre como escrever serviços WCF que usam MSMQ, consulte os seguintes tópicos:

Para obter um exemplo de código concluído ilustrando o uso do MSMQ no WCF, consulte os seguintes tópicos:

Consulte também