Procedura: usare i filtriHow To: Use Filters

In questo argomento vengono descritti i passaggi di base necessari per creare una configurazione di routing che usa più filtri.This topic outlines the basic steps required to create a routing configuration that uses multiple filters. In questo esempio, i messaggi vengono indirizzati a due implementazioni di un servizio di calcolo, regularCalc e roundingCalc.In this example, messages are routed to two implementations of a calculator service, regularCalc and roundingCalc. Entrambe le implementazioni supportano le stesse operazioni; tuttavia uno dei servizi arrotonda tutti i calcoli all'integer più vicino prima della restituzione.Both implementations support the same operations; however one service rounds all calculations to the nearest integer value before returning. Un'applicazione client deve essere in grado di indicare se usare la versione del servizio che esegue l'arrotondamento. Se non viene espressa alcuna preferenza in merito al servizio da usare, il carico viene bilanciato tra i due servizi.A client application must be able to indicate whether to use the rounding version of the service; if no service preference is expressed then the message is load balanced between the two services. Le operazioni esposte da entrambi servizi sono:The operations exposed by both services are:

  • AddAdd

  • SubtractSubtract

  • MultiplyMultiply

  • DivideDivide

Poiché entrambi i servizi implementano le stesse operazioni, non è possibile usare il filtro Action, perché l'azione specificata nel messaggio non risulterebbe univoca.Because both services implement the same operations, you cannot use the Action filter, because the action specified in the message will not be unique. È invece necessario eseguire ulteriori attività per accertarsi che i messaggi vengano indirizzati agli endpoint appropriati.Instead you must do additional work to ensure that the messages are routed to the appropriate endpoints.

Determinare dati univociDetermine Unique Data

  1. Poiché entrambe le implementazioni del servizio gestiscono le stesse operazioni e sono essenzialmente identiche tranne che per i dati che restituiscono, i dati di base contenuti nei messaggi inviati dalle applicazioni client non sono sufficientemente univoci per consentire di determinare la modalità di routing della richiesta.Because both service implementations handle the same operations, and are essentially identical other than the data that they return, the base data contained in messages sent from client applications is not unique enough to allow you to determine how to route the request. Se tuttavia l'applicazione client aggiunge un valore di intestazione univoco al messaggio, sarà possibile usare tale valore per determinare la modalità di routing del messaggio.But if the client application adds a unique header value to the message, then you can use this value to determine how the message should be routed.

    Ai fini di questo esempio, se per l'applicazione client è necessario che il messaggio sia elaborato con l'arrotondamento, viene aggiunta un'intestazione personalizzata con il codice seguente:For this example, if the client application needs the message to be processed by the rounding calculator, it adds a custom header by using the following code:

    messageHeadersElement.Add(MessageHeader.CreateHeader("RoundingCalculator",   
                                   "http://my.custom.namespace/", "rounding"));  
    

    È quindi possibile usare il filtro XPath per verificare che i messaggi contengano l'intestazione e indirizzare quelli in cui essa è presente al servizio roundCalc.You can now use the XPath filter to inspect messages for this header, and route messages containing the header to the roundCalc service.

  2. Il servizio di routing espone inoltre due endpoint servizio virtuali che possono essere usati con i filtri EndpointName, EndpointAddress o PrefixEndpointAddress per indirizzare in modo univoco i messaggi in ingresso a un'implementazione specifica del servizio di calcolo in base all'endpoint a cui l'applicazione client invia la richiesta.Additionally the Routing Service exposes two virtual service endpoints that can be used with the EndpointName, EndpointAddress, or PrefixEndpointAddress filters to uniquely route incoming messages to a specific calculator implementation based on the endpoint to which the client application submits the request.

Definire gli endpointDefine Endpoints

  1. Quando si definiscono gli endpoint usati dal servizio di routing, è innanzitutto necessario determinare la forma del canale usato dai client e dai servizi.When defining the endpoints used by the Routing Service, you should first determine the shape of the channel used by your clients and services. In questo scenario entrambi i servizi di destinazione usano un modello di tipo request/reply, pertanto viene usato IRequestReplyRouter.In this scenario both the destination services use a request-reply pattern, so the IRequestReplyRouter is used. Nell'esempio seguente vengono definiti gli endpoint servizio esposti dal servizio di routing.The following example defines the service endpoints exposed by the Routing Service.

    <services>  
          <service behaviorConfiguration="routingConfiguration"  
                   name="System.ServiceModel.Routing.RoutingService">  
            <host>  
              <baseAddresses>  
                <add baseAddress="http://localhost/routingservice/router" />  
              </baseAddresses>  
            </host>  
            <!--Set up the inbound endpoints for the Routing Service-->  
            <!--first create the general router endpoint-->  
            <endpoint address="general"  
                      binding="wsHttpBinding"  
                      name="routerEndpoint"  
                      contract="System.ServiceModel.Routing.IRequestReplyRouter" />  
            <!--create a virtual endpoint for the regular calculator service-->  
            <endpoint address="regular/calculator"  
                      binding="wsHttpBinding"  
                      name="calculatorEndpoint"  
                      contract="System.ServiceModel.Routing.IRequestReplyRouter" />  
            <!--now create a virtual endpoint for the rounding calculator-->  
            <endpoint address="rounding/calculator"  
                      binding="wsHttpBinding"  
                      name="roundingEndpoint"  
                      contract="System.ServiceModel.Routing.IRequestReplyRouter" />  
    
          </service>  
    </services>  
    

    Con questa configurazione, il servizio di routing espone tre endpoint separati.With this configuration, the Routing Service exposes three separate endpoints. A seconda delle scelte di runtime, l'applicazione client invia messaggi a uno di questi indirizzi.Depending on run-time choices, the client application sends messages to one of these addresses. I messaggi che arrivano a uno degli endpoint servizio "virtuali" ("rounding/calculator" o "regular/calculator") vengono inoltrati all'implementazione di calcolatrice corrispondente.Messages arriving at one of the "virtual" service endpoints ("rounding/calculator" or "regular/calculator") are forwarded to the corresponding calculator implementation. Se l'applicazione client non invia la richiesta a un determinato endpoint, il messaggio viene indirizzato all'endpoint generale.If the client application doesn’t send the request to a particular endpoint, the message is addressed to the general endpoint. Indipendentemente dall'endpoint scelto, è inoltre possibile che l'applicazione client scelga di includere l'intestazione personalizzata per indicare che il messaggio deve essere inoltrato all'implementazione del servizio di calcolo che esegue l'arrotondamento.Regardless of the endpoint chosen, the client application may also choose to include the custom header to indicate that the message should be forwarded to the rounding calculator implementation.

  2. Nell'esempio di codice vengono definiti gli endpoint client (destinazione) a cui il servizio di routing indirizza i messaggi.The following example defines the client (destination) endpoints that the Routing Service routes messages to.

    <client>  
          <endpoint name="regularCalcEndpoint"  
                    address="net.tcp://localhost:9090/servicemodelsamples/service/"  
                    binding="netTcpBinding"  
                    contract="*" />  
    
          <endpoint name="roundingCalcEndpoint"  
                    address="net.tcp://localhost:8080/servicemodelsamples/service/"  
                    binding="netTcpBinding"  
                    contract="*" />  
    </client>  
    

    Questi endpoint vengono usati nella tabella dei filtri per indicare l'endpoint di destinazione a cui viene inviato il messaggio quando quest'ultimo corrisponde a uno specifico filtro.These endpoints are used in the filter table to indicate the destination endpoint the message is sent to when it matches a specific filter.

Definire i filtriDefine Filters

  1. Per indirizzare i messaggi in base all'intestazione personalizzata "RoundingCalculator" che l'applicazione client aggiunge al messaggio, definire un filtro che usa una query XPath per verificare la presenza di questa intestazione.To route messages based on the "RoundingCalculator" custom header that the client application adds to the message, define a filter that uses an XPath query to check for the presence of this header. Poiché questa intestazione è definita tramite uno spazio dei nomi personalizzato, aggiungere inoltre una voce dello spazio dei nomi che definisce un prefisso di spazio dei nomi personalizzato "Custom" viene utilizzato nella query XPath.Because this header is defined by using a custom namespace, also add a namespace entry that defines a custom namespace prefix of "custom" that is used in the XPath query. Nell'esempio seguente vengono definiti la sezione di routing, la tabella dello spazio dei nomi e il filtro XPath necessari.The following example defines the necessary routing section, namespace table, and XPath filter.

    <routing>  
          <!-- use the namespace table element to define a prefix for our custom namespace-->  
          <namespaceTable>  
            <add prefix="custom" namespace="http://my.custom.namespace/"/>  
          </namespaceTable>  
          <filters>  
            <!--define the different message filters-->  
            <!--define an xpath message filter to look for the custom header coming from the client-->  
            <filter name="XPathFilter" filterType="XPath"   
                    filterData="/s12:Envelope/s12:Header/custom:RoundingCalculator = 'rounding'"/>  
          </filters>  
    </routing>  
    

    Questo MessageFilter cerca un'intestazione RoundingCalculator nel messaggio che contiene un valore "Rounding".This MessageFilter looks for a RoundingCalculator header in the message that contains a value of "rounding". Questa intestazione viene impostata dal client per indicare che il messaggio deve essere indirizzato al servizio roundingCalc.This header is set by the client to indicate that the message should be routed to the roundingCalc service.

    Nota

    Il prefisso S12 dello è definito per impostazione predefinita nella tabella dello spazio dei nomi e rappresenta lo spazio dei nomi "http://www.w3.org/2003/05/soap-envelope".The s12 namespace prefix is defined by default in the namespace table, and represents the namespace "http://www.w3.org/2003/05/soap-envelope".

  2. È inoltre necessario definire filtri che cercano i messaggi ricevuti nei due endpoint virtuali.You must also define filters that look for messages received on the two virtual endpoints. Il primo endpoint virtuale è l'endpoint "regular/calculator".The first virtual endpoint is the "regular/calculator" endpoint. Il client può inviare richieste all'endpoint per indicare che il messaggio deve essere indirizzato al servizio regularCalc.The client can send requests to this endpoint to indicate that the message should be routed to the regularCalc service. Nella configurazione seguente viene definito un filtro che usa EndpointNameMessageFilter per determinare se il messaggio è arrivato tramite un endpoint con il nome specificato in filterData.The following configuration defines a filter that uses the EndpointNameMessageFilter to determine if the message arrived through an endpoint with the name specified in filterData.

    <!--define an endpoint name filter looking for messages that show up on the virtual regular calculator endpoint-->  
    <filter name="EndpointNameFilter" filterType="EndpointName" filterData="calculatorEndpoint"/>  
    

    Se un messaggio viene ricevuto dall'endpoint del servizio denominata "calculatorEndpoint", questo filtro restituisce true.If a message is received by the service endpoint named "calculatorEndpoint", this filter evaluates to true.

  3. A questo punto, definire un filtro che cerchi i messaggi inviati all'indirizzo di roundingEndpoint.Next, define a filter that looks for messages sent to the address of the roundingEndpoint. Il client può inviare richieste all'endpoint per indicare che il messaggio deve essere indirizzato al servizio roundingCalc.The client can send requests to this endpoint to indicate that the message should be routed to the roundingCalc service. La configurazione seguente definisce un filtro che utilizza il PrefixEndpointAddressMessageFilter per determinare se il messaggio è arrivato all'endpoint "rounding/calculator".The following configuration defines a filter that uses the PrefixEndpointAddressMessageFilter to determine if the message arrived at the "rounding/calculator" endpoint.

    <!--define a filter looking for messages that show up with the address prefix.  The corresponds to the rounding calc virtual endpoint-->  
    <filter name="PrefixAddressFilter" filterType="PrefixEndpointAddress"  
            filterData="http://localhost/routingservice/router/rounding/"/>  
    

    Se viene ricevuto un messaggio a un indirizzo che inizia con "http://localhost/routingservice/router/rounding/", quindi questo filtro restituisce true.If a message is received at an address that begins with "http://localhost/routingservice/router/rounding/" then this filter evaluates to true. Poiché l'indirizzo di base usato da questa configurazione è "http://localhost/routingservice/router"e l'indirizzo specificato per roundingEndpoint è "rounding/calculator", l'indirizzo completo usato per comunicare con questo endpoint è"http://localhost/routingservice/router/rounding/calculator", che corrisponde a questo filtro.Because the base address used by this configuration is "http://localhost/routingservice/router" and the address specified for the roundingEndpoint is "rounding/calculator", the full address used to communicate with this endpoint is "http://localhost/routingservice/router/rounding/calculator", which matches this filter.

    Nota

    Il filtro PrefixEndpointAddress non valuta il nome host in caso di corrispondenza poiché è possibile fare riferimento a un singolo host usando diversi nomi host che potrebbero essere tutti riferimenti validi all'host da parte dell'applicazione client.The PrefixEndpointAddress filter does not evaluate the host name when performing a match, because a single host can be referred to by using a variety of host names that may all be valid ways of referring to the host from the client application. Ad esempio, tutti i valori seguenti possono fare riferimento allo stesso host:For example, all of the following may refer to the same host:

    • localhostlocalhost
      • 127.0.0.1127.0.0.1
      • www.contoso.comwww.contoso.com
      • ContosoWeb01ContosoWeb01
  4. Il filtro finale deve supportare il routing di messaggi che arrivano all'endpoint generale senza l'intestazione personalizzata.The final filter must support the routing of messages that arrive at the general endpoint without the custom header. Per questo scenario, i messaggi devono alternarsi tra i servizi regularCalc e roundingCalc.For this scenario, the messages should alternate between the regularCalc and roundingCalc services. Per supportare il routing "round robin" di questi messaggi, utilizzare un filtro personalizzato che consente a un'istanza del filtro trovare la corrispondenza per ogni messaggio elaborato.To support the "round robin" routing of these messages, use a custom filter that allows one filter instance to match for each message processed. Il codice seguente definisce due istanze di un filtro RoundRobinMessageFilter, le quali vengono raggruppate per indicare che devono alternarsi tra loro.The following defines two instances of a RoundRobinMessageFilter, which are grouped together to indicate that they should alternate between each other.

    <!-- Set up the custom message filters.  In this example,   
         we'll use the example round robin message filter,   
         which alternates between the references-->  
    <filter name="RoundRobinFilter1" filterType="Custom"  
                    customType="CustomFilterAssembly.RoundRobinMessageFilter, CustomFilterAssembly"  
                    filterData="group1"/>  
    <filter name="RoundRobinFilter2" filterType="Custom"  
                    customType="CustomFilterAssembly.RoundRobinMessageFilter, CustomFilterAssembly"  
                    filterData="group1"/>  
    

    Al runtime, questo tipo di filtro alterna tutte le istanze di filtro definite di questo tipo configurate come medesimo gruppo in una raccolta.During run time, this filter type alternates between all defined filter instances of this type that are configured as the same group into one collection. Ciò causa l'elaborazione dei messaggi mediante il filtro personalizzato per alternare la restituzione di true per RoundRobinFilter1 e RoundRobinFilter2.This causes messages processed by this custom filter to alternate between returning true for RoundRobinFilter1 and RoundRobinFilter2.

Definire tabelle dei filtriDefine Filter Tables

  1. Per associare i filtri agli endpoint client specifici, è necessario inserirli in una tabella di filtri.To associate the filters with specific client endpoints, you must place them within a filter table. Questo scenario di esempio usa inoltre impostazioni di priorità dei filtri, ovvero impostazioni facoltative che consentono di indicare l'ordine in cui i filtri vengono elaborati.This example scenario also uses filter priority settings, which is an optional setting that allows you to indicate the order in which filters are processed. Se non viene specificata alcuna priorità per i filtri, questi ultimi vengono tutti elaborati contemporaneamente.If no filter priority is specified, all filters are evaluated simultaneously.

    Nota

    Sebbene l'impostazione di una priorità dei filtri consenta di controllare l'ordine in cui essi vengono elaborati, questa soluzione può influire negativamente sulle prestazioni del servizio di routing.While specifying a filter priority allows you to control the order in which filters are processed, it can adversely affect the performance of the Routing Service. Se possibile, costruire la logica di filtro in modo che non sia necessario assegnare priorità ai filtri.When possible, construct filter logic so that the use of filter priorities is not required.

    Di seguito definisce la tabella dei filtri e aggiunge l'elemento "XPathFilter" definito in precedenza nella tabella con una priorità pari a 2.The following defines the filter table and adds the "XPathFilter" defined earlier to the table with a priority of 2. Questa voce specifica inoltre che, se l'elemento "XPathFilter" corrisponde al messaggio, il messaggio verrà indirizzato a "roundingCalcEndpoint"This entry also specifies that if the "XPathFilter" matches the message, the message will be routed to the "roundingCalcEndpoint"

    <routing>  
    ...      <filters>  
    ...      </filters>  
          <filterTables>  
            <table name="filterTable1">  
              <entries>  
                <!--add the filters to the message filter table-->  
                <!--first look for the custom header, and if we find it,  
                    send the message to the rounding calc endpoint-->  
                <add filterName="XPathFilter" endpointName="roundingCalcEndpoint" priority="2"/>  
              </entries>  
            </table>  
          <filterTables>  
    </routing>  
    

    Quando si imposta una priorità dei filtri, i filtri con priorità massima vengono valutati per primi.When specifying a filter priority, the highest priority filters are evaluated first. Se uno o più filtri a un livello di priorità specifico consentono di rilevare una corrispondenza, i filtri con priorità inferiore non verranno valutati.If one or more filters at a specific priority level match, no filters at lower priority levels will be evaluated. Per questo scenario, 2 è la priorità più elevata specificata e questa è l'unica voce di filtro su questo livello.For this scenario, 2 is the highest priority specified and this is the only filter entry at this level.

  2. Le voci di filtro vengono definite per verificare se un messaggio viene ricevuto su un endpoint specifico controllando il nome dell'endpoint o il prefisso dell'indirizzo.Filter entries were defined to check to see if a message is received on a specific endpoint by inspecting the endpoint name or the address prefix. Le voci seguenti aggiungono entrambe le voci di filtro alla tabella e le associano agli endpoint di destinazione a cui verrà indirizzato il messaggio.The following entries add both of these filter entries to the filter table and associate them with the destination endpoints that the message will be routed to. A questi filtri viene assegnata la priorità 1 per indicare che devono essere eseguiti solo se il filtro XPath precedente non corrisponde al messaggio.These filters are set to a priority of 1 to indicate that they should only run if the previous XPath filter did not match the message.

    <!--if the header wasn't there, send the message based on which virtual endpoint it arrived at-->  
    <!--we determine this through the endpoint name, or through the address prefix-->  
    <add filterName="EndpointNameFilter" endpointName="regularCalcEndpoint" priority="1"/>  
    <add filterName="PrefixAddressFilter" endpointName="roundingCalcEndpoint" priority="1"/>  
    

    Poiché a questi filtri è assegnata la priorità 1, verranno valutati solo se il filtro con livello di priorità 2 non corrisponde al messaggio.Because these filters have a filter priority of 1, they will only be evaluated if the filter at priority level 2 does not match the message. Inoltre, poiché a entrambi i filtri è assegnato lo stesso livello di priorità, essi verranno valutati contemporaneamente.Also, because both filters have the same priority level they will be evaluated simultaneously. Poiché entrambi i filtri sono mutuamente esclusivi, solo uno di essi può corrispondere al messaggio.Because both filters are mutually exclusive, it is possible for only one or the other to match a message.

  3. Se un messaggio non corrisponde ad alcuno dei filtri precedenti, è stato ricevuto tramite l'endpoint servizio generico e non contiene informazioni di intestazione indicanti l'endpoint a cui indirizzarlo.If a message does not match any of the previous filters, then the message was received through the generic service endpoint and contained no header information that indicates where to route it. Questi messaggi devono essere gestiti dal filtro personalizzato che bilancia il carico tra i due servizi di calcolo.These messages are to be handled by the custom filter, which load balances them between the two calculator services. Nell'esempio seguente viene illustrato come aggiungere le voci di filtro alla tabella dei filtri. Ogni filtro è associato a uno dei due endpoint di destinazione.The following example demonstrates how to add the filter entries to the filter table; each filter is associated with one of the two destination endpoints.

    <!--if none of the other filters have matched,   
        this message showed up on the default router endpoint,   
        with no custom header-->  
    <!--round robin these requests between the two services-->  
    <add filterName="RoundRobinFilter1" endpointName="regularCalcEndpoint" priority="0"/>  
    <add filterName="RoundRobinFilter2" endpointName="roundingCalcEndpoint" priority="0"/>  
    

    Poiché per queste voci è specificata una priorità pari a 0, verranno valutate solo se nessun filtro di priorità più elevata corrisponde al messaggio.Because these entries specify a priority of 0, they will only be evaluated if no filter of a higher priority matches the message. Inoltre, poiché a entrambe è assegnata la stessa priorità, verranno valutate contemporaneamente.Also, since both are of the same priority, they are evaluated simultaneously.

    Come indicato in precedenza, il filtro personalizzato usato dalle definizioni di filtro restituisce true per uno o l'altro per ciascun messaggio ricevuto.As mentioned previously, the custom filter used by these filter definitions only evaluates one or the other as true for each message received. Poiché sono definiti solo due filtri con questo filtro, con la stessa impostazione di gruppo, ne consegue che il servizio di routing alterna l'invio a regularCalcEndpoint e RoundingCalcEndpoint.Because only two filters are defined using this filter, with the same specified group setting, the effect is that the Routing Service alternates between sending to the regularCalcEndpoint and the RoundingCalcEndpoint.

  4. Per valutare i messaggi rispetto ai filtri, è prima necessario associare la tabella dei filtri agli endpoint del servizio che verranno usati per ricevere i messaggi.To evaluate messages against the filters, the filter table must first be associated with the service endpoints that will be used to receive messages. Nell'esempio seguente viene illustrato come associare la tabella di routing agli endpoint del servizio mediante il comportamento di routing:The following example demonstrates how to associate the routing table with the service endpoints by using the routing behavior:

    <behaviors>  
      <!--default routing service behavior definition-->  
      <serviceBehaviors>  
        <behavior name="routingConfiguration">  
          <routing filterTableName="filterTable1" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    

EsempioExample

Il codice seguente costituisce un elenco completo del file di configurazione.The following is a complete listing of the configuration file.

<?xml version="1.0" encoding="utf-8" ?>  
<!-- Copyright (c) Microsoft Corporation. All rights reserved -->  
<configuration>  
  <system.serviceModel>  
    <services>  
      <service behaviorConfiguration="routingConfiguration"  
               name="System.ServiceModel.Routing.RoutingService">  
        <host>  
          <baseAddresses>  
            <add baseAddress="http://localhost/routingservice/router" />  
          </baseAddresses>  
        </host>  
        <!--Set up the inbound endpoints for the Routing Service-->  
        <!--first create the general router endpoint-->  
        <endpoint address="general"  
                  binding="wsHttpBinding"  
                  name="routerEndpoint"  
                  contract="System.ServiceModel.Routing.IRequestReplyRouter" />  
        <!--create a virtual endpoint for the regular calculator service-->  
        <endpoint address="regular/calculator"  
                  binding="wsHttpBinding"  
                  name="calculatorEndpoint"  
                  contract="System.ServiceModel.Routing.IRequestReplyRouter" />  
        <!--now create a virtual endpoint for the rounding calculator-->  
        <endpoint address="rounding/calculator"  
                  binding="wsHttpBinding"  
                  name="roundingEndpoint"  
                  contract="System.ServiceModel.Routing.IRequestReplyRouter" />  

      </service>  
    </services>  
    <behaviors>  
      <!--default routing service behavior definition-->  
      <serviceBehaviors>  
        <behavior name="routingConfiguration">  
          <routing filterTableName="filterTable1" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  

    <client>  
<!--set up the destination endpoints-->  
      <endpoint name="regularCalcEndpoint"  
                address="net.tcp://localhost:9090/servicemodelsamples/service/"  
                binding="netTcpBinding"  
                contract="*" />  

      <endpoint name="roundingCalcEndpoint"  
                address="net.tcp://localhost:8080/servicemodelsamples/service/"  
                binding="netTcpBinding"  
                contract="*" />  
    </client>  
    <routing>  
      <!-- use the namespace table element to define a prefix for our custom namespace-->  
      <namespaceTable>  
        <add prefix="custom" namespace="http://my.custom.namespace/"/>  
      </namespaceTable>  
      <filters>  
        <!--define the different message filters-->  
        <!--define an xpath message filter to look for the custom header coming from the client-->  
        <filter name="XPathFilter" filterType="XPath" filterData="/s12:Envelope/s12:Header/custom:RoundingCalculator = 'rounding'"/>  

        <!--define an endpoint name filter looking for messages that show up on the virtual regular calculator endpoint-->  
        <filter name="EndpointNameFilter" filterType="EndpointName" filterData="calculatorEndpoint"/>  

        <!--define a filter looking for messages that show up with the address prefix.  The corresponds to the rounding calc virtual endpoint-->  
        <filter name="PrefixAddressFilter" filterType="PrefixEndpointAddress" filterData="http://localhost/routingservice/router/rounding/"/>  

        <!--Set up the custom message filters.  In this example, we'll use the example round robin message filter, which alternates between the references-->  
        <filter name="RoundRobinFilter1" filterType="Custom" customType="CustomFilterAssembly.RoundRobinMessageFilter, CustomFilterAssembly" filterData="group1"/>  
        <filter name="RoundRobinFilter2" filterType="Custom" customType="CustomFilterAssembly.RoundRobinMessageFilter, CustomFilterAssembly" filterData="group1"/>  
      </filters>  
      <filterTables>  
        <table name="filterTable1">  
          <entries>  
            <!--add the filters to the message filter table-->  
            <!--first look for the custom header, and if we find it, send the message to the rounding calc endpoint-->  
            <add filterName="XPathFilter" endpointName="roundingCalcEndpoint" priority="2"/>  

            <!--if the header wasn't there, send the message based on which virtual endpoint it arrived at-->  
            <!--we determine this through the endpoint name, or through the address prefix-->  
            <add filterName="EndpointNameFilter" endpointName="regularCalcEndpoint" priority="1"/>  
            <add filterName="PrefixAddressFilter" endpointName="roundingCalcEndpoint" priority="1"/>  

            <!--if none of the other filters have matched, this message showed up on the default router endpoint, with no custom header-->  
            <!--round robin these requests between the two services-->  
            <add filterName="RoundRobinFilter1" endpointName="regularCalcEndpoint" priority="0"/>  
            <add filterName="RoundRobinFilter2" endpointName="roundingCalcEndpoint" priority="0"/>  
          </entries>  
        </table>  
      </filterTables>  
    </routing>  
  </system.serviceModel>  
</configuration>  

Vedere ancheSee Also

Servizi di routingRouting Services