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 alla 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.

Filter

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

Innehåller ActionMessageFilter en lista över åtgärdssträngar. Om någon av åtgärderna i filtrets lista matchar åtgärdshuvudet i meddelande- eller meddelandebufferten Match returnerar truemetoden . Om listan är tom betraktas filtret som ett matchningsfilter och eventuella meddelande- 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 false.Match

Slutpunktsadressfilter

Filtrerar EndpointAddressMessageFilter meddelanden och meddelandebuffertar baserat på en slutpunktsadress, enligt beskrivningen i deras rubriksamling. För att ett meddelande ska kunna skicka 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 precis som EndpointAddressMessageFilter filtret, förutom att matchningen kan finnas på ett prefix för meddelande-URI:n. 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 är flera matchningsmetoder och returnerar alla matchande objekt. Andra är en matchning, returnerar bara ett objekt och genererar 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 routning av ett meddelande baserat på dess åtgärdskod och avmultering 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.

De-multiplexing

När flera slutpunkter fläktas ut från samma ServiceListener från tråden är det enda sättet att de-multiplex meddelanden och vet om de tillhör en viss slutpunktsadress, att använda EndpointAddressMessageFilters, som väljer meddelanden mot de registrerade slutpunkterna genom att utföra en sökning på informationen som lagras i rubrikerna. I dessa filter har endast de meddelanden som skickas alla nödvändiga rubriker som motsvarar båda:

Se även