Dela via


Meddelandefilter

För att implementera innehållsbaserad routning använder MessageFilter routningstjänsten implementeringar som inspekterar specifika delar av ett meddelande, till exempel adress, slutpunktsnamn eller en specifik XPath-instruktion. Om inget av de meddelandefilter som tillhandahålls med .NET Framework 4.6.1 uppfyller dina behov kan du skapa ett anpassat filter genom att skapa en ny implementering av basklassen MessageFilter .

När du konfigurerar routningstjänsten måste du definiera filterelement (FilterElement objekt) som beskriver typen av MessageFilter och eventuella stöddata som krävs för att skapa filtret, till exempel specifika strängvärden att söka efter i meddelandet. Observera att skapandet av filterelementen endast definierar de enskilda meddelandefiltren. om du vill använda filtren för att utvärdera och dirigera meddelanden måste du också definiera en filtertabell (FilterTableEntryCollection).

Varje post i filtertabellen refererar till ett filterelement och anger klientslutpunkten som ett meddelande ska dirigeras till om meddelandet matchar filtret. Med filtertabellposterna kan du också ange en samling säkerhetskopieringsslutpunkter (BackupEndpointCollection), som definierar en lista över slutpunkter som meddelandet ska överföras till i händelse av ett överföringsfel när det skickas till den primära slutpunkten. Dessa slutpunkter kommer att provas i den ordning som anges tills en lyckas.

Meddelandefilter

Meddelandefiltren som används av routningstjänsten ger vanliga funktioner för val av meddelande, till exempel utvärdering av namnet på slutpunkten som ett meddelande skickades till, SOAP-åtgärden eller adress- eller adressprefixet som meddelandet skickades till. Filter kan också kopplas med ett AND villkor, så att meddelanden endast dirigeras till en slutpunkt om meddelandet matchar båda filtren. Du kan också skapa anpassade filter genom att skapa en egen implementering av MessageFilter.

I följande tabell visas den FilterType som används av routningstjänsten, klassen som implementerar det specifika meddelandefiltret och de obligatoriska FilterData parametrarna.

Filtertyp beskrivning Filtrera data menande Exempelfilter
Åtgärd ActionMessageFilter Använder klassen för att matcha meddelanden som innehåller en specifik åtgärd. Åtgärden att filtrera efter. <filter name="action1" filterType="Action" filterData="http://namespace/contract/operation" />
EndpointAddress EndpointAddressMessageFilter Använder klassen med IncludeHostNameInComparison == true för att matcha meddelanden som innehåller en specifik adress. Adressen som ska filtreras efter (i till-huvudet). <filter name="address1" filterType="EndpointAddress" filterData="http://host/vdir/s.svc/b" />
EndpointAddressPrefix PrefixEndpointAddressMessageFilter Använder klassen med IncludeHostNameInComparison == true för att matcha meddelanden som innehåller ett specifikt adressprefix. Den adress som ska filtreras vid användning av den längsta prefixmatchningen. <filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/" />
och Använder klassen StrictAndMessageFilter som alltid utvärderar båda villkoren innan den returneras. filterData används inte. i stället filter1 och filter2 har namnen på motsvarande meddelandefilter (även i tabellen), som ska vara ANDed tillsammans. <filter name="and1" filterType="And" filter1="address1" filter2="action1" />
Anpassat En användardefinierad typ som utökar MessageFilter klassen och har en konstruktor som tar en sträng. Attributet customType är det fullständigt kvalificerade typnamnet för klassen som ska skapas. filterData är strängen som ska skickas till konstruktorn när filtret skapas. <filter name="custom1" filterType="Custom" customType="CustomAssembly.CustomMsgFilter, CustomAssembly" filterData="Custom Data" />
EndpointName EndpointNameMessageFilter Använder klassen för att matcha meddelanden baserat på namnet på tjänstslutpunkten som de anlände till. Namnet på tjänstslutpunkten, till exempel "serviceEndpoint1". Detta bör vara en av slutpunkterna som exponeras i routningstjänsten. <filter name="stock1" filterType="Endpoint" filterData="SvcEndpoint" />
MatchAll MatchAllMessageFilter Använder klassen. Det här filtret matchar alla ankommande meddelanden. filterData används inte. Det här filtret matchar alltid alla meddelanden. <filter name="matchAll1" filterType="MatchAll" />
Xpath XPathMessageFilter Använder klassen för att matcha specifika XPath-frågor i meddelandet. XPath-frågan som ska användas när meddelanden matchas. <filter name="XPath1" filterType="XPath" filterData="//ns:element" />

I följande exempel definieras filterposter som använder meddelandefiltren XPath, EndpointName och PrefixEndpointAddress. Det här exemplet visar också hur du använder ett anpassat filter för posterna RoundRobinFilter1 och 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>  

Kommentar

Att bara definiera ett filter leder inte till att meddelanden utvärderas mot filtret. Filtret måste läggas till i en filtertabell som sedan associeras med tjänstslutpunkten som exponeras av routningstjänsten.

Namnområdestabell

När du använder ett XPath-filter kan de filterdata som innehåller XPath-frågan bli extremt stora på grund av användningen av namnområden. För att lösa det här problemet ger routningstjänsten möjlighet att definiera dina egna namnområdesprefix med hjälp av namnområdestabellen.

Namnområdestabellen är en samling NamespaceElement objekt som definierar namnområdesprefixen för vanliga namnområden som kan användas i en XPath. Följande är standardnamnområden och namnområdesprefix som finns i namnområdestabellen.

Prefix Namnområde
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

När du vet att du kommer att använda ett specifikt namnområde i dina XPath-frågor kan du lägga till det i namnområdestabellen tillsammans med ett unikt namnområdesprefix och använda prefixet i valfri XPath-fråga i stället för det fullständiga namnområdet. I följande exempel definieras prefixet "custom" för namnområdet "http://my.custom.namespace", som sedan används i XPath-frågan som finns i 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>  

Filtrera tabeller

Varje filterelement definierar en logisk jämförelse som kan tillämpas på ett meddelande, men filtertabellen innehåller associationen mellan filterelementet och målklientslutpunkten. En filtertabell är en namngiven samling FilterTableEntryElement objekt som definierar associationen mellan ett filter, en primär målslutpunkt och en lista över alternativa slutpunkter för säkerhetskopiering. Med filtertabellposterna kan du också ange en valfri prioritet för varje filtervillkor. I följande exempel definieras två filter och sedan definieras en filtertabell som associerar varje filter med en målslutpunkt.

<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>  

Filtrera utvärderingsprioritet

Som standard utvärderas alla poster i filtertabellen samtidigt och meddelandet som utvärderas dirigeras till slutpunkterna som är associerade med varje matchande filterpost. Om flera filter utvärderas till true, och meddelandet är enkelriktat eller duplex, är meddelandet multicast till slutpunkterna för alla matchande filter. Begärandesvarsmeddelanden kan inte vara multicast eftersom endast ett svar kan returneras till klienten.

Mer komplex routningslogik kan implementeras genom att ange prioritetsnivåer för varje filter. Routningstjänsten utvärderar alla filter på den högsta prioritetsnivån först. Om ett meddelande matchar ett filter på den här nivån bearbetas inga filter med lägre prioritet. Till exempel utvärderas ett inkommande enkelriktad meddelande först mot alla filter med prioriteten 2. Meddelandet matchar inte något filter på den här prioritetsnivån, så nästa meddelande jämförs mot filter med prioriteten 1. Två filter med prioritet 1 matchar meddelandet och eftersom det är ett enkelriktat meddelande dirigeras det till båda målslutpunkterna. Eftersom en matchning hittades bland filter för prioritet 1 utvärderas inga filter för prioritet 0.

Kommentar

Om ingen prioritet anges används standardprioriteten 0.

I följande exempel definieras en filtertabell som anger prioriteterna 2, 1 och 0 för filtren som refereras i tabellen.

<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>  

Om ett meddelande i föregående exempel matchar XPathFilter dirigeras det till avrundningspunktenCalcEndpoint och inga ytterligare filter i tabellen utvärderas eftersom alla andra filter har lägre prioritet. Men om meddelandet inte matchar XPathFilter utvärderas det mot alla filter med nästa lägre prioritet, EndpointNameFilter och PrefixAddressFilter.

Kommentar

När det är möjligt använder du exklusiva filter i stället för att ange en prioritet eftersom prioritetsutvärdering kan leda till prestandaförsämring.

Säkerhetskopieringslistor

Varje filter i filtertabellen kan också ange en säkerhetskopieringslista, som är en namngiven samling slutpunkter (BackupEndpointCollection). Den här samlingen innehåller en ordnad lista över slutpunkter som meddelandet ska överföras till i händelse av en CommunicationException när det skickas till den primära slutpunkten som anges i EndpointName. I följande exempel definieras en säkerhetskopieringslista med namnet "backupServiceEndpoints" som innehåller två slutpunkter.

<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>  

Om en sändning till den primära slutpunkten "Destination" misslyckas i föregående exempel försöker routningstjänsten skicka till varje slutpunkt i den sekvens som de visas, först skicka till backupServiceQueue och därefter skicka till alternateServiceQueue om det inte går att skicka till backupServiceQueue. Om alla slutpunkter för säkerhetskopiering misslyckas returneras ett fel.