Compartilhar via


Pontos de extremidade de serviço e endereçamento de fila

Este tópico aborda como os clientes endereçam serviços que leem de filas e como os pontos de extremidade de serviço são mapeados para filas. Como lembrete, a ilustração a seguir mostra a implantação clássica de aplicativo enfileirado do WCF (Windows Communication Foundation).

Queued Application Diagram

Para que o cliente envie a mensagem ao serviço, o cliente endereça a mensagem para a Fila de Destino. Para que o serviço leia mensagens da fila, ele define seu endereço de escuta para a Fila de Destino. O endereçamento no WCF é baseado no URI (Uniform Resource Identifier), enquanto os nomes de fila do MSMQ (Enfileiramento de Mensagens) não são. Portanto, é essencial entender como lidar com filas criadas no MSMQ usando o WCF.

Endereçamento do MSMQ

O MSMQ usa caminhos e nomes de formato para identificar uma fila. Os caminhos especificam um nome do host e um QueueName. Opcionalmente, pode haver um Private$ entre o nome do host e o QueueName para indicar uma fila privada que não está publicada no serviço de diretório Active Directory.

Os nomes de caminho são mapeados para "FormatNames" para determinar aspectos adicionais do endereço, incluindo o roteamento e o protocolo de transferência do gerenciador de filas. O Gerenciador de Filas dá suporte a dois protocolos de transferência: protocolo MSMQ nativo e protocolo SRMP (SOAP Reliable Messaging Protocol).

Para obter mais informações sobre os nomes de caminho e o formato do MSMQ, consulte Sobre o Enfileiramento de Mensagens.

NetMsmqBinding e endereçamento de serviço

Ao endereçar uma mensagem a um serviço, o esquema no URI é escolhido com base no transporte usado para comunicação. Cada transporte no WCF tem um esquema exclusivo. O esquema precisa refletir a natureza do transporte usado para comunicação. Por exemplo, net.tcp, net.pipe, HTTP e assim por diante.

O transporte enfileirado do MSMQ no WCF expõe um esquema net.msmq. Qualquer mensagem endereçada usando o esquema net.msmq é enviada usando o NetMsmqBinding por meio do canal de transporte enfileirado do MSMQ.

O endereçamento de uma fila no WCF baseia-se no seguinte padrão:

net.msmq: // <nome do host> / [private/] <nome da fila>

em que:

  • <nome do host> é o nome do computador que hospeda a Fila de Destino.

  • [private] é opcional. Ele é usado ao endereçar uma Fila de Destino que é uma fila privada. Para resolver uma fila pública, não especifique private. Observe que, diferente dos caminhos do MSMQ, não há "$" no formato de URI do WCF.

  • <nome da fila> é o nome da fila. O nome da fila também pode se referir a uma subfila. Sendo assim, <nome da fila> = <nome da fila>[;nome da subfila].

Exemplo1: para endereçar uma fila privada PurchaseOrders hospedada no computador abc atadatum.com, o URI seria net.msmq://abc.adatum.com/private/PurchaseOrders.

Exemplo2: para endereçar uma fila pública AccountsPayable hospedada no computador def atadatum.com, o URI seria net.msmq://def.adatum.com/AccountsPayable.

O endereço da fila é usado como o URI de Escuta pelo Ouvinte do qual ler as mensagens. Em outras palavras, o endereço da fila é equivalente à porta de escuta do soquete TCP.

Um ponto de extremidade que lê de uma fila deve especificar o endereço da fila usando o mesmo esquema especificado anteriormente ao abrir o ServiceHost. Para obter exemplos, consulte Associação NET MSMQ.

Vários contratos em uma fila

As mensagens em uma fila podem implementar contratos diferentes. Nesse caso, é essencial que um dos seguintes procedimentos seja verdadeiro para ler e processar com êxito todas as mensagens:

  • Especifique um ponto de extremidade para um serviço que implementa todos os contratos. Essa é a abordagem recomendada.

  • Especifique vários pontos de extremidade com contratos diferentes, mas verifique se todos os pontos de extremidade usam o mesmo objeto NetMsmqBinding. A lógica de expedição no ServiceModel usa uma bomba de mensagens que lê mensagens do canal de transporte para expedição, que eventualmente desfaz a multiplexação de mensagens com base no contrato para pontos de extremidade diferentes. Uma bomba de mensagens é criada para um par de URI/associação de escuta. O endereço da fila é usado como o URI de escuta pelo ouvinte enfileirado. Ter todos os pontos de extremidade usando o mesmo objeto de associação garante que uma só bomba de mensagens seja usada para ler a mensagem e desfazer a multiplexação para pontos de extremidade relevantes com base no contrato.

Mensagens de SRMP

Conforme abordado anteriormente, você pode usar o protocolo SRMP para transferências de fila para fila. Geralmente, isso é usado quando um transporte HTTP transmite mensagens entre a Fila de Transmissão e a Fila de Destino.

Para usar o protocolo de transferência SRMP, enderece mensagens usando o esquema de URI net.msmq, conforme mencionado anteriormente, e especifique a escolha de SRMP ou SRMP Seguro na propriedade QueueTransferProtocol do NetMsmqBinding.

Especificar a propriedade QueueTransferProtocol é um recurso somente envio. Essa é uma indicação do cliente de qual tipo de protocolo de transferência de fila usar.

Como usar o Active Directory

O MSMQ tem suporte para integração do Active Directory. Quando o MSMQ é instalado com a integração do Active Directory, o computador precisa fazer parte de um domínio do Windows. O Active Directory é usado para publicar filas para descoberta; essas filas são chamadas de filas públicas. Ao endereçar uma fila, a fila pode ser resolvida usando o Active Directory. Isso é semelhante a como o DNS (Sistema de Nomes de Domínio) é usado para resolver o endereço IP de um nome de rede. A propriedade UseActiveDirectory em NetMsmqBinding é um booliano que indica se o canal enfileirado deve usar o Active Directory para resolver o URI da fila. Por padrão, é definido como false. Se a propriedade UseActiveDirectory for definida como true, o canal enfileirado usará o Active Directory para converter o URI net.msmq:// no nome do formato.

A propriedade UseActiveDirectory é significativa apenas para o cliente que está enviando a mensagem, porque ela é usada para resolver o endereço da fila ao enviar mensagens.

Mapeando o URI net.msmq para nomes de formato do Enfileiramento de Mensagens

O canal enfileirado manipula o mapeamento do nome do URI net.msmq fornecido ao canal para nomes de formato do MSMQ. A tabela a seguir resume as regras usadas para mapear entre eles.

Endereço de fila baseado em URI do WCF Usar a propriedade do Active Directory Propriedade do Queue Transfer Protocol Nomes de formato do MSMQ resultantes
Net.msmq://<machine-name>/private/abc False (padrão) Nativo (padrão) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc Falso SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc True Nativo PUBLIC=some-guid (o GUID da fila)

Lendo mensagens da fila de mensagens mortas ou da fila de mensagens suspeitas

Para ler mensagens de uma fila de mensagens suspeitas que é uma subfila da fila de destino, abra o ServiceHost com o endereço da subfila.

Exemplo: um serviço que lê da fila de mensagens suspeitas da fila privada PurchaseOrders do computador local endereçaria net.msmq://localhost/private/PurchaseOrders;poison.

Para ler mensagens de uma fila de mensagens mortas transacionais do sistema, o URI deve ter o formato: net.msmq://localhost/system$;DeadXact.

Para ler mensagens de uma fila de mensagens mortas não transacionais do sistema, o URI deve ter o formato: net.msmq://localhost/system$;DeadLetter.

Ao usar uma fila de mensagens mortas personalizada, observe que a fila de mensagens mortas deve residir no computador local. Dessa forma, o URI da fila de mensagens mortas é restrito ao formato:

net.msmq: //localhost/ [private/] <nome da fila de mensagens mortas personalizada>.

Um serviço WCF verifica se todas as mensagens recebidas foram endereçadas à fila específica em que ele está escutando. Se a fila de destino da mensagem não corresponder à fila em que ela se encontra, o serviço não processará a mensagem. Esse é um problema que os serviços que escutam uma fila de mensagens mortas precisam resolver porque qualquer mensagem na fila de mensagens mortas deveria ser entregue em outro lugar. Para ler mensagens de uma fila de mensagens mortas ou de uma fila de mensagens suspeitas, um ServiceBehavior com o parâmetro Any deve ser usado. Para obter um exemplo, consulte Filas de mensagens mortas.

MsmqIntegrationBinding e endereçamento de serviço

O MsmqIntegrationBinding é usado para comunicação com aplicativos MSMQ tradicionais. Para facilitar a interoperação com um aplicativo MSMQ existente, o WCF dá suporte apenas ao endereçamento de nome de formato. Portanto, as mensagens enviadas usando essa associação devem estar em conformidade com o esquema do URI:

msmq.formatname:<nome de formato MSMQ>>

O nome de formato MSMQ é no formato especificado pelo MSMQ em Sobre o Enfileiramento de Mensagens.

Observe que você só pode usar nomes de formato direto e nomes de formato públicos e privados (requer integração do Active Directory) ao receber mensagens de uma fila usando MsmqIntegrationBinding. No entanto, é recomendável que você use nomes de formato direto. Por exemplo, no Windows Vista, usar qualquer outro nome de formato causa um erro porque o sistema tenta abrir uma subfila, que só pode ser aberta com nomes de formato direto.

Ao endereçar o SRMP usando MsmqIntegrationBinding, não há nenhum requisito de adicionar /msmq/ ao nome de formato direto para ajudar os Serviços de Informações da Internet (IIS) com a expedição. Por exemplo: ao endereçar uma fila abc usando o protocolo SRMP, em vez de DIRECT=http://adatum.com/msmq/private$/abc, você deve usar DIRECT=http://adatum.com/private$/abc.

Observe que você não pode usar o endereçamento net.msmq:// com MsmqIntegrationBinding. Como MsmqIntegrationBinding dá suporte ao endereçamento de nome de formato MSMQ de formato livre, você pode usar um serviço WCF que usa essa associação para usar recursos de multicast e lista de distribuição no MSMQ. Uma exceção é especificar CustomDeadLetterQueue ao usar o MsmqIntegrationBinding. Ele deve ser do formato net.msmq://, semelhante a como é especificado usando o NetMsmqBinding.

Confira também