Filteren
Het WCF-filtersysteem (Windows Communication Foundation) kan declaratieve filters gebruiken om berichten te vinden en operationele beslissingen te nemen. U kunt filters gebruiken om te bepalen wat u met een bericht moet doen door een deel van het bericht te bekijken. Een wachtrijproces kan bijvoorbeeld een XPath 1.0-query gebruiken om het prioriteitselement van een bekende header te controleren om te bepalen of een bericht naar de voorzijde van de wachtrij moet worden verplaatst.
Het filtersysteem bestaat uit een set klassen die efficiënt kunnen bepalen welke van een set filters voor een bepaald WCF-bericht zijn true
.
Het filtersysteem is een kernonderdeel van WCF-berichten; het is ontworpen om extreem snel te zijn. Elke filter-implementatie is geoptimaliseerd voor een bepaald soort overeenkomst met WCF-berichten.
Het filtersysteem is niet thread veilig. De toepassing moet semantiek voor vergrendelen afhandelen. Het biedt echter wel ondersteuning voor één lezer, één schrijver.
Waar filteren past
Filteren wordt uitgevoerd nadat een bericht is ontvangen en maakt deel uit van het proces voor het verzenden van het bericht naar het juiste toepassingsonderdeel. Het ontwerp van het filtersysteem voldoet aan de vereisten van verschillende WCF-subsystemen, waaronder berichten, routering, beveiliging, gebeurtenisafhandeling en systeembeheer.
Filters
De filterengine heeft twee primaire onderdelen, filters en filtertabellen. Een filter neemt Booleaanse beslissingen over een bericht op basis van door de gebruiker opgegeven logische voorwaarden. Filters implementeren de MessageFilter klasse.
De Match methoden worden gebruikt om te bepalen of een bericht voldoet aan een filter. Een van de methoden test de koptekst van het bericht, maar kan de berichttekst niet inspecteren. De andere methode gebruikt een berichtbuffer als invoerparameter en kan de berichttekst inspecteren.
Filters worden meestal niet afzonderlijk getest, maar als onderdeel van een filtertabel, een algemene klasse die door de CreateFilterTable methode wordt gemaakt.
De verschillende soorten filters zijn allemaal gespecialiseerd in het vergelijken van een bepaald type Booleaanse voorwaarde. Nadat u een filter hebt gemaakt, kunt u de criteria die door een filter worden gebruikt, niet wijzigen. als u de criteria van een filter wilt wijzigen, maakt u een nieuw filter en verwijdert u het bestaande filter.
Actiefilters
De ActionMessageFilter lijst bevat een lijst met actietekenreeksen. Als een van de acties in de lijst van het filter overeenkomt met de actiekop in het bericht of de berichtbuffer, retourneert true
de Match
methode . Als de lijst leeg is, wordt het filter beschouwd als een filter voor alle overeenkomsten en alle berichten of berichtenbuffers en Match
retourneert true
het. Als geen van de acties in de lijst van het filter overeenkomt met de actiekop in het bericht of de berichtbuffer, Match
wordt deze geretourneerd false
. Als het bericht geen actie bevat en de lijst van het filter niet leeg is, wordt het Match
resultaat geretourneerd false
.
Eindpuntadresfilters
De EndpointAddressMessageFilter filtert berichten en berichtbuffers op basis van een eindpuntadres, zoals weergegeven in de headerverzameling. Voor een bericht dat een dergelijk filter moet worden doorgegeven, moet aan de volgende voorwaarden worden voldaan:
De URI (Address Uniform Resource Identifier) van het filter moet gelijk zijn aan die in de bericht-naar-header.
Elke eindpuntparameter in het adres van het filter (
address.Headers
verzameling) moet een header vinden in het bericht waarop moet worden toegewezen. Extra headers in de bericht- of berichtbuffer zijn acceptabel voor de overeenkomst.true
Eindpuntadresfilters voor voorvoegsel
- De PrefixEndpointAddressMessageFilter functies zijn net als het EndpointAddressMessageFilter filter, behalve dat de overeenkomst zich op een voorvoegsel van de bericht-URI kan bevinden. Een filter dat het adres
http://www.adatum.com
opgeeft, komt bijvoorbeeld overeen met berichten die zijnhttp://www.adatum.com/userA
geadresseerd.
XPath-berichtfilters
Een XPathMessageFilter XPath-expressie gebruikt om te bepalen of een XML-document specifieke elementen, kenmerken, tekst of andere XML-syntactische constructies bevat. Het filter is geoptimaliseerd om uiterst efficiënt te zijn voor een strikte subset van XPath. De XML-padtaal wordt beschreven in de W3C XML Path Language 1.0-specificatie.
Normaal gesproken gebruikt een toepassing een XPathMessageFilter op een eindpunt om een query uit te voeren op de inhoud van een SOAP-bericht en vervolgens de juiste actie uit te voeren op basis van de resultaten van die query. Een wachtrijproces kan bijvoorbeeld een XPath-query gebruiken om het prioriteitselement van een bekende header te inspecteren om te bepalen of een bericht naar de voorzijde van de wachtrij moet worden verplaatst.
Tabellen filteren
Filtertabellen worden gebruikt om sleutel-waardeparen op te slaan, waarbij een filter de sleutel is en sommige bijbehorende gegevens de waarde zijn. De filtergegevens kunnen worden gebruikt om aan te geven welke acties moeten worden uitgevoerd als een bericht overeenkomt met het filter en het type filtergegevens de algemene parameter voor de filtertabelklasse is. De filtergegevens kunnen bestaan uit routeringsregels, sessiebeveiligingsstatus, listeners op een kanaal, enzovoort. De gegevens kunnen worden gebruikt waar gegevensstroombeheer nodig is.
Filtertabellen implementeren de algemene interface IMessageFilterTable<TFilterData>.
Filtertabellen hebben verschillende methoden die overeenkomen met een bericht ten opzichte van alle filters in de tabel en een niet-geordende verzameling overeenkomende filters of gegevens retourneren. Sommige van de overeenkomstmethoden zijn meerdere overeenkomsten en retourneren alle overeenkomende items. Anderen zijn één overeenkomst, retourneren slechts één item en gooien een MultipleFilterMatchesException als meer dan één filter overeenkomt.
Berichtfiltertabel
Dit MessageFilterTable<TFilterData> is de meest algemene implementatie van IMessageFilterTable<TFilterData>. U kunt filters van alle typen opslaan in de tabel.
U kunt numerieke prioriteiten toewijzen aan filters, waarbij de hoogste prioriteit wordt aangegeven door het hoogste getal. Meerdere typen filters kunnen dezelfde prioriteit hebben. Een bepaald type filter kan worden weergegeven in meer dan één prioriteitsniveau.
Overeenkomende taken worden uitgevoerd vanaf de hoogste prioriteit en zodra overeenkomende filters met een bepaalde prioriteit worden gevonden, worden er geen filters met lagere prioriteiten onderzocht. Als u dus een methode voor één filterovereenkomst gebruikt en meer dan één filter overeenkomt met een bericht, maar elk overeenkomend filter een andere prioriteit heeft, wordt er geen uitzondering gegenereerd en wordt het filter met de hoogste prioriteit geretourneerd. Op dezelfde manier retourneert een methode voor meerdere filters alleen de overeenkomende filters met de hoogste prioriteit.
XPath-berichtfiltertabel
De XPathMessageFilterTable<TFilterData> is geoptimaliseerd voor declaratieve XPath-filters, dus de tabelsleutel is een XPathMessageFilter.
De XPathMessageFilterTable<TFilterData> klasse optimaliseert overeenkomsten voor een subset van XPath die betrekking heeft op de meeste berichtenscenario's en ondersteunt ook de volledige XPath 1.0-grammatica. Het heeft geoptimaliseerde algoritmen voor efficiënte parallelle overeenkomsten.
Deze tabel heeft verschillende gespecialiseerde Match
methoden die worden uitgevoerd via een XPathNavigator en een SeekableXPathNavigator. Een SeekableXPathNavigator uitbreiding van de XPathNavigator klasse door een CurrentPosition eigenschap toe te voegen. Met deze eigenschap kunnen posities in het XML-document snel worden opgeslagen en geladen zonder dat u de navigator hoeft te klonen, een dure geheugentoewijzing die XPathNavigator nodig is voor een dergelijke bewerking. De WCF XPath-engine moet regelmatig de positie van de cursor vastleggen tijdens het uitvoeren van query's op XML-documenten, dus de SeekableXPathNavigator engine biedt een belangrijke optimalisatie voor berichtverwerking.
Klantscenario's
U kunt filteren op elk gewenst moment gebruiken om een bericht naar verschillende verwerkingsmodules te verzenden, afhankelijk van de gegevens in het bericht. Twee typische scenario's zijn het routeren van een bericht op basis van de actiecode en het ongedaan maken van multiplexing van berichten op basis van het eindpuntadres van de berichten.
Routering
De listener van een eindpunt luistert naar berichten met een of meer actiecodes in de SOAP-header van het bericht. U implementeert dit door een ActionMessageFilter matrix te maken die de actiecodes bevat aan de constructor. Het gebruikt dat filter om te registreren bij de ListenerFactory
, zodat alleen berichten waarvan de actie overeenkomt met een van die in het filter naar dat specifieke eindpunt.
De multiplexing ongedaan maken
Wanneer meerdere eindpunten uitwaaieren van hetzelfde ServiceListener
van de draad, is de enige manier om multiplexe berichten uit te schakelen en te weten of ze deel uitmaken van een bepaald eindpuntadres, s te gebruiken EndpointAddressMessageFilter, waarbij berichten naar de geregistreerde eindpunten worden geselecteerd door een zoekopdracht uit te voeren op de informatie die in de headers is opgeslagen. In deze filters hebben alleen berichten die worden doorgegeven alle benodigde headers die overeenkomen met beide:
De URI in de
EndpointAddress
.De rest van de eindpuntparameters in de
EndpointAddress
opgegeven in de EndpointAddressMessageFilter.