Compartilhar via


Enfileiramento no WCF

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

Filas como uma associação de transporte do WCF

No WCF, os contratos especificam o que está sendo trocado. Os contratos são trocas de mensagens específicas de aplicativos ou dependentes de negócios. O mecanismo usado para trocar mensagens (ou "como") é especificado nas associações. As associações no WCF encapsulam detalhes da troca de mensagens. Eles expõem botões de configuração para o usuário controlar vários aspectos do transporte ou do protocolo que as associações representam. O enfileiramento no WCF é tratado como qualquer outra associaçã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), o que os torna mais difíceis de seguir e manter. Com o WCF, o estilo de escrever um aplicativo distribuído é praticamente o mesmo, facilitando o seu 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 e cliente WCF usando o MSMQ como 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 associação na fila com configurações preferenciais. O cliente usa a Ferramenta de Utilitário de Metadados do ServiceModel (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. Portanto, para enviar uma mensagem na fila, o cliente cria uma instância de 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 na fila são ocultas do aplicativo que está enviando e recebendo mensagens.

As ressalvas sobre a associação na fila no WCF incluem:

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

  • Para gerar um cliente WCF usando a troca de metadados, é necessário 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 associação para configurar adequadamente a comunicação na fila.

  • Com base na associação na fila, é necessária uma configuração adicional fora do WCF. Por exemplo, a classe NetMsmqBinding fornecida com o WCF exige que você configure as associações, bem como configure minimamente o MSMQ (Enfileiramento de Mensagens).

As seções a seguir descrevem as associações na fila específicas enviadas com o WCF, que se baseiam no MSMQ.

MSMQ

O transporte na fila no WCF usa o MSMQ para sua comunicação na 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 do 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 Protocolo de Mensagens Confiáveis SOAP (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 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 a uma fila não transacional não tem 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 com o serviço de diretório do Active Directory. Ao instalar o MSMQ, você pode instalar a integração do Active Directory, que exige que o computador faça parte de uma rede de domínio do Windows.

Para obter mais informações sobre o MSMQ, confira Instalando o MSMQ (Enfileiramento de Mensagens).

NetMsmqBinding

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

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

Propriedades ExactlyOnce e Durable

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

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

  • Durable: Quando definido como true (o padrão), o canal na fila garante que o MSMQ armazene a mensagem de maneira durável no disco. Portanto, 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 no repositório volátil e são perdidas ao parar e reiniciar o serviço MSMQ.

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

Observação

Verifique se a fila correta (transacional ou não transacional) foi 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 a lógica de compensação que lê mensagens da fila de mensagens mortas.

Muitos sistemas de enfileiramento 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 a filas não transacionais e uma fila de mensagens mortas transacionais em todo o sistema para mensagens que falham na entrega a filas transacionais.

Se vários clientes que enviam mensagens para filas de destino diferentes compartilharem o serviço MSMQ, todas as mensagens enviadas pelos clientes vão para a mesma fila de mensagens mortas. Isso 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 mensagens mortas específicas 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 associação tem duas propriedades de interesse:

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

  • CustomDeadLetterQueue: essa propriedade é o endereço URI (Uniform Resource Identifier) da fila de mensagens mortas específica do aplicativo. Isso será necessário se DeadLetterQueue.Custom é escolhido.

Propriedades do tratamento 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. Em seguida, a mensagem é colocada novamente na fila para ser lida novamente. Para lidar com mensagens que falham repetidamente, um conjunto de propriedades de tratamento de mensagens suspeitas pode ser configurado na associação. Há quatro propriedades: ReceiveRetryCount, MaxRetryCycles, RetryCycleDelay e ReceiveErrorHandling. Para obter mais informações sobre essas propriedades, confira Tratamento de mensagens suspeitas.

Propriedades de segurança

O MSMQ expõe seu próprio modelo de segurança, como ACLs (listas de controle de acesso) em uma fila ou envio de 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 é configurado. Para obter mais informações, confira Protegendo mensagens usando a segurança do transporte.

Além da segurança do transporte, a mensagem SOAP em si pode ser protegida usando a segurança da mensagem. Para obter mais informações, confira Protegendo mensagens usando a segurança da mensagem.

MsmqTransportSecurity também expõe duas propriedades, MsmqEncryptionAlgorithm e MsmqHashAlgorithm. Essas são enumerações de algoritmos diferentes a serem escolhidas para a criptografia de transferência de fila para fila de mensagens e hash das assinaturas.

Outras propriedades

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

  • UseSourceJournal: uma propriedade para indicar que o registro em diário de origem está ativado. O registro em 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 do MSMQ está ativado. O rastreamento MSMQ envia mensagens de relatório para uma fila de relatório sempre que uma mensagem sai de ou chega a um computador que hospeda um gerenciador de filas MSMQ.

  • QueueTransferProtocol: uma enumeração do protocolo a ser usada para transferências de mensagens de fila para fila. O MSMQ implementa um protocolo de transferência de fila para fila nativo e um protocolo baseado em SOAP chamado Protocolo de Mensagens Confiáveis SOAP (SRMP). O SRMP é usado ao usar o transporte HTTP para transferências de fila para fila. O SRMP seguro é usado ao usar HTTPS para transferências de fila para fila.

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

MsmqIntegrationBinding

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

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

  • O contrato de operação para MsmqIntegrationBinding é restringido a usar um único parâmetro do tipo MsmqMessage<T> em que o parâmetro de tipo é o tipo de corpo.

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

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

Exemplo de código

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

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

Confira também