Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette section explique comment utiliser la communication mise en file d’attente dans Windows Communication Foundation (WCF).
Mises en file d'attente en tant que liaison de transport WCF
Dans WCF, les contrats spécifient ce qui est échangé. Les contrats sont des échanges de messages propres à l’entreprise ou à l’application. Le mécanisme utilisé pour échanger des messages (ou le « comment ») est spécifié dans les liaisons. Dans WCF, les liaisons encapsulent les détails de l’échange de messages. Ils exposent des boutons de configuration pour que l’utilisateur contrôle différents aspects du transport ou du protocole représenté par les liaisons. La mise en file d’attente dans WCF est traitée comme n’importe quelle autre liaison de transport, ce qui constitue un grand avantage pour de nombreuses applications de mise en file d’attente. Aujourd’hui, de nombreuses applications de mise en file d’attente sont écrites différemment d’autres applications distribuées de type RPC (Remote Procedure Call), ce qui complique le suivi et la maintenance. Avec WCF, le style d’écriture d’une application distribuée est beaucoup le même, ce qui facilite le suivi et la maintenance. De plus, en factorisant le mécanisme d’échange séparément de la logique métier, il est plus facile de configurer le transport ou d’y apporter des modifications sans affecter le code spécifique à l’application. La figure suivante illustre la structure d’un service WCF et d’un client utilisant MSMQ comme transport.
Comme vous pouvez le voir dans la figure précédente, le client et le service doivent définir uniquement la sémantique de l’application, c’est-à-dire le contrat et l’implémentation. Le service configure une liaison mise en file d’attente avec des paramètres par défaut. Le client utilise l’outil utilitaire de métadonnées ServiceModel (Svcutil.exe) pour générer un client WCF au service et générer un fichier de configuration qui décrit les liaisons à utiliser pour envoyer des messages au service. Ainsi, pour envoyer un message mis en file d’attente, le client instancie un client WCF et appelle une opération dessus. Cela entraîne l’envoi du message à la file d’attente de transmission et le transfert vers la file d’attente cible. Toutes les complexités de la communication en file d’attente sont masquées pour l’application qui envoie et reçoit des messages.
Avertissements relatifs aux liaisons mises en file d’attente dans WCF :
Toutes les opérations de service doivent être unidirectionnelles, car la liaison mise en file d’attente par défaut dans WCF ne prend pas en charge la communication duplex à l’aide de files d’attente. Un exemple de communication bidirectionnel (Two-Way Communication) montre comment utiliser deux contrats unidirectionnels pour implémenter la communication duplex à l’aide de files d’attente.
Pour générer un client WCF à l’aide d’un échange de métadonnées, vous devez disposer d’un point de terminaison HTTP supplémentaire sur le service afin qu’il puisse être interrogé directement pour générer le client WCF et obtenir des informations de liaison pour configurer correctement la communication mise en file d’attente.
Selon la liaison mise en file d’attente, une configuration supplémentaire hors WCF est requise. Par exemple, la NetMsmqBinding classe fournie avec WCF vous oblige à configurer les liaisons, ainsi qu’à configurer minimalement Message Queuing (MSMQ).
Les sections qui suivent décrivent les liaisons mises en file d’attente fournies avec WCF, qui reposent sur MSMQ.
MSMQ
Le transport en file d'attente dans WCF utilise MSMQ pour sa communication en file d'attente.
MSMQ est fourni en tant que composant facultatif avec Windows et s’exécute en tant que service NT. Il capture les messages pour la transmission dans une file d’attente de transmission et pour la remise dans une file d’attente cible. Les gestionnaires de files d’attente MSMQ implémentent un protocole de transfert de messages fiable afin que les messages ne soient pas perdus dans la transmission. Le protocole peut être natif ou basé sur SOAP, tel que le protocole SRMP (SOAP Reliable Message Protocol).
Dans MSMQ, les files d’attente peuvent être transactionnelles ou non transactionnelles. Une file d’attente transactionnelle permet aux messages d’être capturés et remis dans une transaction, puis stockés durablement dans la file d’attente. Les messages envoyés à une file d’attente transactionnelle sont transférés exactement une fois dans l’ordre. Vous pouvez utiliser une file d’attente non transactionnelle pour envoyer des messages volatiles et durables. Un message envoyé à une file d’attente non transactionnelle ne comporte aucune garantie de transfert fiable ; ainsi, les messages peuvent être perdus.
Les files d’attente MSMQ peuvent également être sécurisées à l’aide d’une identité Windows inscrite auprès du service d’annuaire Active Directory. Lors de l’installation de MSMQ, vous pouvez installer l’intégration d’Active Directory, ce qui nécessite que l’ordinateur fait partie d’un réseau de domaine Windows.
Pour plus d’informations sur MSMQ, consultez Installer Message Queuing (MSMQ).
NetMsmqBinding
<netMsmqBinding> est la liaison en file d’attente dans WCF ; elle permet à deux points de terminaison WCF de communiquer en utilisant MSMQ. Par conséquent, la liaison expose les propriétés spécifiques à MSMQ. Toutefois, toutes les fonctionnalités et propriétés MSMQ ne sont pas exposées dans le NetMsmqBinding. Le compact NetMsmqBinding est conçu avec un ensemble optimal de fonctionnalités que la plupart des clients doivent trouver suffisantes.
Le NetMsmqBinding illustre les concepts de mise en file d’attente clés discutés jusqu’ici sous la forme de propriétés sur les liaisons. Ces propriétés communiquent à leur tour à MSMQ comment transférer et remettre les messages. Une discussion sur les catégories de propriétés se trouve dans les sections suivantes. Pour plus d’informations, consultez les rubriques conceptuelles qui décrivent des propriétés spécifiques plus complètement.
Propriétés ExactlyOnce et Durable
ExactlyOnce et Durable affectent le transfert des messages entre les files d’attente :
ExactlyOnce: lorsqu’il est définitruesur (valeur par défaut), le canal mis en file d’attente garantit que le message, s’il est remis, n’est pas dupliqué. Il garantit également que le message n’est pas perdu. Si le message ne peut pas être remis ou si sa durée de vie expire avant que le message ait pu être remis, le message et la raison de l'échec de la remise sont enregistrés dans une file d'attente de lettres mortes. Lorsque la valeur est définiefalse, le canal mis en file d’attente fait un effort pour transférer le message. Dans ce cas, vous pouvez éventuellement choisir une file d'attente de lettres mortes.Durable:Lorsqu’il est définitruesur (valeur par défaut), le canal mis en file d’attente garantit que MSMQ stocke le message de manière durable sur le disque. Par conséquent, si le service MSMQ devait arrêter et redémarrer, les messages sur le disque sont transférés vers la file d’attente cible ou remis au service. Lorsque la valeur est définiefalse, les messages sont stockés dans un magasin volatile et sont perdus lors de l’arrêt et du redémarrage du service MSMQ.
Pour le transfert fiable ExactlyOnce, MSMQ requiert que la file d’attente soit transactionnelle. Par ailleurs, MSMQ requiert une transaction pour pouvoir lire les messages depuis une file d’attente transactionnelle. Par conséquent, lorsque vous utilisez le NetMsmqBinding, n’oubliez pas qu’une transaction est nécessaire pour envoyer ou recevoir des messages lorsqu'un paramètre est fixé à ExactlyOnce dans true. De même, MSMQ requiert que la file d'attente soit non transactionnelle pour une garantie optimale, comme lorsque ExactlyOnce a la valeur false et pour la messagerie volatile. Par conséquent, lorsque vous définissez ExactlyOnce sur false ou durable sur false, vous ne pouvez pas envoyer ou recevoir à l’aide d’une transaction.
Remarque
Vérifiez que la file d’attente correcte (transactionnelle ou non transactionnelle) est créée en fonction des paramètres des liaisons. Si ExactlyOnce est true, utilisez une file d’attente transactionnelle ; sinon, utilisez une file d’attente non transactionnelle.
Propriétés de la file d'attente de lettres mortes
La file d'attente de lettres mortes est utilisée pour stocker les messages dont la remise a échoué. L'utilisateur peut écrire une logique de compensation qui lit les messages à partir de la file d'attente de lettres mortes.
De nombreux systèmes de mise en file d'attente prévoient une file d'attente de lettres mortes à l'échelle du système. MSMQ propose une file d’attente de lettres mortes non transactionnelle à l’échelle du système pour les messages dont la remise à des files d’attente non transactionnelles échoue et une file d’attente de lettres mortes transactionnelle à l’échelle du système pour les messages dont la remise à des files d’attente transactionnelles échoue.
Si plusieurs clients qui envoient des messages à des files d'attente cibles différentes partagent le service MSMQ, tous les messages envoyés par les clients vont dans la même file d'attente de lettres mortes. Ce n’est pas toujours préférable. Pour une meilleure isolation, WCF et MSMQ dans Windows Vista fournissent une file d’attente de lettres mortes personnalisée (ou une file d’attente de lettres mortes spécifiques à l’application) que l’utilisateur peut spécifier pour stocker les messages qui échouent à la remise. Par conséquent, des clients différents ne partagent pas la même file d'attente de lettres mortes.
La liaison possède deux propriétés intéressantes :
DeadLetterQueue: cette propriété est une énumération qui indique si une file d’attente de lettres mortes est demandée. Cette énumération contient également le type de file d'attente de lettres mortes, si une est demandée. Ces valeurs sontNone,SystemetCustom. Pour plus d’informations sur l’interprétation de ces propriétés, consultez Utilisation de files d’attente Dead-Letter pour gérer les échecs de transfert de messagesCustomDeadLetterQueue: cette propriété est l’adresse URI (Uniform Resource Identifier) de la file d’attente de lettres mortes propre à l’application. Cette opération est requise siDeadLetterQueue.Customest choisi.
Propriétés de gestion des messages incohérents
Lorsque le service lit les messages de la file d’attente cible sous une transaction, le service peut échouer à traiter le message pour différentes raisons. Le message est ensuite remis dans la file d’attente pour être lu à nouveau. Pour gérer les messages qui échouent à plusieurs reprises, un ensemble de propriétés de gestion des messages nuisibles peut être configuré dans le mécanisme de liaison. Il existe quatre propriétés : ReceiveRetryCount, , MaxRetryCyclesRetryCycleDelayet ReceiveErrorHandling. Pour plus d’informations sur ces propriétés, consultez Gestion des messages incohérents.
Propriétés de sécurité
MSMQ expose son propre modèle de sécurité, tel que les listes de contrôle d’accès (ACL) sur une file d’attente ou l’envoi de messages authentifiés. L’objet NetMsmqBinding expose ces propriétés de sécurité dans le cadre de ses paramètres de sécurité de transport. La liaison pour la sécurité de transport a deux propriétés : MsmqAuthenticationMode et MsmqProtectionLevel. Les paramètres de ces propriétés dépendent de la façon dont MSMQ est configuré. Pour plus d’informations, consultez Sécurisation des messages à l’aide de la sécurité du transport.
En plus de la sécurité du transport, le message SOAP proprement dit peut être sécurisé à l’aide de la sécurité des messages. Pour plus d’informations, consultez Sécurisation des messages à l’aide de la sécurité des messages.
MsmqTransportSecurity expose également deux propriétés, MsmqEncryptionAlgorithm et MsmqHashAlgorithm. Il s'agit d'énumérations de différents algorithmes que vous pouvez choisir pour le chiffrement des messages en vue du transfert entre files d'attente et pour le hachage des signatures.
Autres propriétés
Outre les propriétés précédentes, les propriétés spécifiques à MSMQ suivantes sont exposées dans la liaison :
UseSourceJournal: propriété pour indiquer que la journalisation source est activée. La journalisation source est une fonctionnalité MSMQ qui effectue le suivi des messages qui ont été transmis avec succès à partir de la file d’attente de transmission.UseMsmqTracing: propriété pour indiquer que le suivi MSMQ est activé. Le suivi MSMQ envoie des messages de rapport à une file d’attente de rapports chaque fois qu’un message quitte ou arrive à un ordinateur hébergeant un gestionnaire de files d’attente MSMQ.QueueTransferProtocol: énumération du protocole à utiliser pour les transferts de messages entre files d’attente. MSMQ implémente un protocole de transfert de file d’attente à file d’attente natif et un protocole basé sur SOAP appelé protocole de messagerie fiable SOAP (SRMP). Le protocole SRMP est appliqué lors de l'utilisation du transport HTTP pour les transferts entre files d'attente. Le protocole SRMP sécurisé est appliqué lors de l'utilisation d'HTTPS pour les transferts entre files d'attente.UseActiveDirectory: valeur booléenne pour indiquer si Active Directory doit être utilisé pour la résolution d’adresses de file d’attente. Par défaut, cela est désactivé. Pour plus d’informations, consultez Points de terminaison de service et adressage de file d’attente.
MsmqIntegrationBinding
Le MsmqIntegrationBinding est utilisé lorsque vous souhaitez qu’un point de terminaison WCF communique avec une application MSMQ existante écrite en C, C++, COM ou des API System.Messaging.
Les propriétés de liaison sont les mêmes que pour NetMsmqBinding. Toutefois, les différences suivantes s’appliquent :
Le contrat d’opération pour
MsmqIntegrationBindingest limité à la prise d'un seul paramètre de type MsmqMessage<T>, où le paramètre de type est le type de corps.La plupart des propriétés de message natif MSMQ sont exposées dans le MsmqMessage<T> pour utilisation.
Pour faciliter la sérialisation et la désérialisation du corps du message, les sérialiseurs tels que XML et ActiveX sont fournis.
Exemple de code
Pour obtenir des instructions pas à pas sur l’écriture de services WCF qui utilisent MSMQ, consultez les rubriques suivantes :
Pour obtenir un exemple de code complet illustrant l’utilisation de MSMQ dans WCF, consultez les rubriques suivantes :