Sdílet prostřednictvím


Filtry zpráv

K implementaci směrování založeného na obsahu používá MessageFilter služba směrování implementace, které kontrolují konkrétní části zprávy, jako je adresa, název koncového bodu nebo konkrétní příkaz XPath. Pokud žádný z filtrů zpráv poskytovaných rozhraním .NET Framework 4.6.1 splňuje vaše potřeby, můžete vytvořit vlastní filtr vytvořením nové implementace základní MessageFilter třídy.

Při konfiguraci služby Směrování musíte definovat prvky filtru (FilterElement objekty), které popisují typ MessageFilter a všechna podpůrná data potřebná k vytvoření filtru, například konkrétní řetězcové hodnoty, které se mají vyhledat ve zprávě. Všimněte si, že vytvoření prvků filtru definuje pouze jednotlivé filtry zpráv; pokud chcete použít filtry k vyhodnocení a směrování zpráv, musíte také definovat tabulku filtru (FilterTableEntryCollection).

Každá položka v tabulce filtru odkazuje na prvek filtru a určuje koncový bod klienta, na který se zpráva bude směrovat, pokud zpráva odpovídá filtru. Položky tabulky filtru také umožňují určit kolekci koncových bodů zálohování (BackupEndpointCollection), která definuje seznam koncových bodů, do kterých se zpráva bude přenášet v případě selhání přenosu při odesílání do primárního koncového bodu. Tyto koncové body budou vyzkoušeny v uvedeném pořadí, dokud nebude úspěšný.

Filtry zpráv

Filtry zpráv používané službou směrování poskytují běžné funkce výběru zpráv, například vyhodnocení názvu koncového bodu, na který byla zpráva odeslána, akce SOAP nebo předpona adresy nebo adresy, na kterou byla zpráva odeslána. Filtry lze také spojit s podmínkou AND , aby zprávy byly směrovány pouze do koncového bodu, pokud zpráva odpovídá oběma filtrům. Můžete také vytvořit vlastní filtry vytvořením vlastní implementace MessageFilter.

V následující tabulce jsou FilterType uvedeny hodnoty používané službou Směrování, třída, která implementuje konkrétní filtr zpráv a požadované FilterData parametry.

Typ filtru Popis Filtrování významu dat Příklad filtru
Akce ActionMessageFilter Používá třídu ke shodě zpráv obsahujících určitou akci. Akce, podle které chcete filtrovat. <filter name="action1" filterType="Action" filterData="http://namespace/contract/operation" />
Endpointaddress EndpointAddressMessageFilter Používá třídu s IncludeHostNameInComparison == true cílem spárovat zprávy obsahující konkrétní adresu. Adresa, podle které se má filtrovat (v záhlaví To). <filter name="address1" filterType="EndpointAddress" filterData="http://host/vdir/s.svc/b" />
EndpointAddressPrefix PrefixEndpointAddressMessageFilter Používá třídu s IncludeHostNameInComparison == true cílem spárovat zprávy obsahující konkrétní předponu adresy. Adresa, která se má filtrovat při použití nejdelší shody předpon. <filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/" />
And StrictAndMessageFilter Používá třídu, která před vrácením vždy vyhodnocuje obě podmínky. filterData se nepoužívá; místo toho filtr 1 a filter2 mají názvy odpovídajících filtrů zpráv (také v tabulce), které by měly být vzájemněpropojeny. <filter name="and1" filterType="And" filter1="address1" filter2="action1" />
Vlastní Uživatelem definovaný typ, který rozšiřuje MessageFilter třídu a má konstruktor, který přebírá řetězec. Atribut customType je plně kvalifikovaný název typu třídy, která se má vytvořit; filterData je řetězec, který se má předat konstruktoru při vytváření filtru. <filter name="custom1" filterType="Custom" customType="CustomAssembly.CustomMsgFilter, CustomAssembly" filterData="Custom Data" />
Název koncového bodu EndpointNameMessageFilter Používá třídu ke shodě zpráv na základě názvu koncového bodu služby, na který přišli. Název koncového bodu služby, například serviceEndpoint1. Mělo by to být jeden z koncových bodů vystavených ve službě směrování. <filter name="stock1" filterType="Endpoint" filterData="SvcEndpoint" />
MatchAll MatchAllMessageFilter Používá třídu. Tento filtr odpovídá všem příchozím zprávům. filterData se nepoužívá. Tento filtr bude vždy odpovídat všem zprávům. <filter name="matchAll1" filterType="MatchAll" />
XPath XPathMessageFilter Používá třídu ke shodě konkrétních dotazů XPath v rámci zprávy. Dotaz XPath, který se má použít při porovnávání zpráv. <filter name="XPath1" filterType="XPath" filterData="//ns:element" />

Následující příklad definuje položky filtru, které používají filtry zpráv XPath, EndpointName a PrefixEndpointAddress. Tento příklad také ukazuje použití vlastní filtr pro Položky RoundRobinFilter1 a RoundRobinFilter2.

<filters>  
     <filter name="XPathFilter" filterType="XPath"
             filterData="/s12:Envelope/s12:Header/custom:RoundingCalculator = 1"/>  
     <filter name="EndpointNameFilter" filterType="EndpointName"
             filterData="calculatorEndpoint"/>  
     <filter name="PrefixAddressFilter" filterType="PrefixEndpointAddress"
             filterData="http://localhost/routingservice/router/rounding/"/>  
     <filter name="RoundRobinFilter1" filterType="Custom"
             customType="RoutingServiceFilters.RoundRobinMessageFilter,
             RoutingService" filterData="group1"/>  
     <filter name="RoundRobinFilter2" filterType="Custom"
             customType="RoutingServiceFilters.RoundRobinMessageFilter,
             RoutingService" filterData="group1"/>  
</filters>  

Poznámka:

Pouhé definování filtru nezpůsobí vyhodnocení zpráv vůči filtru. Filtr se musí přidat do tabulky filtru, která je pak přidružená ke koncovému bodu služby vystavené službou Směrování.

Tabulka oborů názvů

Při použití filtru XPath mohou být data filtru obsahující dotaz XPath extrémně velká kvůli použití oborů názvů. Chcete-li tento problém zmírnit, služba Směrování poskytuje možnost definovat vlastní předpony oboru názvů pomocí tabulky oboru názvů.

Tabulka oboru názvů je kolekce NamespaceElement objektů, které definují předpony oboru názvů pro běžné obory názvů, které lze použít v XPathu. Následují výchozí obory názvů a předpony oboru názvů obsažené v tabulce oboru názvů.

Předpona Obor názvů
S11 http://schemas.xmlsoap.org/soap/envelope
s12 http://www.w3.org/2003/05/soap-envelope
wsaAugust2004 http://schemas.xmlsoap.org/ws/2004/08/addressing
wsa10 http://www.w3.org/2005/08/addressing
sm http://schemas.microsoft.com/serviceModel/2004/05/xpathfunctions
tempuri http://tempuri.org
Ser http://schemas.microsoft.com/2003/10/Serialization

Pokud víte, že budete v dotazech XPath používat konkrétní obor názvů, můžete ho přidat do tabulky oboru názvů spolu s jedinečnou předponou oboru názvů a místo úplného oboru názvů použít předponu v libovolném dotazu XPath. Následující příklad definuje předponu "custom" pro obor názvů "http://my.custom.namespace", který se pak použije v dotazu XPath obsažené v filterData.

<namespaceTable>  
     <add prefix="custom" namespace="http://my.custom.namespace/"/>  
</namespaceTable>  
<filters>  
     <filter name="XPathFilter" filterType="XPath" filterData="/s12:Envelope/s12:Header/custom:RoundingCalculator = 1"/>  
</filters>  

Filtrování tabulek

Zatímco každý prvek filtru definuje logické porovnání, které lze použít u zprávy, tabulka filtru poskytuje přidružení mezi elementem filtru a cílovým koncovým bodem klienta. Tabulka filtrů je pojmenovaná kolekce FilterTableEntryElement objektů, které definují přidružení mezi filtrem, primárním cílovým koncovým bodem a seznamem alternativních koncových bodů zálohování. Položky tabulky filtru také umožňují zadat volitelnou prioritu pro každou podmínku filtru. Následující příklad definuje dva filtry a pak definuje tabulku filtru, která přidruží každý filtr k cílovému koncovému bodu.

<routing>  
     <filters>  
       <filter name="AddAction" filterType="Action" filterData="Add" />  
       <filter name="SubtractAction" filterType="Action" filterData="Subtract" />  
     </filters>  
     <filterTables>  
       <table name="routingTable1">  
         <filters>  
           <add filterName="AddAction" endpointName="Addition" />  
           <add filterName="SubtractAction" endpointName="Subtraction" />  
         </filters>  
       </table>  
     </filterTables>
</routing>  

Priorita vyhodnocení filtru

Ve výchozím nastavení se všechny položky v tabulce filtru vyhodnocují současně a zpráva, která se vyhodnocuje, se směruje do koncových bodů přidružených ke každé odpovídající položce filtru. Pokud se vyhodnotí truevíce filtrů a zpráva je jednosměrná nebo duplexní, zpráva je vícesměrové vysílání do koncových bodů pro všechny odpovídající filtry. Zprávy odpovědi na žádosti nemohou být vícesměrové, protože klientovi lze vrátit pouze jednu odpověď.

Složitější logiku směrování je možné implementovat zadáním úrovní priority pro každý filtr; Služba směrování nejprve vyhodnocuje všechny filtry na nejvyšší úrovni priority. Pokud zpráva odpovídá filtru této úrovně, nezpracují se žádné filtry s nižší prioritou. Například příchozí jednosměrná zpráva se nejprve vyhodnotí pro všechny filtry s prioritou 2. Zpráva neodpovídá žádnému filtru na této úrovni priority, takže další zpráva se porovná s filtry s prioritou 1. Dvě filtry priority 1 odpovídají zprávě, a protože se jedná o jednosměrnou zprávu, která se směruje do obou cílových koncových bodů. Vzhledem k tomu, že byla nalezena shoda mezi filtry priority 1, nevyhodnocují se žádné filtry priority 0.

Poznámka:

Pokud není zadána žádná priorita, použije se výchozí priorita 0.

Následující příklad definuje tabulku filtru, která určuje priority 2, 1 a 0 pro filtry odkazované v tabulce.

<filterTables>  
     <filterTable name="filterTable1">  
          <add filterName="XPathFilter" endpointName="roundingCalcEndpoint"
               priority="2"/>  
          <add filterName="EndpointNameFilter" endpointName="regularCalcEndpoint"
               priority="1"/>  
          <add filterName="PrefixAddressFilter" endpointName="roundingCalcEndpoint"
               priority="1"/>  
          <add filterName="MatchAllMessageFilter" endpointName="defaultCalcEndpoint"
               priority="0"/>  
     </filterTable>  
</filterTables>  

V předchozím příkladu, pokud zpráva odpovídá XPathFilter, bude směrována na zaokrouhlovacíCalcEndpoint a nebudou vyhodnoceny žádné další filtry v tabulce, protože všechny ostatní filtry mají nižší prioritu. Pokud se však zpráva neshoduje s XPathFilter, vyhodnotí se ve všech filtrech s další nižší prioritou, EndpointNameFilter a PrefixAddressFilter.

Poznámka:

Pokud je to možné, místo určení priority použijte výhradní filtry, protože vyhodnocení priority může vést ke snížení výkonu.

Seznamy záloh

Každý filtr v tabulce filtru může volitelně zadat seznam záloh, což je pojmenovaná kolekce koncových bodů (BackupEndpointCollection). Tato kolekce obsahuje seřazený seznam koncových bodů, na které se zpráva přenese v případě odeslání do primárního koncového CommunicationException bodu zadaného v EndpointName. Následující příklad definuje seznam záloh s názvem backupServiceEndpoints, který obsahuje dva koncové body.

<filterTables>  
     <filterTable name="filterTable1">  
          <add filterName="MatchAllFilter1" endpointName="Destination" backupList="backupEndpointList"/>  
     </filterTable>  
</filterTables>  
<backupLists>  
     <backupList name="backupEndpointList">  
          <add endpointName="backupServiceQueue" />  
          <add endpointName="alternateServiceQueue" />  
     </backupList>  
</backupLists>  

Pokud v předchozím příkladu selže odeslání do primárního koncového bodu Cíl, služba směrování se pokusí odeslat do každého koncového bodu v pořadí, ve kterém jsou uvedeny, nejprve odešle do služby backupServiceQueue a následně odešle do alternativní službyServiceQueue, pokud odeslání do služby backupServiceQueue selže. Pokud všechny koncové body zálohování selžou, vrátí se chyba.