Filtrování
Systém filtrování wcf (Windows Communication Foundation) může používat deklarativní filtry ke shodě zpráv a provádění provozních rozhodnutí. Filtry můžete použít k určení toho, co dělat se zprávou, prozkoumáním části zprávy. Proces řazení do fronty může například pomocí dotazu XPath 1.0 zkontrolovat prvek priority známé hlavičky a určit, zda se má zpráva přesunout do fronty.
Systém filtrování se skládá ze sady tříd, které mohou efektivně určit, která sada filtrů je true
určena pro konkrétní zprávu WCF.
Systém filtrování je základní součástí zasílání zpráv WCF; je navržen tak, aby byl extrémně rychlý. Každá implementace filtru byla optimalizována pro určitý druh porovnávání se zprávami WCF.
Systém filtrování není bezpečný pro přístup z více vláken. Aplikace musí zpracovávat všechny sémantiky uzamčení. Podporuje ale vícečísměrný jeden zapisovač.
Where Filtering Fits
Filtrování se provádí po přijetí zprávy a je součástí procesu odeslání zprávy do správné součásti aplikace. Návrh systému filtrování řeší požadavky několika subsystémů WCF, včetně zasílání zpráv, směrování, zabezpečení, zpracování událostí a správy systému.
Filtry
Modul filtrů má dvě primární komponenty, filtry a tabulky filtrů. Filtr provádí logická rozhodnutí o zprávě na základě uživatelem zadaných logických podmínek. Filtry implementují MessageFilter třídu.
Metody Match se používají k určení, zda zpráva splňuje filtr. Jedna z metod testuje hlavičku zprávy, ale nemůže zkontrolovat text zprávy. Druhá metoda přebírá vyrovnávací paměť zprávy jako vstupní parametr a může zkontrolovat tělo zprávy.
Filtry nejsou obvykle testovány jednotlivě, ale jako součást tabulky filtrů, což je obecná třída, kterou CreateFilterTable metoda vytvoří.
Několik druhů filtrů se specializuje na porovnávání konkrétního druhu logické podmínky. Jakmile vytvoříte filtr, nemůžete změnit kritéria, která filtr používá; pokud chcete upravit kritéria filtru, vytvořte nový a odstraňte existující filtr.
Filtry akcí
Obsahuje ActionMessageFilter seznam řetězců akcí. Pokud některá z akcí v seznamu filtru odpovídá záhlaví akce ve zprávě nebo vyrovnávací paměti zprávy, Match
metoda vrátí true
. Pokud je seznam prázdný, filtr se považuje za filtr odpovídající všem a všechny zprávy nebo vyrovnávací paměti zprávy a Match
vrátí .true
Pokud žádná z akcí v seznamu filtru neodpovídá záhlaví akce ve zprávě nebo vyrovnávací paměti zprávy, Match
vrátí .false
Pokud zpráva neobsahuje žádnou akci a seznam filtru není prázdný, Match
vrátí hodnotu false
.
Filtry adres koncového bodu
Filtruje EndpointAddressMessageFilter zprávy a vyrovnávací paměti zpráv na základě adresy koncového bodu, jak je znázorněno v jejich kolekci hlaviček. Aby zpráva předala takový filtr, musí být splněny následující podmínky:
Identifikátor URI (Uniform Resource Identifier) filtru musí být stejný jako adresa v záhlaví Zprávy.
Každý parametr koncového bodu v adrese filtru (
address.Headers
kolekce) musí najít záhlaví zprávy, na které se má namapovat. Další hlavičky v vyrovnávací paměti zprávy nebo zprávy jsou přijatelné pro zachovánítrue
shody .
Filtry adres koncového bodu předpony
- Funkce PrefixEndpointAddressMessageFilter stejně jako EndpointAddressMessageFilter filtr s tím rozdílem, že shoda může být na předponě identifikátoru URI zprávy. Například filtr určující adresu
http://www.adatum.com
odpovídá zprávou adresovanouhttp://www.adatum.com/userA
.
Filtry zpráv XPath
Výraz XPathMessageFilter XPath slouží k určení, zda dokument XML obsahuje specifické prvky, atributy, text nebo jiné syntaktické konstrukty XML. Filtr je optimalizovaný tak, aby byl velmi efektivní pro striktní podmnožinu XPath. Jazyk cesty XML je popsán ve specifikaci W3C XML Path Language 1.0.
Aplikace obvykle používá XPathMessageFilter v koncovém bodu dotaz na obsah zprávy SOAP a pak provede příslušnou akci na základě výsledků tohoto dotazu. Proces řazení do fronty může například použít dotaz XPath ke kontrole prvku priority známé hlavičky, abyste se rozhodli, zda se má zpráva přesunout před frontu.
Filtrování tabulek
Tabulky filtrů se používají k ukládání párů klíč-hodnota, kde je klíčem filtr a některá přidružená data jsou hodnotou. Data filtru lze použít k označení akcí, které se mají provést, pokud zpráva odpovídá filtru a typ dat filtru je obecný parametr pro třídu tabulky filtru. Data filtru se můžou skládat z pravidel směrování, stavu zabezpečení relace, naslouchacích procesů v kanálu atd. Data je možné použít tam, kde je potřeba řídit tok dat.
Filtrování tabulek implementuje obecné rozhraní IMessageFilterTable<TFilterData>.
Tabulky filtru mají několik metod, které odpovídají zprávě se všemi filtry v tabulce a vrací neseřazenou kolekci odpovídajících filtrů nebo dat. Některé metody shody jsou vícenásobné shody a vrátí všechny odpovídající položky. Jiné jsou shodné, vrací pouze jednu položku a vyvolají MultipleFilterMatchesException výjimku, pokud odpovídá více než jednomu filtru.
Tabulka filtru zpráv
Jedná se MessageFilterTable<TFilterData> o nejobecnější implementaci IMessageFilterTable<TFilterData>. Filtry všech typů můžete uložit v tabulce.
K filtrům můžete přiřadit číselné priority, kde nejvyšší prioritu označuje nejvyšší číslo. Stejnou prioritu může mít více typů filtrů. Konkrétní typ filtru se může zobrazit ve více než jedné úrovni priority.
Porovnávání se provádí od nejvyšší priority a jakmile jsou nalezeny odpovídající filtry s danou prioritou, neprověřují se žádné filtry s nižšími prioritami. Proto pokud používáte metodu shody s jedním filtrem a více než jeden filtr odpovídá zprávě, ale každý odpovídající filtr má jinou prioritu, nevyvolá se žádná výjimka a vrátí se filtr s nejvyšší prioritou. Podobně metoda shody s více filtry vrátí pouze ty odpovídající filtry s nejvyšší prioritou.
Tabulka filtru zpráv XPath
Je XPathMessageFilterTable<TFilterData> optimalizovaný pro deklarativní filtry XPath, takže klíč tabulky je XPathMessageFilter.
Třída XPathMessageFilterTable<TFilterData> optimalizuje shodu pro podmnožinu XPath, která pokrývá většinu scénářů zasílání zpráv a podporuje také úplnou gramatiku XPath 1.0. Má optimalizované algoritmy pro efektivní paralelní porovnávání.
Tato tabulka obsahuje několik specializovaných Match
metod, které pracují s a XPathNavigatorSeekableXPathNavigator. A SeekableXPathNavigator rozšiřuje XPathNavigator třídu přidáním CurrentPosition vlastnosti. Tato vlastnost umožňuje ukládat a načítat pozice v dokumentu XML rychle, aniž by bylo nutné naklonovat navigátor, nákladné přidělení paměti, které XPathNavigator vyžaduje takovou operaci. Modul WCF XPath musí často zaznamenávat pozici kurzoru v průběhu provádění dotazů na dokumenty XML, takže SeekableXPathNavigator poskytuje důležitou optimalizaci pro zpracování zpráv.
Scénáře zákazníků
Filtrování můžete použít kdykoli, když chcete zprávu odeslat do různých modulů zpracování v závislosti na datech obsažených ve zprávě. Dva typické scénáře směrují zprávu na základě kódu akce a de-multiplexují datový proud zpráv na základě adresy koncového bodu zprávy.
Směrování
Naslouchací proces koncového bodu naslouchá zprávám, které mají v hlavičce SOAP zprávy jeden nebo více kódů akcí. Implementujete to tak, že vytvoříte ActionMessageFilter pole, které obsahuje kódy akcí do jeho konstruktoru. Tento filtr používá k registraci pomocí ListenerFactory
tohoto filtru, takže pouze zprávy, jejichž akce odpovídá jednomu z těch, které jsou ve filtru, se dostanou k tomuto konkrétnímu koncovému bodu.
De-multiplexing
Pokud se ze stejného ServiceListener
přenosu oddálí více koncových bodů, jediným způsobem, jak de-multiplexové zprávy a zjistit, jestli patří do určité adresy koncového bodu, je použít EndpointAddressMessageFilters, které vyberou zprávy směrem k registrovaným koncovým bodům provedením vyhledávání informací uložených v hlavičkách. V těchto filtrech mají pouze zprávy, které předávají všechny nezbytné hlavičky, které odpovídají oběma těmto:
Identifikátor URI v souboru
EndpointAddress
.Zbývající parametry koncového bodu v parametru
EndpointAddress
zadaném v parametru EndpointAddressMessageFilter.