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 true
metoden . 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örblitrue
.
Adressfilter för prefixslutpunkt
- 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 tillhttp://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:
URI:n i
EndpointAddress
.Resten av slutpunktsparametrarna i som
EndpointAddress
anges i EndpointAddressMessageFilter.