Vorgehensweise: Verwenden von FilternHow To: Use Filters

In diesem Thema werden die grundlegenden Schritte beschrieben, die erforderlich sind, um eine Routingkonfiguration mit mehreren Filtern zu erstellen.This topic outlines the basic steps required to create a routing configuration that uses multiple filters. In diesem Beispiel werden Nachrichten an zwei Implementierungen eines Rechnerdiensts weitergeleitet: regularCalc und roundingCalc.In this example, messages are routed to two implementations of a calculator service, regularCalc and roundingCalc. Beide Implementierungen unterstützen die gleichen Vorgänge. Ein Dienst rundet vor der Rückgabe jedoch alle Berechnungen auf den nächsten ganzzahligen Wert.Both implementations support the same operations; however one service rounds all calculations to the nearest integer value before returning. Eine Clientanwendung muss angeben können, ob die Rundungsversion des Diensts verwendet werden soll. Falls kein bevorzugter Dienst angegeben wird, wird für die Nachricht ein Lastenausgleich zwischen beiden Diensten durchgeführt.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. Beide Dienste machen die folgenden Vorgänge verfügbar:The operations exposed by both services are:

  • HinzufügenAdd

  • SubtrahierenSubtract

  • MultiplizierenMultiply

  • TrennenDivide

Da beide Dienste die gleichen Vorgänge implementieren, können Sie den Aktionsfilter nicht verwenden, weil die in der Nachricht angegebene Aktion nicht eindeutig ist.Because both services implement the same operations, you cannot use the Action filter, because the action specified in the message will not be unique. Stattdessen müssen Sie weitere Schritte unternehmen, um sicherzustellen, dass die Nachrichten an die entsprechenden Endpunkte weitergeleitet werden.Instead you must do additional work to ensure that the messages are routed to the appropriate endpoints.

Bestimmen von eindeutigen DatenDetermine Unique Data

  1. Da beide Dienstimplementierungen die gleichen Vorgänge behandeln und bis auf die zurückgegebenen Daten im Wesentlichen identisch sind, sind die Basisdaten von Nachrichten, die aus Clientanwendungen gesendet werden, nicht eindeutig genug, um die Weiterleitung der Anforderung einwandfrei bestimmen zu können.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. Aber wenn die Clientanwendung der Nachricht einen eindeutigen Headerwert hinzufügt, können Sie anhand dieses Werts bestimmen, auf welche Weise die Nachricht weitergeleitet werden soll.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.

    Für dieses Beispiel gilt, dass mit dem folgenden Code ein benutzerdefinierter Header hinzugefügt wird, wenn die Clientanwendung eine Verarbeitung der Nachricht mit dem Rundungsrechner erfordert: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"));  
    

    Sie können Nachrichten für diesen Header jetzt mithilfe des XPath-Filters überprüfen und Nachrichten, die den Header enthalten, an den roundCalc-Dienst weiterleiten.You can now use the XPath filter to inspect messages for this header, and route messages containing the header to the roundCalc service.

  2. Darüber hinaus macht der Routingdienst zwei virtuelle Dienstendpunkte verfügbar, die mit den Filtern EndpointName, EndpointAddress oder PrefixEndpointAddress verwendet werden können. Damit ist das eindeutige Weiterleiten eingehender Nachrichten an eine bestimmte Rechnerimplementierung basierend auf dem Endpunkt erforderlich, an den die Clientanwendung die Anforderung sendet.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.

Definieren von EndpunktenDefine Endpoints

  1. Beim Definieren der vom Routingdienst verwendeten Endpunkte sollten Sie zuerst die Form des Kanals bestimmen, der von den Clients und Diensten verwendet wird.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 diesem Szenario verwenden beide Zieldienste ein Anforderung-Antwort-Muster. Es wird also IRequestReplyRouter verwendet.In this scenario both the destination services use a request-reply pattern, so the IRequestReplyRouter is used. Im folgenden Beispiel werden die vom Routingdienst verfügbar gemachten Dienstendpunkte definiert.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>  
    

    Mit dieser Konfiguration macht der Routingdienst drei separate Endpunkte verfügbar.With this configuration, the Routing Service exposes three separate endpoints. Je nach den ausgewählten Optionen für die Laufzeit sendet die Clientanwendung Nachrichten an eine dieser Adressen.Depending on run-time choices, the client application sends messages to one of these addresses. Nachrichten, die bei einer "virtuellen" Dienstendpunkte ("rounding/Calculator" oder "Regular/Calculator") werden an die entsprechende rechnerimplementierung weitergeleitet.Messages arriving at one of the "virtual" service endpoints ("rounding/calculator" or "regular/calculator") are forwarded to the corresponding calculator implementation. Falls die Clientanwendung die Anforderung nicht an einen bestimmten Endpunkt sendet, wird die Nachricht an den allgemeinen Endpunkt adressiert.If the client application doesn’t send the request to a particular endpoint, the message is addressed to the general endpoint. Unabhängig vom ausgewählten Endpunkt kann sich die Clientanwendung auch für die Einbeziehung des benutzerdefinierten Headers entscheiden, um anzugeben, dass die Nachricht an die Implementierung des Rundungsrechners weitergeleitet werden soll.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. Im folgenden Beispiel werden die Endpunkte des Clients (Zielendpunkte) definiert, an die der Routingdienst Nachrichten weiterleitet.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>  
    

    Mit diesen Endpunkten wird in der Filtertabelle der Zielendpunkt angegeben, an den die Nachricht gesendet wird, wenn sich dafür eine Übereinstimmung mit einem bestimmten Filter ergibt.These endpoints are used in the filter table to indicate the destination endpoint the message is sent to when it matches a specific filter.

Definieren von FilternDefine Filters

  1. Zum Weiterleiten von Nachrichten basierend auf dem "RoundingCalculator" benutzerdefinierte Header, den die Clientanwendung der Nachricht hinzufügt, definieren Sie einen Filter, der mit einer XPath-Abfrage das Vorhandensein dieses Headers.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. Da dieser Header mit einem benutzerdefinierten Namespace definiert wird, müssen Sie auch fügen Sie einen Namespaceeintrag hinzu, der eine benutzerdefinierte Namespacepräfix "Custom" zur Verwendung in der XPath-Abfrage definiert.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. Im folgenden Beispiel werden der erforderliche Routingabschnitt, die Namespacetabelle und der XPath-Filter definiert.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>  
    

    Dies MessageFilter sucht nach einem RoundingCalculator-Header in der Nachricht, die den Wert "rounding" enthält.This MessageFilter looks for a RoundingCalculator header in the message that contains a value of "rounding". Dieser Header wird vom Client festgelegt, um anzugeben, dass die Nachricht an den roundingCalc-Dienst weitergeleitet werden soll.This header is set by the client to indicate that the message should be routed to the roundingCalc service.

    Hinweis

    Das Namespacepräfix s12 wird in der namespacetabelle standardmäßig definiert und steht für den Namespace "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. Sie müssen auch Filter definieren, die nach Nachrichten suchen, die an den beiden virtuellen Endpunkten empfangen werden.You must also define filters that look for messages received on the two virtual endpoints. Der erste virtuelle Endpunkt ist der "Regular/Calculator"-Endpunkt.The first virtual endpoint is the "regular/calculator" endpoint. Der Client kann Anforderungen an diesen Endpunkt senden, um anzugeben, dass die Nachricht an den regularCalc-Dienst weitergeleitet werden soll.The client can send requests to this endpoint to indicate that the message should be routed to the regularCalc service. In der folgenden Konfiguration wird ein Filter definiert, der anhand von EndpointNameMessageFilter bestimmt, ob die Nachricht an einem Endpunkt empfangen wurde, dessen Name unter filterData angegeben ist.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"/>  
    

    Wenn eine Nachricht am Dienstendpunkt mit dem Namen "CalculatorEndpoint" empfangen wird, verwendet dieser Filter ergibt true.If a message is received by the service endpoint named "calculatorEndpoint", this filter evaluates to true.

  3. Definieren Sie als Nächstes einen Filter, der nach Nachrichten sucht, die an die Adresse von roundingEndpoint gesendet werden.Next, define a filter that looks for messages sent to the address of the roundingEndpoint. Der Client kann Anforderungen an diesen Endpunkt senden, um anzugeben, dass die Nachricht an den roundingCalc-Dienst weitergeleitet werden soll.The client can send requests to this endpoint to indicate that the message should be routed to the roundingCalc service. Die folgende Konfiguration definiert einen Filter, der mit der PrefixEndpointAddressMessageFilter zu bestimmen, ob die Nachricht am Endpunkt "rounding/Calculator" empfangen wurde.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/"/>  
    

    Wenn eine Nachricht an einer Adresse empfangen wird, der mit "http://localhost/routingservice/router/rounding/" und dann diesen Filter ergibt "true".If a message is received at an address that begins with "http://localhost/routingservice/router/rounding/" then this filter evaluates to true. Da die von dieser Konfiguration verwendete Basisadresse ist "http://localhost/routingservice/router"und die Adresse für die RoundingEndpoint "rounding/Calculator" wird angegeben, die vollständige Adresse, die zur Kommunikation mit diesem Endpunkt verwendet wird"http://localhost/routingservice/router/rounding/calculator", die dieser Filter entspricht.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.

    Hinweis

    Bei der Ermittlung einer Übereinstimmung wertet der PrefixEndpointAddress-Filter den Hostnamen nicht aus, weil auf einen einzelnen Host mit einer Vielzahl von Hostnamen verwiesen werden kann, die alle zulässige Möglichkeiten zum Verweisen auf den Host aus der Clientanwendung darstellen können.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. Es kann z. B. sein, dass alle unten aufgeführten Adressen auf den gleichen Host verweisen: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. Der abschließende Filter muss das Routing von Nachrichten unterstützen, die ohne den benutzerdefinierten Header am allgemeinen Endpunkt ankommen.The final filter must support the routing of messages that arrive at the general endpoint without the custom header. Für dieses Szenario sollten die Nachrichten zwischen dem regularCalc-Dienst und dem roundingCalc-Dienste wechseln.For this scenario, the messages should alternate between the regularCalc and roundingCalc services. Verwenden Sie einen benutzerdefinierten Filter, der können eine Filterinstanz, die für jede verarbeitete Nachricht übereinstimmen, zur Unterstützung von "Roundrobin"-routing dieser Nachrichten.To support the "round robin" routing of these messages, use a custom filter that allows one filter instance to match for each message processed. Im folgenden Code werden zwei Instanzen von RoundRobinMessageFilter definiert, die gruppiert werden und auf diese Weise angeben, dass dazwischen gewechselt werden soll.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"/>  
    

    Während der Laufzeit wechselt der Filtertyp zwischen allen definierten Filterinstanzen dieses Typs, die als Gruppe in einer Auflistung konfiguriert sind.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. Dies bewirkt, dass von diesem benutzerdefinierten Filter verarbeitete Nachrichten zwischen der Rückgabe von true für RoundRobinFilter1 und RoundRobinFilter2 wechseln.This causes messages processed by this custom filter to alternate between returning true for RoundRobinFilter1 and RoundRobinFilter2.

Definieren von FiltertabellenDefine Filter Tables

  1. Um die Filter bestimmten Clientendpunkten zuzuordnen, müssen Sie diese in eine Filtertabelle einfügen.To associate the filters with specific client endpoints, you must place them within a filter table. In diesem Beispielszenario werden außerdem Filterprioritätseinstellungen verwendet. Dies ist eine optionale Einstellung, mit der Sie die Reihenfolge angeben können, in der Filter verarbeitet werden.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. Falls keine Filterpriorität angegeben wird, werden alle Filter gleichzeitig ausgewertet.If no filter priority is specified, all filters are evaluated simultaneously.

    Hinweis

    Mit der Angabe einer Filterpriorität können Sie zwar die Reihenfolge steuern, in der Filter verarbeitet werden, aber dies kann sich auch negativ auf die Leistung des Routingdiensts auswirken.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. Erstellen Sie die Filterlogik nach Möglichkeit so, dass die Verwendung von Filterprioritäten nicht erforderlich ist.When possible, construct filter logic so that the use of filter priorities is not required.

    Der folgende Code definiert die Filtertabelle und fügt der zuvor in der Tabelle mit einer Priorität von 2 definierten "XPathFilter".The following defines the filter table and adds the "XPathFilter" defined earlier to the table with a priority of 2. Dieser Eintrag gibt auch an, wenn der "XPathFilter" die Nachricht übereinstimmt, wird die Nachricht an die "RoundingCalcEndpoint" weitergeleitetThis 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>  
    

    Beim Angeben einer Filterpriorität werden die Filter mit der höchsten Priorität zuerst ausgewertet.When specifying a filter priority, the highest priority filters are evaluated first. Wenn sich für einen oder mehrere Filter mit einer bestimmten Prioritätsstufen ein Übereinstimmung ergibt, werden keine Filter mit niedrigeren Prioritätsstufen ausgewertet.If one or more filters at a specific priority level match, no filters at lower priority levels will be evaluated. Bei diesem Szenario ist 2 die höchste angegebene Priorität, und dies ist der einzige Filtereintrag auf dieser Stufe.For this scenario, 2 is the highest priority specified and this is the only filter entry at this level.

  2. Filtereinträge wurden definiert, um eine Nachricht darauf zu überprüfen, ob diese an einem bestimmten Endpunkt empfangen wird, indem der Endpunktname oder das Adresspräfix untersucht wird.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. Die folgenden Einträge fügen diese beiden Filtereinträge der Filtertabelle hinzu und ordnen sie den Zielendpunkten zu, an die die Nachricht weitergeleitet wird.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. Für diese Filter ist eine Priorität von 1 festgelegt, um anzugeben, dass sie nur ausgeführt werden sollen, wenn sich für den vorherigen XPath-Filter keine Übereinstimmung mit der Nachricht ergeben hat.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"/>  
    

    Da diese Filter eine Filterpriorität von 1 aufweisen, werden diese nur ausgewertet, wenn sich für den Filter auf der Prioritätsstufe 2 keine Übereinstimmung mit der Nachricht ergeben hat.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. Da beide Filter außerdem die gleiche Prioritätsstufe aufweisen, werden sie gleichzeitig ausgewertet.Also, because both filters have the same priority level they will be evaluated simultaneously. Weil sich beide Filter gegenseitig ausschließen, kann sich nur für einen von beiden eine Übereinstimmung mit der Nachricht ergeben.Because both filters are mutually exclusive, it is possible for only one or the other to match a message.

  3. Falls sich für eine Nachricht keine Übereinstimmung mit den vorherigen Filtern ergibt, wurde die Nachricht über den generischen Dienstendpunkt empfangen und hat keine Headerinformationen enthalten, die das Ziel für die Weiterleitung angeben.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. Diese Nachrichten werden vom benutzerdefinierten Filter behandelt, der dafür den Lastenausgleich zwischen den beiden Rechnerdiensten durchführt.These messages are to be handled by the custom filter, which load balances them between the two calculator services. Im folgenden Beispiel wird veranschaulicht, wie Sie der Filtertabelle die Filtereinträge hinzufügen. Jedem Filter wird einer der beiden Zielendpunkte zugeordnet.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"/>  
    

    Da diese Einträge eine Priorität von 0 angeben, werden sie nur ausgewertet, sofern sich für keinen Filter mit einer höheren Priorität eine Übereinstimmung ergibt.Because these entries specify a priority of 0, they will only be evaluated if no filter of a higher priority matches the message. Da beide außerdem die gleiche Priorität aufweisen, werden sie gleichzeitig ausgewertet.Also, since both are of the same priority, they are evaluated simultaneously.

    Wie bereits erwähnt, wertet der von diesen Filterdefinitionen verwendete benutzerdefinierte Filter für die empfangenen Nachrichten jeweils nur einen Eintrag als true aus.As mentioned previously, the custom filter used by these filter definitions only evaluates one or the other as true for each message received. Da mit diesem Filter nur zwei Filter mit der gleichen angegebenen Gruppeneinstellung definiert werden, führt dies dazu, dass der Routingdienst zwischen dem Senden an regularCalcEndpoint und RoundingCalcEndpoint wechselt.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. Um Nachrichten mithilfe von Filtern auswerten zu können, muss die Filtertabelle den Dienstendpunkten zugeordnet sein, die zum Empfangen von Nachrichten verwendet werden.To evaluate messages against the filters, the filter table must first be associated with the service endpoints that will be used to receive messages. Im folgenden Beispiel wird veranschaulicht, wie Sie die Routingtabelle mithilfe des Routingverhaltens den Dienstendpunkten zuordnen: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>  
    

BeispielExample

Es folgt eine vollständige Auflistung der Konfigurationsdatei.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>  

Siehe auchSee Also

RoutingdiensteRouting Services