Dela via


Filtrering

Filtreringssystemet för Windows Communication Foundation (WCF) kan använda deklarativa filter för att matcha meddelanden och fatta operativa beslut. Du kan använda filter för att avgöra vad du ska göra med ett meddelande genom att undersöka en del av meddelandet. En köprocess kan till exempel använda en XPath 1.0-fråga för att kontrollera prioritetselementet i ett känt huvud för att avgöra om ett meddelande ska flyttas till köns framsida.

Filtreringssystemet består av en uppsättning klasser som effektivt kan avgöra vilken av en uppsättning filter som är true till för ett visst WCF-meddelande.

Filtreringssystemet är en central komponent i WCF-meddelanden. Den är utformad för att vara extremt snabb. Varje filterimplementering har optimerats för en viss typ av matchning mot WCF-meddelanden.

Filtreringssystemet är inte trådsäkert. Programmet måste hantera all slags låssemantik. Det stöder dock en enskild skrivare med flera läsare.

Där filtrering passar

Filtrering utförs när ett meddelande har tagits emot och ingår i processen att skicka meddelandet till rätt programkomponent. Utformningen av filtreringssystemet uppfyller kraven för flera WCF-undersystem, inklusive meddelanden, routning, säkerhet, händelsehantering och systemhantering.

Filterar

Filtermotorn har två primära komponenter, filter och filtertabeller. Ett filter fattar booleska beslut om ett meddelande baserat på användardefinierade logiska villkor. Filter implementerar MessageFilter klassen.

Metoderna Match används för att avgöra om ett meddelande uppfyller ett filter. En av metoderna testar meddelandets huvud, men kan inte granska meddelandetexten. Den andra metoden tar en meddelandebuffert som indataparameter och kan inspektera meddelandetexten.

Filter testas vanligtvis inte individuellt, utan som en del av en filtertabell, som är en allmän klass som CreateFilterTable metoden skapar.

De olika typerna av filter specialiserar sig på matchning på en viss typ av booleskt villkor. När du har skapat ett filter kan du inte ändra de villkor som ett filter använder. om du vill ändra ett filters villkor skapar du ett nytt och tar bort det befintliga filtret.

Åtgärdsfilter

ActionMessageFilter innehåller en lista över åtgärdssträngar. Om någon av åtgärderna i filtrets lista matchar åtgärdshuvudet i ett meddelande eller en meddelandebuffert, returnerar metoden Matchtrue. Om listan är tom, betraktas filtret som ett allt-matchande filter och alla meddelanden eller meddelandebuffertar matchar och Match returnerar true. Om ingen av åtgärderna i filtrets lista matchar åtgärdshuvudet i meddelande- eller meddelandebufferten Match returnerar false. Om det inte finns någon åtgärd i meddelandet och filtrets lista inte är tom, returnerar Matchfalse.

Slutpunktsadressfilter

Det EndpointAddressMessageFilter filtrerar meddelanden och meddelandebuffertar baserat på en slutpunktsadress, så som representerad i deras header-kollektion. För att ett meddelande ska kunna passera ett sådant filter måste följande villkor vara uppfyllda:

  • Filtrets adress URI (Uniform Resource Identifier) måste vara samma som i meddelandet Till-huvud.

  • Varje slutpunktsparameter i filtrets adress (address.Headers samling) måste hitta en rubrik i meddelandet som ska mappas på. Extra rubriker i meddelande- eller meddelandebufferten är acceptabla för att matchningen ska förbli true.

Adressfilter för prefixslutpunkt

  1. Funktionerna PrefixEndpointAddressMessageFilter fungerar precis som filtret EndpointAddressMessageFilter, förutom att matchningen kan göras på ett prefix av meddelande-URI. Ett filter som anger adressen http://www.adatum.com matchar till exempel meddelanden som är adresserade till http://www.adatum.com/userA.

XPath-meddelandefilter

En XPathMessageFilter använder ett XPath-uttryck för att avgöra om ett XML-dokument innehåller specifika element, attribut, text eller andra XML-syntaktiska konstruktioner. Filtret är optimerat för att vara extremt effektivt för en strikt delmängd av XPath. Xml-sökvägsspråket beskrivs i specifikationen W3C XML Path Language 1.0.

Vanligtvis använder ett program en XPathMessageFilter i en slutpunkt för att fråga innehållet i ett SOAP-meddelande och vidtar sedan lämplig åtgärd baserat på resultatet av frågan. En köprocess kan till exempel använda en XPath-fråga för att inspektera prioritetselementet i ett känt huvud för att avgöra om ett meddelande ska flyttas till köns framsida.

Filtrera tabeller

Filtertabeller används för att lagra nyckel/värde-par, där ett filter är nyckeln och vissa associerade data är värdet. Filterdata kan användas för att ange vilka åtgärder som ska vidtas om ett meddelande matchar filtret och typen av filterdata är den allmänna parametern för filtertabellklassen. Filterdata kan bestå av routningsregler, sessionssäkerhetstillstånd, lyssnare på en kanal och så vidare. Data kan användas där dataflödeskontroll krävs.

Filtertabeller implementerar det allmänna gränssnittet IMessageFilterTable<TFilterData>.

Filtertabeller har flera metoder som matchar ett meddelande mot alla filter i tabellen och returnerar en osorterad samling matchande filter eller data. Vissa matchningsmetoder tillåter flera träffar och returnerar alla matchande objekt. Andra är enkla matchningar, returnerar bara en post och kastar ett MultipleFilterMatchesException om fler än ett filter matchar.

Tabell för meddelandefilter

MessageFilterTable<TFilterData> är den mest allmänna implementeringen av IMessageFilterTable<TFilterData>. Du kan lagra filter av alla typer i tabellen.

Du kan tilldela numeriska prioriteringar till filter, där den högsta prioriteten har det högsta antalet. Flera typer av filter kan ha samma prioritet. En viss typ av filter kan visas på mer än en prioritetsnivå.

Matchning görs från och med den högsta prioriteten, och när matchande filter hittas med en viss prioritet granskas inga filter med lägre prioritet. Om du använder en matchningsmetod med ett filter och fler än ett filter matchar ett meddelande, men varje matchande filter har en annan prioritet, genereras inget undantag och filtret med högsta prioritet returneras. På samma sätt returnerar en matchningsmetod med flera filter endast de matchande filter med högsta prioritet.

XPath-meddelandefiltertabell

XPathMessageFilterTable<TFilterData> är optimerad för deklarativa XPath-filter, så tabellnyckeln är en XPathMessageFilter.

Klassen XPathMessageFilterTable<TFilterData> optimerar matchning för en delmängd av XPath som täcker de flesta meddelandescenarier och även stöder fullständig XPath 1.0-grammatik. Den har optimerade algoritmer för effektiv parallell matchning.

Den här tabellen har flera specialiserade Match metoder som fungerar över en XPathNavigator och en SeekableXPathNavigator. A SeekableXPathNavigator utökar XPathNavigator klassen genom att lägga till en CurrentPosition egenskap. Den här egenskapen gör att positioner i XML-dokumentet kan sparas och läsas in snabbt utan att behöva klona navigatören, en dyr minnesallokering som XPathNavigator krävs för en sådan åtgärd. WCF XPath-motorn måste ofta registrera markörens position under körningen av frågor i XML-dokument, så SeekableXPathNavigator ger en viktig optimering för meddelandebearbetning.

Kundscenarier

Du kan använda filtrering när du vill skicka ett meddelande till olika bearbetningsmoduler beroende på data i meddelandet. Två typiska scenarier är att dirigera ett meddelande baserat på dess åtgärdskod och demultiplexering av en ström av meddelanden baserat på meddelandenas slutpunktsadress.

Routning

Lyssnaren av en slutpunkt lyssnar efter meddelanden som har en eller flera åtgärdskoder i meddelandets SOAP-huvud. Du implementerar detta genom att skapa en ActionMessageFilter genom att skicka en matris som innehåller åtgärdskoderna till konstruktorn. Det använder det filtret för att registrera med ListenerFactory, så att endast meddelanden vars åtgärd matchar en av dem i filtret kommer till den specifika slutpunkten.

Demontering av multiplexering

När flera slutpunkter förgrenas från samma ServiceListener från anslutningen är det enda sättet att avmultiplexa meddelanden och veta om de tillhör en viss slutpunktsadress att använda EndpointAddressMessageFilters, som väljer meddelanden till de registrerade slutpunkterna genom att söka på information som finns i rubrikerna. I dessa filter har endast de meddelanden som skickas alla nödvändiga rubriker som motsvarar båda:

Se även