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.
Le système de filtrage Windows Communication Foundation (WCF) peut utiliser des filtres déclaratifs pour faire correspondre les messages et prendre des décisions opérationnelles. Vous pouvez utiliser des filtres pour déterminer ce qu’il faut faire avec un message en examinant une partie du message. Un processus de mise en file d’attente, par exemple, peut utiliser une requête XPath 1.0 pour vérifier l’élément de priorité d’un en-tête connu pour déterminer s’il faut déplacer un message vers l’avant de la file d’attente.
Le système de filtrage est composé d’un ensemble de classes qui peut déterminer efficacement quel ensemble de filtres est true destiné à un message WCF particulier.
Le système de filtrage est un composant principal de la messagerie WCF ; il est conçu pour être extrêmement rapide. Chaque implémentation de filtre a été optimisée pour un type particulier de correspondance avec les messages WCF.
Le système de filtrage n’est pas thread-safe. L’application doit gérer toute sémantique de verrouillage. Cependant, il prend en charge plusieurs lecteurs et un seul rédacteur.
Où le filtrage s’adapte
Le filtrage est effectué une fois qu’un message est reçu et fait partie du processus de distribution du message au composant d’application approprié. La conception du système de filtrage répond aux exigences de plusieurs sous-systèmes WCF, notamment la messagerie, le routage, la sécurité, la gestion des événements et la gestion du système.
Filtres
Le moteur de filtre a deux composants principaux, filtres et tables de filtre. Un filtre prend des décisions booléennes sur un message en fonction des conditions logiques spécifiées par l’utilisateur. Les filtres implémentent la MessageFilter classe.
Les Match méthodes sont utilisées pour déterminer si un message satisfait à un filtre. L’une des méthodes teste l’en-tête du message, mais ne peut pas inspecter le corps du message. L’autre méthode prend une mémoire tampon de message en tant que paramètre d’entrée et peut inspecter le corps du message.
Les filtres ne sont généralement pas testés individuellement, mais dans le cadre d’une table de filtres, qui est une classe générique créée par la CreateFilterTable méthode.
Les différents types de filtres se spécialisent dans la correspondance sur un type particulier de condition booléenne. Une fois que vous avez construit un filtre, vous ne pouvez pas modifier les critères qu’un filtre utilise ; pour modifier les critères d’un filtre, construire un nouveau filtre et supprimer le filtre existant.
Filtres d’action
Le ActionMessageFilter contient une liste de chaînes d’action. Si l’une des actions de la liste du filtre correspond à l’en-tête Action dans le message ou la mémoire tampon de message, la Match méthode retourne true. Si la liste est vide, le filtre est considéré un filtre de correspondance totale et tous les messages ou tampons de messages correspondent, et Match retourne la valeur true. Si aucune des actions de la liste du filtre ne correspond à l’en-tête Action dans le message ou la mémoire tampon de message, Match retourne false. S’il n’y a aucune action dans le message et que la liste du filtre n’est pas vide, Match retourne false.
Filtres d’adresses de point de terminaison
Le EndpointAddressMessageFilter filtre les messages et les tampons de messages en fonction d'une adresse de point de terminaison, telle que représentée dans leur collection d'en-têtes. Pour qu’un message passe un tel filtre, les conditions suivantes doivent être remplies :
L'URI de l'adresse du filtre doit être le même que celui de l'en-tête To du message.
Chaque paramètre de point de terminaison dans l'adresse du filtre (collection
address.Headers) doit trouver un en-tête dans le message à mapper. Des en-tête supplémentaires dans le message ou le tampon de messages sont acceptables pour que la correspondance restetrue.
Filtres du préfixe de l'adresse du point de terminaison
- Les PrefixEndpointAddressMessageFilter fonctionnent de la même manière que le EndpointAddressMessageFilter filtre, sauf que la correspondance peut être effectuée sur le préfixe de l'URI du message. Par exemple, un filtre spécifiant l’adresse
http://www.adatum.comcorrespond aux messages adressés àhttp://www.adatum.com/userA.
Filtres de messages XPath
Une XPathMessageFilter expression XPath permet de déterminer si un document XML contient des éléments, des attributs, du texte ou d’autres constructions syntaxiques XML. Le filtre est optimisé pour être extrêmement efficace pour un sous-ensemble strict de XPath. Le langage de chemin XML est décrit dans la spécification W3C XML Path Language 1.0.
En règle générale, une application utilise un XPathMessageFilter point de terminaison pour interroger le contenu d’un message SOAP, puis prend l’action appropriée en fonction des résultats de cette requête. Un processus de mise en file d’attente, par exemple, peut utiliser une requête XPath pour inspecter l’élément de priorité d’un en-tête connu pour décider s’il faut déplacer un message vers l’avant de la file d’attente.
Tables de filtres
Les tables de filtre sont utilisées pour stocker des paires clé-valeur, où un filtre est la clé et certaines données associées sont la valeur. Les données de filtre peuvent être utilisées pour indiquer quelles actions effectuer si un message correspond au filtre et que le type des données de filtre est le paramètre générique de la classe de table de filtre. Les données de filtre peuvent être constituées de règles de routage, d’état de sécurité de session, d’écouteurs sur un canal, et ainsi de suite. Les données peuvent être utilisées lorsque le contrôle de flux de données est nécessaire.
Les tables de filtre implémentent l’interface IMessageFilterTable<TFilterData>générique .
Les tables de filtre ont plusieurs méthodes qui correspondent à un message par rapport à tous les filtres de la table et retournent une collection non ordonnée de filtres ou de données correspondants. Certaines des méthodes de correspondance acceptent plusieurs correspondances et retournent tous les éléments correspondants. D'autres n'acceptent qu'une correspondance unique, ne retournent qu'un seul élément et lèvent une MultipleFilterMatchesException si plusieurs filtres correspondent.
Tableau de filtres de messages
Le MessageFilterTable<TFilterData> est l'implémentation la plus générale de IMessageFilterTable<TFilterData>. Vous pouvez stocker des filtres de tous les types dans la table.
Vous pouvez affecter des priorités numériques aux filtres, où la priorité la plus élevée est indiquée par le nombre le plus élevé. Plusieurs types de filtres peuvent avoir la même priorité. Un type particulier de filtre peut apparaître dans plusieurs niveaux de priorité.
La correspondance est effectuée à partir de la priorité la plus élevée, et une fois les filtres correspondants trouvés avec une priorité donnée, aucun filtre avec des priorités inférieures n’est examiné. Par conséquent, si vous utilisez une méthode de correspondance à filtre unique et que plusieurs filtres correspondent à un message, mais que chaque filtre correspondant a une priorité différente, aucune exception n’est levée et le filtre avec la priorité la plus élevée est retourné. De même, une méthode de correspondance à plusieurs filtres retourne uniquement les filtres correspondants avec la priorité la plus élevée.
Table de filtre de messages XPath
Le XPathMessageFilterTable<TFilterData> est optimisé pour les filtres XPath déclaratifs, donc la clé de table est un XPathMessageFilter.
La XPathMessageFilterTable<TFilterData> classe optimise la correspondance pour un sous-ensemble de XPath qui couvre la plupart des scénarios de messagerie et prend également en charge la grammaire XPath 1.0 complète. Il a optimisé des algorithmes pour une correspondance parallèle efficace.
Ce tableau comporte plusieurs méthodes spécialisées Match qui opèrent sur un XPathNavigator et un SeekableXPathNavigator. A SeekableXPathNavigator étend la XPathNavigator classe en ajoutant une CurrentPosition propriété. Cette propriété permet aux positions du document XML d’être enregistrées et chargées rapidement sans avoir à cloner le navigateur, une allocation de mémoire coûteuse nécessaire XPathNavigator pour une telle opération. Le moteur XPath WCF doit fréquemment enregistrer la position du curseur au cours de l’exécution de requêtes sur des documents XML. Il SeekableXPathNavigator fournit donc une optimisation importante pour le traitement des messages.
Les scénarios clients
Vous pouvez utiliser le filtrage chaque fois que vous souhaitez envoyer un message à différents modules de traitement en fonction des données contenues dans le message. Deux scénarios classiques sont le routage d’un message en fonction de son code d’action et le dé multiplexage d’un flux de messages en fonction de l’adresse de point de terminaison des messages.
Routage
L’écouteur d’un point de terminaison écoute les messages qui ont un ou plusieurs codes d’action dans l’en-tête SOAP du message. Implémentez ceci en créant un ActionMessageFilter en passant un tableau qui contient les codes d'action à son constructeur. Il utilise ce filtre pour s'inscrire auprès de ListenerFactory, afin que seuls les messages dont l'action correspond à l'une de celles du filtre atteignent ce point de terminaison particulier.
Démultiplexage
Lorsque plusieurs points de terminaison se déploient du même ServiceListener provenant du câble, la seule manière de démultiplexer les messages et de savoir s'ils appartiennent à une certaine adresse de point de terminaison est d'utiliser des EndpointAddressMessageFilter, qui sélectionnent les messages vers les points de terminaison enregistrés en exécutant une recherche sur les informations stockées dans les en-têtes. Dans ces filtres, seuls les messages qui passent ont tous les en-têtes nécessaires qui correspondent aux deux :
L'URI de l'
EndpointAddress.Le reste des paramètres de point de terminaison dans l'
EndpointAddresscomme spécifié dans le EndpointAddressMessageFilter.