Partage via


Choix d’un filtre

Lors de la configuration du service de routage, il est important de sélectionner les filtres de messages corrects et de les configurer pour vous permettre d’effectuer des correspondances exactes avec les messages que vous recevez. Si les filtres que vous sélectionnez sont trop larges dans leurs correspondances ou sont configurés de manière incorrecte, les messages sont routés de manière incorrecte. Si les filtres sont trop restrictifs, vous n’avez peut-être pas d’itinéraires valides disponibles pour certains de vos messages.

Types de filtres

Lorsque vous sélectionnez les filtres utilisés par le service de routage, il est important de comprendre le fonctionnement de chaque filtre ainsi que les informations disponibles dans le cadre des messages entrants. Par exemple, si tous les messages sont reçus sur le même point de terminaison, les filtres Address et EndpointName ne sont pas utiles, car tous les messages correspondent à ces filtres.

Action

Le filtre Action inspecte la Action propriété. Si le contenu de l’en-tête Action dans le message correspond à la valeur de données de filtre spécifiée dans la configuration du filtre, ce filtre retourne true. L’exemple suivant définit un FilterElement utilisant le filtre Action pour faire correspondre les messages avec un en-tête d’action contenant la valeur http://namespace/contract/operation/.

<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/" />
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });

Ce filtre doit être utilisé lors du routage des messages qui contiennent un en-tête Action unique.

Adresse de point de terminaison

Le filtre EndpointAddress inspecte l'EndpointAddress sur lequel le message a été reçu. Si l’adresse à laquelle le message arrive correspond exactement à l’adresse de filtre spécifiée dans la configuration du filtre, ce filtre retourne true. L'exemple suivant définit un FilterElement qui utilise le filtre d’adresses pour correspondre aux messages adressés à « http://<hostname>/vdir/s.svc/b ».

<filter name="address1" filterType="EndpointAddress" filterData="http://host/vdir/s.svc/b" />
EndpointAddressMessageFilter address1 = new EndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);

Remarque

Il est important de noter que la partie du nom d’hôte d’une adresse peut différer selon que le client utilise le nom de domaine complet, le nom NetBIOS, l’adresse IP ou un autre nom. Étant donné que les valeurs différentes peuvent faire référence au même hôte, le comportement par défaut de cette comparaison consiste à ne pas utiliser la partie nom d’hôte de l’adresse lors de l’exécution de correspondances.

Ce comportement peut être modifié pour permettre à la comparaison d’évaluer le nom d’hôte lors de la configuration du service de routage par programmation.

Ce filtre doit être utilisé lorsque les messages entrants sont adressés à une adresse unique.

EndpointAddressPrefix

Le filtre EndpointAddressPrefix est similaire au filtre EndpointAddress. Le filtre EndpointAddressPrefix inspecte EndpointAddress sur lequel le message a été reçu. Toutefois, le filtre EndpointAddressPrefix agit comme un caractère générique en correspondant des adresses commençant par la valeur spécifiée dans la configuration du filtre. L'exemple suivant définit un FilterElement qui utilise le filtre EndpointAddressPrefix pour correspondre à tout message adressé à http://<hostname>/vdir*.

<filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/vdir" />
PrefixEndpointAddressMessageFilter prefix1 = new PrefixEndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);

Remarque

Il est important de noter que la partie du nom d’hôte d’une adresse peut différer selon que le client utilise le nom de domaine complet, le nom NetBIOS, l’adresse IP ou un autre nom. Étant donné que les valeurs différentes peuvent faire référence au même hôte, le comportement par défaut de cette comparaison consiste à ne pas utiliser la partie nom d’hôte de l’adresse lors de l’exécution de correspondances.

Ce filtre doit être utilisé lors du routage des messages entrants qui partagent un préfixe d’adresse commun.

ET

Le filtre ET ne filtre pas directement sur une valeur dans un message, mais vous permet de combiner deux autres filtres pour créer une condition AND dans laquelle les deux filtres doivent correspondre au message avant que le filtre ET soit évalué true. Cela vous permet de créer des filtres complexes qui correspondent uniquement si tous les sous-filtres correspondent. L’exemple suivant définit un filtre d’adresses et un filtre d’action, puis définit un filtre AND qui évalue un message par rapport aux filtres d’adresse et d’action. Si l’adresse et les filtres d’action correspondent, le filtre AND retourne true.

<filter name="address1" filterType="AddressPrefix" filterData="http://host/vdir"/>
<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/"/>
<filter name="and1" filterType="And" filter1="address1" filter2="action1" />
EndpointAddressMessageFilter address1 = new EndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });
StrictAndMessageFilter and1=new StrictAndMessageFilter(address1, action1);

Ce filtre doit être utilisé lorsque vous devez combiner la logique de plusieurs filtres pour déterminer quand une correspondance doit être effectuée. Par exemple, si vous avez plusieurs destinations qui doivent recevoir uniquement certaines combinaisons d’actions et de messages vers des adresses particulières, vous pouvez utiliser un filtre AND pour combiner les filtres d’action et d’adresse nécessaires.

Coutume

Lorsque vous sélectionnez le type de filtre personnalisé, vous devez fournir une valeur customType qui contient le type de l’assembly qui contient l’implémentation MessageFilter à utiliser pour ce filtre. En outre, filterData doit contenir toutes les valeurs dont le filtre personnalisé peut avoir besoin dans son évaluation des messages. L'exemple suivant définit un FilterElement qui utilise l'implémentation CustomAssembly.MyCustomMsgFilter MessageFilter.

<filter name="custom1" filterType="Custom" customType="CustomAssembly.MyCustomMsgFilter, CustomAssembly" filterData="Custom Data" />
MyCustomMsgFilter custom1=new MyCustomMsgFilter("Custom Data");

Si vous devez effectuer une logique de correspondance personnalisée par rapport à un message qui n’est pas couvert par les filtres fournis avec .NET Framework 4.6.1, vous devez créer un filtre personnalisé qui est une implémentation de la classe MessageFilter . Par exemple, vous pouvez créer un filtre personnalisé qui compare un champ dans le message entrant à une liste de valeurs connues données au filtre en tant que configuration, ou qui hachage un élément de message particulier, puis examine cette valeur pour déterminer si le filtre doit retourner true ou false.

NomDuPointD'accès

Le filtre EndpointName inspecte le nom du point de terminaison qui a reçu le message. L’exemple suivant définit un filtre EndpointName FilterElement pour acheminer les messages reçus sur le « SvcEndpoint ».

<filter name="name1" filterType="Endpoint" filterData="SvcEndpoint" />
EndpointNameMessageFilter name1 = new EndpointNameMessageFilter("SvcEndpoint");

Ce filtre est utile lorsque le service de routage expose plusieurs points de terminaison de service nommés. Par exemple, vous pouvez exposer deux points de terminaison que le service de routage utilise pour recevoir des messages ; l’un est utilisé par les clients prioritaires qui nécessitent un traitement en temps réel de leurs messages, tandis que l’autre point de terminaison reçoit des messages qui ne respectent pas le temps.

Bien que vous puissiez souvent utiliser la correspondance d’adresse complète pour déterminer le point de terminaison sur lequel un message a été reçu, l’utilisation du nom de point de terminaison défini est plutôt un raccourci pratique qui est souvent moins sujette à des erreurs, en particulier lors de la configuration d’un service de routage à l’aide d’un fichier de configuration (où les noms de point de terminaison sont un attribut requis).

MatchAll

Le filtre MatchAll correspond à n’importe quel message reçu. Il est utile si vous devez toujours router tous les messages reçus vers un point de terminaison spécifique, tel qu’un service de journalisation qui stocke une copie de tous les messages reçus. L'exemple suivant définit un FilterElement qui utilise le filtre MatchAll.

<filter name="matchAll1" filterType="MatchAll" />
MatchAllMessageFilter matchAll1 = new MatchAllMessageFilter();

XPath

Le filtre XPath vous permet de spécifier une requête XPath utilisée pour inspecter un élément spécifique dans le message. Le filtrage XPath est une option de filtrage puissante qui vous permet d’inspecter directement toute entrée adressable XML dans le message ; Toutefois, vous devez avoir une connaissance spécifique de la structure des messages que vous recevez. L'exemple suivant définit un FilterElement qui utilise le filtre XPath pour inspecter le message pour un élément nommé « élément » dans l'espace de noms référencé par le préfixe d'espace de noms « ns ».

<filter name="xpath1" filterType="XPath" filterData="//ns:element" />
XPathMessageFilter xpath1=new XPathMessageFilter("//ns:element");

Ce filtre est utile si vous savez que les messages que vous recevez contiennent une valeur spécifique. Par exemple, si vous hébergez deux versions du même service et que vous savez que les messages adressés à la version la plus récente du service contiennent une valeur unique dans un en-tête personnalisé, vous pouvez créer un filtre qui utilise XPath pour accéder à cet en-tête et comparer la valeur présente dans l’en-tête à une autre donnée dans la configuration du filtre pour déterminer si le filtre correspond.

Étant donné que les requêtes XPath contiennent souvent des espaces de noms uniques, qui sont souvent des valeurs de chaîne longues ou complexes, le filtre XPath vous permet d’utiliser la table d’espaces de noms pour définir des préfixes uniques pour vos espaces de noms. Pour plus d’informations sur la table d’espaces de noms, consultez Filtres de messages.

Pour plus d’informations sur la conception de requêtes XPath, consultez syntaxe XPath.

Voir aussi