Výběr filtru
Při konfiguraci služby směrování je důležité vybrat správné filtry zpráv a nakonfigurovat je tak, abyste mohli provádět přesné shody se zprávami, které obdržíte. Pokud vybrané filtry jsou příliš široké v jejich shodách nebo jsou nesprávně nakonfigurované, zprávy se směrují nesprávně. Pokud jsou filtry příliš omezující, možná nemáte pro některé zprávy k dispozici žádné platné trasy.
Typy filtrů
Při výběru filtrů používaných službou směrování je důležité pochopit, jak jednotlivé filtry fungují a jaké informace jsou k dispozici jako součást příchozích zpráv. Pokud jsou například všechny zprávy přijaty přes stejný koncový bod, filtry Address a EndpointName nejsou užitečné, protože všechny zprávy odpovídají těmto filtrům.
Akce
Filtr akce zkontroluje Action vlastnost. Pokud obsah záhlaví akce ve zprávě odpovídá hodnotě dat filtru zadané v konfiguraci filtru, vrátí true
tento filtr hodnotu . Následující příklad definuje FilterElement
, který pomocí filtru akce odpovídá zprávám s hlavičkou akce, která obsahuje hodnotu http://namespace/contract/operation/
.
<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/" />
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });
Tento filtr by se měl použít při směrování zpráv, které obsahují jedinečné záhlaví akce.
Endpointaddress
Filtr EndpointAddress zkontroluje endpointAddress, na které byla zpráva přijata. Pokud adresa, na kterou zpráva dorazí přesně, odpovídá adrese filtru zadané v konfiguraci filtru, vrátí true
tento filtr . Následující příklad definuje FilterElement
, který používá filtr Adresa odpovídající všem zprávám adresovaných jako "http://< hostname>/vdir/s.svc/b".
<filter name="address1" filterType="EndpointAddress" filterData="http://host/vdir/s.svc/b" />
EndpointAddressMessageFilter address1 = new EndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);
Poznámka:
Je důležité si uvědomit, že část názvu hostitele adresy se může lišit v závislosti na tom, jestli klient používá plně kvalifikovaný název domény, název netBIOS, IP adresu nebo jiný název. Vzhledem k tomu, že odlišné hodnoty můžou odkazovat na stejného hostitele, výchozím chováním tohoto porovnání je nepoužívat část názvu hostitele adresy při provádění shody.
Toto chování lze upravit tak, aby při programové konfiguraci služby směrování umožnilo porovnání vyhodnotit název hostitele.
Tento filtr by se měl použít, když jsou příchozí zprávy adresovány na jedinečnou adresu.
EndpointAddressPrefix
Filtr EndpointAddressPrefix je podobný filtru EndpointAddress. Filtr EndpointAddressPrefix zkontroluje endpointAddress, na které byla zpráva přijata. Filtr EndpointAddressPrefix ale funguje jako zástupný znak odpovídajícími adresami, které začínají hodnotou zadanou v konfiguraci filtru. Následující příklad definuje FilterElement
, který používá endpointAddressPrefix filtr odpovídající všem zprávám adresovaných http://<hostname>/vdir*
.
<filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/vdir" />
PrefixEndpointAddressMessageFilter prefix1 = new PrefixEndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);
Poznámka:
Je důležité si uvědomit, že část názvu hostitele adresy se může lišit v závislosti na tom, jestli klient používá plně kvalifikovaný název domény, název netBIOS, IP adresu nebo jiný název. Vzhledem k tomu, že odlišné hodnoty můžou odkazovat na stejného hostitele, výchozím chováním tohoto porovnání je nepoužívat část názvu hostitele adresy při provádění shody.
Tento filtr by se měl použít při směrování příchozích zpráv, které sdílejí společnou předponu adresy.
A
Filtr AND nefiltruje přímo hodnotu v rámci zprávy, ale umožňuje zkombinovat dva další filtry a vytvořit podmínku AND
, ve které se oba filtry musí shodovat se zprávou, než se filtr AND vyhodnotí jako true
. To vám umožní vytvořit komplexní filtry, které se shodují pouze v případě, že se shodují všechny dílčí filtry. Následující příklad definuje filtr adresy a filtr akce a pak definuje filtr AND, který vyhodnocuje zprávu pro filtry adres i akcí. Pokud se adresa i filtry akcí shodují, vrátí se true
filtr AND .
<filter name="address1" filterType="AddressPrefix" filterData="http://host/vdir"/>
<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/"/>
<filter name="and1" filterType="And" filter1="address1" filter2="action1" />
EndpointAddressMessageFilter address1 = new EndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });
StrictAndMessageFilter and1=new StrictAndMessageFilter(address1, action1);
Tento filtr by se měl použít, když je nutné zkombinovat logiku z více filtrů, abyste zjistili, kdy se má shoda vytvořit. Pokud máte například více cílů, které musí přijímat pouze určité kombinace akcí a zpráv na konkrétní adresy, můžete pomocí filtru AND zkombinovat potřebné filtry akcí a adres.
Vlastní
Při výběru typu vlastního filtru je nutné zadat hodnotu customType, která obsahuje typ sestavení, který obsahuje implementaci MessageFilter , která se má použít pro tento filtr. Kromě toho musí filterData obsahovat všechny hodnoty, které vlastní filtr může vyžadovat při vyhodnocování zpráv. Následující příklad definuje FilterElement
, který používá CustomAssembly.MyCustomMsgFilter
MessageFilter implementace.
<filter name="custom1" filterType="Custom" customType="CustomAssembly.MyCustomMsgFilter, CustomAssembly" filterData="Custom Data" />
MyCustomMsgFilter custom1=new MyCustomMsgFilter("Custom Data");
Pokud potřebujete provést vlastní logiku porovnávání se zprávou, která není pokryta filtry poskytovanými rozhraním .NET Framework 4.6.1, musíte vytvořit vlastní filtr, který je implementací třídy MessageFilter . Můžete například vytvořit vlastní filtr, který porovnává pole v příchozí zprávě se seznamem známých hodnot zadaných filtru jako konfigurace, nebo tím, že zatřidí určitý prvek zprávy a pak tuto hodnotu zkontroluje, zda má filtr vrátit true
nebo false
.
Název koncového bodu
Filtr EndpointName zkontroluje název koncového bodu, který zprávu přijal. Následující příklad definuje FilterElement
, který používá filtr EndpointName ke směrování zpráv přijatých na SvcEndpoint.
<filter name="name1" filterType="Endpoint" filterData="SvcEndpoint" />
EndpointNameMessageFilter name1 = new EndpointNameMessageFilter("SvcEndpoint");
Tento filtr je užitečný, když služba směrování zveřejňuje více než jeden pojmenovaný koncový bod služby. Můžete například zveřejnit dva koncové body, které služba směrování používá k příjmu zpráv; jednu z nich používají zákazníci s prioritou, kteří vyžadují zpracování zpráv v reálném čase, zatímco druhý koncový bod přijímá zprávy, které nejsou citlivé na čas.
I když můžete často použít úplnou shodu adres k určení koncového bodu, na kterém byla zpráva přijata, je místo toho vhodným zástupcem definovaného koncového bodu, který je často méně náchylný k chybám, zejména při konfiguraci služby směrování pomocí konfiguračního souboru (kde názvy koncových bodů jsou povinným atributem).
MatchAll
Filtr MatchAll odpovídá jakékoli přijaté zprávě. Je užitečné, pokud musíte vždy směrovat všechny přijaté zprávy do konkrétního koncového bodu, například do služby protokolování, která ukládá kopii všech přijatých zpráv. Následující příklad definuje FilterElement
, který používá filtr MatchAll.
<filter name="matchAll1" filterType="MatchAll" />
MatchAllMessageFilter matchAll1 = new MatchAllMessageFilter();
XPath
Filtr XPath umožňuje zadat dotaz XPath, který se používá ke kontrole konkrétního prvku ve zprávě. Filtrování XPath je výkonná možnost filtrování, která umožňuje přímo zkontrolovat všechny položky XML adresovatelné ve zprávě; vyžaduje však, abyste měli konkrétní znalosti o struktuře zpráv, které přijímáte. Následující příklad definuje FilterElement
, který používá filtr XPath ke kontrole zprávy pro prvek s názvem "element" v oboru názvů odkazovaném předponou oboru názvů "ns".
<filter name="xpath1" filterType="XPath" filterData="//ns:element" />
XPathMessageFilter xpath1=new XPathMessageFilter("//ns:element");
Tento filtr je užitečný, pokud víte, že zprávy, které dostáváte, obsahují určitou hodnotu. Pokud například hostujete dvě verze stejné služby a víte, že zprávy adresované novější verzi služby obsahují jedinečnou hodnotu ve vlastní hlavičce, můžete vytvořit filtr, který používá XPath k navigaci do této hlavičky, a porovnat hodnotu, která je v hlavičce uvedená v konfiguraci filtru, a zjistit, jestli se filtr shoduje.
Vzhledem k tomu, že dotazy XPath často obsahují jedinečné obory názvů, což jsou často dlouhé nebo složité řetězcové hodnoty, umožňuje filtr XPath použít tabulku oboru názvů k definování jedinečných předpon pro vaše obory názvů. Další informace o tabulce oboru názvů naleznete v tématu Filtry zpráv.
Další informace o návrhu dotazů XPath naleznete v tématu Syntaxe XPath.