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í. Ale podporuje více čteček, jeden zapisovač.

Kde se filtrování hodí

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á buffer zprávy jako vstupní parametr a umožňuje kontrolovat 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í

ActionMessageFilter obsahuje seznam řetězců akcí. Pokud některá z akcí v seznamu filtru odpovídá hlavičce akce ve zprávě nebo ve vyrovnávací paměti zprávy, metoda Match vrátí true. Pokud je seznam prázdný, filtr je filtrem, který odpovídá všem, a všechny zprávy nebo vyrovnávací paměť zpráv odpovídají a Match se 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 prošla 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 ve vyrovnávací paměti zprávy nebo ve zprávě jsou přijatelné pro zachování shody true.

Prefixové filtry adres koncového bodu

  1. Funkce PrefixEndpointAddressMessageFilter funguje stejně jako filtr EndpointAddressMessageFilter s tím rozdílem, že shoda může být na předponě URI zprávy. Například filtr určující adresu http://www.adatum.com odpovídající zprávám adresovaným http://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, aby se rozhodlo, zda se má zpráva přesunout na začátek fronty.

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, posluchačů na 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 pro porovnání, které porovnávají zprávu se všemi filtry v tabulce a vrací neseřazenou kolekci odpovídajících filtrů nebo dat. Některé metody porovnávání umožňují vícenásobné shody a vrací všechny odpovídající položky. Některé odpovídají pouze jednomu filtru, vrací jednu položku a vyvolají MultipleFilterMatchesException výjimku, pokud je nalezeno více než jedno odpovídající filtrování.

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 rychle ukládat a načítat pozice v dokumentu XML, aniž by bylo nutné klonovat navigátor, což je operace náročná na přidělení paměti, kterou XPathNavigator vyžaduje. 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í

Posluchač koncového bodu naslouchá zprávám, které mají v SOAP hlavičce zprávy jeden nebo více kódů akcí. Implementujete to tak, že vytvoříte ActionMessageFilter předáním pole, které obsahuje kódy akcí, jeho konstruktoru. Tento filtr používá k registraci u ListenerFactory, takže pouze zprávy, jejichž akce odpovídá některé z těch ve filtru, se dostanou k tomuto konkrétnímu koncovému bodu.

Demultiplexace

Pokud se ze stejné linky oddálí více koncových bodů, jediným způsobem, jak demultiplexovat zprávy a zjistit, jestli patří k určité adrese koncového bodu, je použít ServiceListener, které vybírají zprávy směřující k registrovaným koncovým bodům prostřednictvím vyhledání informací uložených v hlavičkách. V těchto filtrech projdou pouze ty zprávy, které mají všechny nezbytné hlavičky odpovídající oběma následujícím kritériím:

  • Identifikátor URI v souboru EndpointAddress.

  • Zbývající parametry koncového bodu EndpointAddress podle specifikací v EndpointAddressMessageFilter.

Viz také