Partager via


Points de terminaison de service et adressage de file d’attente

Cette rubrique discute comment les clients adressent des services qui lisent à partir des files d'attente et comment les points de terminaison de service mappent aux files d'attente. Pour rappel, l’illustration suivante montre le déploiement d’application en file d’attente Windows Communication Foundation (WCF) classique.

Diagramme d’une application en file d’attente

Pour que le client envoie le message au service, le client adresse le message à la file d’attente cible. Pour que le service puisse lire les messages de la file d’attente, son adresse d’écoute est définie sur la file d’attente cible. L’adressage dans WCF est basé sur l’URI (Uniform Resource Identifier), tandis que les noms de file d’attente MSMQ (Message Queuing) ne sont pas basés sur l’URI. Il est donc essentiel de comprendre comment traiter les files d’attente créées dans MSMQ à l’aide de WCF.

Adressage MSMQ

MSMQ utilise des chemins d’accès et des noms de format pour identifier une file d’attente. Les chemins spécifient un nom d’hôte et un QueueName. Il peut y avoir un Private$ entre le nom d’hôte et le QueueName pour indiquer une file d’attente privée qui n’est pas publiée dans le service d’annuaire Active Directory.

Les noms de chemins sont mappés à « FormatNames » pour déterminer d’autres aspects de l’adresse, notamment le protocole de routage et de transfert du gestionnaire de files d’attente. Le Gestionnaire de files d’attente prend en charge deux protocoles de transfert : protocole MSMQ natif et PROTOCOLE SRMP (SOAP Reliable Messaging Protocol).

Pour plus d’informations sur le chemin d’accès MSMQ et les noms de format, consultez À propos de Message Queuing.

NetMsmqBinding et adressage de service

Lors de l’adressage d’un message à un service, le schéma dans l’URI est choisi en fonction du transport utilisé pour la communication. Chaque transport dans WCF a un schéma unique. Le schéma doit refléter la nature du transport utilisé pour la communication. Par exemple, net.tcp, net.pipe, HTTP, et ainsi de suite.

Le transport de mise en file d’attente MSMQ dans WCF expose un schéma net.msmq. Tout message adressé à l’aide du schéma net.msmq est envoyé à l’aide du NetMsmqBinding canal de transport en file d’attente MSMQ.

L’adressage d’une file d’attente dans WCF est basé sur le modèle suivant :

net.msmq : // <host-name> / [private/] <queue-name>

où:

  • < nom d’hôte> est le nom de l’ordinateur qui héberge la file d'attente de destination.

  • [privé] est facultatif. Il est utilisé lors de l’adressage d’une file d’attente cible qui est une file d’attente privée. Pour traiter une file d’attente publique, vous ne devez pas spécifier privé. Notez que, contrairement aux chemins MSMQ, il n’existe pas de « $ » dans le formulaire d’URI WCF.

  • < Nom de file d’attente> est le nom de la file d’attente. Le nom de la file d’attente peut également faire référence à un sous-file d’attente. Ainsi, <queue-name> = <name-of-queue>[ ;sous-file d’attente-name].

Exemple 1 : Pour traiter une file d’attente privée PurchaseOrders hébergée sur l’ordinateur abc atadatum.com, l’URI serait net.msmq ://abc.adatum.com/private/PurchaseOrders.

Exemple 2 : Pour traiter une file d’attente publique AccountsPayable hébergée sur l'ordinateur atadatum.com, l’URI est net.msmq://def.adatum.com/AccountsPayable.

L’adresse de file d’attente est utilisée comme URI d’écoute par l’écouteur pour lire des messages. En d’autres termes, l’adresse de file d’attente équivaut au port d’écoute du socket TCP.

Un point de terminaison qui lit à partir d’une file d’attente doit spécifier l’adresse de la file d’attente à l’aide du même schéma spécifié précédemment lors de l’ouverture de ServiceHost. Pour obtenir des exemples, consultez Liaison MSMQ de réseau.

Contrats multiples dans une file d'attente

Les messages d’une file d’attente peuvent implémenter différents contrats. Dans ce cas, il est essentiel que l’un des éléments suivants soit vrai pour lire et traiter correctement tous les messages :

  • Spécifiez un point de terminaison pour un service qui implémente tous les contrats. Il s’agit de l’approche recommandée.

  • Spécifiez plusieurs points de terminaison avec différents contrats, mais assurez-vous que tous les points de terminaison utilisent le même NetMsmqBinding objet. La logique de répartition dans ServiceModel utilise une pompe de messages qui lit les messages hors du canal de transport pour la distribution, qui dé multiplexe finalement les messages en fonction du contrat vers différents points de terminaison. Une pompe de messages est créée pour une paire d’écoute URI/liaison. L’adresse de file d’attente est utilisée comme URI d’écoute par l’écouteur mis en file d’attente. Le fait que tous les points de terminaison utilisent le même objet de liaison garantit qu'une pompe de messages unique est utilisée pour lire le message et le démultiplexer vers les points de terminaison pertinents en fonction du contrat.

Messagerie SRMP

Comme indiqué précédemment, vous pouvez utiliser le protocole SRMP pour les transferts entre files d’attente. Cela est couramment utilisé lorsqu’un transport HTTP transmet des messages entre la file d’attente de transmission et la file d’attente cible.

Pour utiliser le protocole de transfert SRMP, adressez les messages à l’aide du schéma d’URI net.msmq, comme mentionné précédemment, et spécifiez le choix de SRMP ou SRMP sécurisé dans la QueueTransferProtocol propriété du NetMsmqBinding.

La spécification de la QueueTransferProtocol propriété est une fonctionnalité d’envoi uniquement. Il s’agit d’une indication par le client du type de protocole de transfert de file d’attente à utiliser.

Utilisation d’Active Directory

MSMQ prend en charge l’intégration d’Active Directory. Lorsque MSMQ est installé avec l’intégration Active Directory, la machine doit faire partie d’un domaine Windows. Active Directory est utilisé pour publier des files d’attente pour la découverte ; ces files d’attente sont appelées files d’attente publiques. Lors de l’adressage d’une file d’attente, la file d’attente peut être résolue à l’aide d’Active Directory. Ceci est similaire à la façon dont le système DNS (Domain Name System) est utilisé pour résoudre l’adresse IP d’un nom réseau. La UseActiveDirectory propriété dans NetMsmqBinding est une valeur booléenne qui indique si le canal mis en file d’attente doit utiliser Active Directory pour résoudre l’URI de file d’attente. Par défaut, la valeur est définie sur false. Si la propriété UseActiveDirectory est définie sur true, le canal mis en file d’attente utilise Active Directory pour convertir l’URI net.msmq:// en nom de format.

La UseActiveDirectory propriété n’est significative que pour le client qui envoie le message, car elle est utilisée pour résoudre l’adresse de la file d’attente lors de l’envoi de messages.

Mappage de l'URI net.msmq aux noms de format Message Queuing

Le canal mis en file d’attente gère le mappage du nom d’URI net.msmq fourni au canal aux noms de format MSMQ. Le tableau suivant récapitule les règles utilisées pour les mapper entre elles.

Adresse de file d’attente basée sur l’URI WCF Utiliser la propriété Active Directory Propriété de protocole de transfert de mise en file d'attente Noms de format MSMQ résultants
Net.msmq://<machine-name>/private/abc False (valeur par défaut) Natif (par défaut) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc Faux SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc Vrai Natif PUBLIC=some-guid (GUID de la file d’attente)

Lecture de messages à partir de la file d’attente Dead-Letter ou de la file d’attente Poison-Message

Pour lire des messages à partir d'une file d'attente de message incohérents qui est une sous-file d'attente de la file d'attente cible, ouvrez le ServiceHost avec l'adresse de la sous-file d'attente.

Exemple : un service qui lit à partir de la file d'attente de message incohérents de la file d'attente privée PurchaseOrders de l'ordinateur local adresserait net.msmq://localhost/private/PurchaseOrders;poison.

Pour lire des messages à partir d’une file d’attente de lettres mortes transactionnelle système, l’URI doit être de la forme suivante : net.msmq://localhost/system$;DeadXact.

Pour lire des messages à partir d'une file d'attente de lettres mortes non transactionnelle système, l'URI doit être de la forme suivante : net.msmq://localhost/system$;DeadLetter.

Lors de l'utilisation d'une file d'attente de lettres mortes personnalisée, notez que la file d'attente de lettres mortes doit résider sur l'ordinateur local. Comme tel, l'URI de la file d'attente de lettres mortes est restreint à la forme suivante :

net.msmq : //localhost/ [private/] <custom-dead-letter-queue-name>.

Un service WCF vérifie que tous les messages qu’il reçoit ont été adressés à la file d’attente particulière sur laquelle il écoute. Si la file d’attente de destination du message ne correspond pas à la file d’attente dans laquelle il se trouve, le service ne traite pas le message. Il s'agit d'un problème que les services qui écoutent une file d'attente de lettres mortes doivent être capables de gérer car tout message présent dans la file d'attente de lettres mortes était destiné à être remis autre part. Pour lire des messages à partir d'une file d'attente de lettres mortes ou d'une file d'attente de messages incohérents, un ServiceBehavior avec le paramètre Any doit être utilisé. Pour obtenir un exemple, consultez Files d’attente de lettres mortes.

MsmqIntegrationBinding et adressage de service

Le MsmqIntegrationBinding est utilisé pour la communication avec les applications MSMQ traditionnelles. Pour faciliter l’interopérabilité avec une application MSMQ existante, WCF prend uniquement en charge l’adressage de nom de format. Ainsi, les messages envoyés à l’aide de cette liaison doivent être conformes au schéma d’URI :

msmq.formatname :<MSMQ-format-name>>

Le nom de format MSMQ est de la forme spécifiée par MSMQ dans About Message Queuing.

Notez que vous ne pouvez utiliser que des noms de format direct, ainsi que des noms de format public et privé (nécessitant l'intégration d'Active Directory) en utilisant MsmqIntegrationBinding pour recevoir des messages d'une file d'attente. Il est toutefois recommandé d'utiliser des noms de format directs. Par exemple, sur Windows Vista, l’utilisation d’un autre nom de format provoque une erreur, car le système tente d’ouvrir un sous-file d’attente, qui ne peut être ouvert qu’avec des noms de format direct.

Lors de l’adressage SRMP à l’aide de MsmqIntegrationBinding, il n’est pas obligatoire d’ajouter /msmq/ dans le nom de format direct pour aider les services Internet (IIS) à effectuer la distribution. Par exemple : lors de l’adressage d’une file d’attente abc à l’aide du protocole SRMP, au lieu de DIRECT=http://adatum.com/msmq/private$/abc, vous devez utiliser DIRECT=http://adatum.com/private$/abc.

Notez que vous ne pouvez pas utiliser l’adressage net.msmq :// avec MsmqIntegrationBinding. Étant donné que MsmqIntegrationBinding prend en charge l’adressage de nom de format MSMQ de forme libre, vous pouvez utiliser un service WCF qui utilise cette liaison pour utiliser des fonctionnalités de liste de distribution et de multidiffusion dans MSMQ. Une exception consiste à spécifier CustomDeadLetterQueue lors de l'utilisation du MsmqIntegrationBinding. Il doit être de la forme net.msmq ://, similaire à la façon dont il est spécifié à l’aide du NetMsmqBinding.

Voir aussi