Een filter kiezen
Bij het configureren van de routeringsservice is het belangrijk dat u de juiste berichtfilters selecteert en configureert zodat u exacte overeenkomsten kunt maken met de berichten die u ontvangt. Als de filters die u selecteert te breed zijn in hun overeenkomsten of onjuist zijn geconfigureerd, worden berichten onjuist gerouteerd. Als de filters te beperkend zijn, hebt u mogelijk geen geldige routes beschikbaar voor sommige berichten.
Filtertypen
Wanneer u de filters selecteert die door de routeringsservice worden gebruikt, is het belangrijk dat u begrijpt hoe elk filter werkt en welke informatie beschikbaar is als onderdeel van de binnenkomende berichten. Als bijvoorbeeld alle berichten worden ontvangen via hetzelfde eindpunt, zijn de filters Adres en EndpointName niet nuttig omdat alle berichten overeenkomen met deze filters.
Actie
Het actiefilter inspecteert de Action eigenschap. Als de inhoud van de actiekoptekst in het bericht overeenkomt met de filtergegevenswaarde die is opgegeven in de filterconfiguratie, retourneert true
dit filter. Het volgende voorbeeld definieert een FilterElement
die gebruikmaakt van het actiefilter om berichten te vergelijken met een actiekop die een waarde van http://namespace/contract/operation/
.
<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/" />
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });
Dit filter moet worden gebruikt bij het routeren van berichten die een unieke actieheader bevatten.
EndpointAddress
Het EndpointAddress-filter inspecteert het EndpointAddress waarop het bericht is ontvangen. Als het adres waarop het bericht binnenkomt exact overeenkomt met het filteradres dat is opgegeven in de filterconfiguratie, retourneert true
dit filter. In het volgende voorbeeld wordt een FilterElement
adresfilter gedefinieerd dat overeenkomt met alle berichten die zijn geadresseerd aan '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);
Notitie
Het is belangrijk te weten dat het hostnaamgedeelte van een adres kan verschillen op basis van of de client gebruikmaakt van de volledig gekwalificeerde domeinnaam, NetBIOS-naam, IP-adres of andere naam. Omdat verschillende waarden naar dezelfde host kunnen verwijzen, is het standaardgedrag voor deze vergelijking om het hostnaamgedeelte van het adres niet te gebruiken bij het uitvoeren van overeenkomsten.
Dit gedrag kan worden gewijzigd zodat de vergelijking de hostnaam kan evalueren bij het programmatisch configureren van de routeringsservice.
Dit filter moet worden gebruikt wanneer de binnenkomende berichten worden geadresseerd aan een uniek adres.
EndpointAddressPrefix
Het EndpointAddressPrefix-filter is vergelijkbaar met het EndpointAddress-filter. Het filter EndpointAddressPrefix inspecteert het EndpointAddress waarop het bericht is ontvangen. Het EndpointAddressPrefix-filter fungeert echter als jokerteken door overeenkomende adressen die beginnen met de waarde die is opgegeven in de filterconfiguratie. In het volgende voorbeeld wordt een FilterElement
filter endpointAddressPrefix gedefinieerd dat overeenkomt met alle berichten die zijn geadresseerd.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);
Notitie
Het is belangrijk te weten dat het hostnaamgedeelte van een adres kan verschillen op basis van of de client gebruikmaakt van de volledig gekwalificeerde domeinnaam, NetBIOS-naam, IP-adres of andere naam. Omdat verschillende waarden naar dezelfde host kunnen verwijzen, is het standaardgedrag voor deze vergelijking om het hostnaamgedeelte van het adres niet te gebruiken bij het uitvoeren van overeenkomsten.
Dit filter moet worden gebruikt bij het routeren van binnenkomende berichten die een gemeenschappelijk adresvoorvoegsel delen.
EN
Het AND-filter filtert niet rechtstreeks op een waarde binnen een bericht, maar u kunt twee andere filters combineren om een AND
voorwaarde te maken waarbij beide filters overeenkomen met het bericht voordat het AND-filter wordt geëvalueerd true
. Hiermee kunt u complexe filters maken die alleen overeenkomen als alle subfilters overeenkomen. Het volgende voorbeeld definieert een adresfilter en een actiefilter en definieert vervolgens een AND-filter waarmee een bericht wordt geëvalueerd op basis van zowel de adres- als actiefilters. Als zowel het adres als de actiefilters overeenkomen, retourneert true
het AND-filter.
<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);
Dit filter moet worden gebruikt wanneer u de logica van meerdere filters moet combineren om te bepalen wanneer er een overeenkomst moet worden gemaakt. Als u bijvoorbeeld meerdere bestemmingen hebt die alleen bepaalde combinaties van acties en berichten naar bepaalde adressen moeten ontvangen, kunt u een AND-filter gebruiken om de benodigde actie- en adresfilters te combineren.
Aanpassen
Wanneer u het aangepaste filtertype selecteert, moet u een customType-waarde opgeven die het type assembly bevat dat de MessageFilter-implementatie bevat die voor dit filter moet worden gebruikt. Daarnaast moet filterData waarden bevatten die het aangepaste filter mogelijk vereist bij de evaluatie van berichten. In het volgende voorbeeld wordt een FilterElement
definitie gedefinieerd die gebruikmaakt van de MessageFilter-implementatie CustomAssembly.MyCustomMsgFilter
.
<filter name="custom1" filterType="Custom" customType="CustomAssembly.MyCustomMsgFilter, CustomAssembly" filterData="Custom Data" />
MyCustomMsgFilter custom1=new MyCustomMsgFilter("Custom Data");
Als u aangepaste vergelijkingslogica wilt uitvoeren voor een bericht dat niet wordt gedekt door de filters die worden geleverd met .NET Framework 4.6.1, moet u een aangepast filter maken dat een implementatie is van de MessageFilter-klasse . U kunt bijvoorbeeld een aangepast filter maken waarmee een veld in het binnenkomende bericht wordt vergeleken met een lijst met bekende waarden die aan het filter zijn opgegeven als configuratie, of die een bepaald berichtelement hashes en die vervolgens die waarde onderzoekt om te bepalen of het filter moet worden geretourneerd true
of false
.
EndpointName
Het EndpointName-filter inspecteert de naam van het eindpunt dat het bericht heeft ontvangen. In het volgende voorbeeld wordt een FilterElement
filter endpointname gedefinieerd voor het routeren van berichten die zijn ontvangen op het SvcEndpoint.
<filter name="name1" filterType="Endpoint" filterData="SvcEndpoint" />
EndpointNameMessageFilter name1 = new EndpointNameMessageFilter("SvcEndpoint");
Dit filter is handig wanneer de routeringsservice meer dan één benoemd service-eindpunt beschikbaar maakt. U kunt bijvoorbeeld twee eindpunten beschikbaar maken die door de routeringsservice worden gebruikt voor het ontvangen van berichten; een wordt gebruikt door klanten met prioriteit die realtime verwerking van hun berichten vereisen, terwijl het andere eindpunt berichten ontvangt die niet tijdgevoelig zijn.
Hoewel u vaak volledige adreskoppeling kunt gebruiken om te bepalen op welk eindpunt een bericht is ontvangen, is het gebruik van de gedefinieerde eindpuntnaam een handige snelkoppeling die vaak minder foutgevoelig is, met name wanneer u een routeringsservice configureert met behulp van een configuratiebestand (waarbij eindpuntnamen een vereist kenmerk zijn).
MatchAll
Het Filter MatchAll komt overeen met een ontvangen bericht. Het is handig als u altijd alle ontvangen berichten naar een specifiek eindpunt moet routeren, zoals een logboekregistratieservice waarin een kopie van alle ontvangen berichten wordt opgeslagen. In het volgende voorbeeld wordt een FilterElement
filter gedefinieerd dat gebruikmaakt van het filter MatchAll.
<filter name="matchAll1" filterType="MatchAll" />
MatchAllMessageFilter matchAll1 = new MatchAllMessageFilter();
Xpath
Met het XPath-filter kunt u een XPath-query opgeven die wordt gebruikt om een specifiek element in het bericht te inspecteren. XPath-filtering is een krachtige filteroptie waarmee u alle XML-adresseerbare vermeldingen in het bericht rechtstreeks kunt inspecteren; het vereist echter dat u specifieke kennis hebt van de structuur van de berichten die u ontvangt. In het volgende voorbeeld wordt gedefinieerd FilterElement
dat het XPath-filter gebruikt om het bericht te controleren op een element met de naam 'element' in de naamruimte waarnaar wordt verwezen door het voorvoegsel 'ns'-naamruimte.
<filter name="xpath1" filterType="XPath" filterData="//ns:element" />
XPathMessageFilter xpath1=new XPathMessageFilter("//ns:element");
Dit filter is handig als u weet dat de berichten die u ontvangt een specifieke waarde bevatten. Als u bijvoorbeeld twee versies van dezelfde service host en u weet dat berichten die zijn geadresseerd aan de nieuwere versie van de service een unieke waarde bevatten in een aangepaste header, kunt u een filter maken dat gebruikmaakt van XPath om naar deze koptekst te navigeren en de waarde in de koptekst vergelijkt met een andere waarde in de filterconfiguratie om te bepalen of het filter overeenkomt.
Omdat XPath-query's vaak unieke naamruimten bevatten, die vaak lange of complexe tekenreekswaarden zijn, kunt u met het XPath-filter de tabel naamruimte gebruiken om unieke voorvoegsels voor uw naamruimten te definiëren. Zie Berichtfilters voor meer informatie over de naamruimtetabel.
Zie XPath-syntaxis voor meer informatie over het ontwerpen van XPath-query's.