Einführung in das RoutingRouting Introduction

Der Routingdienst stellt einen generischen austauschbaren SOAP-Vermittler bereit, der Nachrichten basierend auf dem Nachrichteninhalts weiterleiten kann.The Routing Service provides a generic pluggable SOAP intermediary that is capable of routing messages based on message content. Mit dem Routingdienst können Sie eine komplexe Routinglogik erstellen, mit der Sie Szenarios wie Dienstaggregation, Dienstversionsverwaltung, Prioritätsrouting und Multicastrouting implementieren können.With the Routing Service, you can create complex routing logic that allows you to implement scenarios such as service aggregation, service versioning, priority routing, and multicast routing. Außerdem stellt der Routingdienst eine Fehlerbehandlung bereit. Damit können Sie Listen von Sicherungsendpunkten einrichten, an die Nachrichten gesendet werden, falls beim Senden an den primären Zielendpunkt ein Fehler auftritt.The Routing Service also provides error handling that allows you to set up lists of backup endpoints, to which messages are sent if a failure occurs when sending to the primary destination endpoint.

Dieses Thema richtet sich an Personen, die mit dem Routingdienst noch nicht vertraut sind, und behandelt die grundlegende Konfiguration und das Hosten des Routingdiensts.This topic is intended for those new to the Routing Service and covers basic configuration and hosting of the Routing Service.

KonfigurationConfiguration

Der Routingdienst wird als WCF-Dienst implementiert, der einen oder mehrere Dienstendpunkte verfügbar macht, die Nachrichten von Clientanwendungen empfangen und die Nachrichten an einen oder mehrere Zielendpunkte weiterleiten.The Routing Service is implemented as a WCF service that exposes one or more service endpoints that receive messages from client applications and route the messages to one or more destination endpoints. Der Dienst stellt ein RoutingBehavior-Objekt bereit, das auf die vom Dienst verfügbar gemachten Dienstendpunkte angewendet wird.The service provides a RoutingBehavior, which is applied to the service endpoints exposed by the service. Dieses Verhalten wird verwendet, um verschiedene Aspekte in Bezug auf die Funktionsweise des Diensts zu konfigurieren.This behavior is used to configure various aspects of how the service operates. Zur Vereinfachung der Konfiguration bei der Verwendung einer Konfigurationsdatei, die Parameter angegeben werden, auf die RoutingBehavior.For ease of configuration when using a configuration file, the parameters are specified on the RoutingBehavior. In codebasierten Szenarien würde diese Parameter angegeben werden als Teil einer RoutingConfiguration -Objekt, das dann für übergeben werden, kann eine RoutingBehavior.In code-based scenarios, these parameters would be specified as part of a RoutingConfiguration object, which can then be passed to a RoutingBehavior.

Beim Starten fügt dieses Verhalten den Clientendpunkten das SoapProcessingBehavior hinzu. Dieses Verhalten wird für die SOAP-Verarbeitung von Nachrichten verwendet.When starting, this behavior adds the SoapProcessingBehavior, which is used to perform SOAP processing of messages, to the client endpoints. Dadurch wird der Routingdienst Nachrichten an Endpunkte übertragen werden, die eine andere erfordern MessageVersion als der Endpunkt, der über die Nachricht empfangen wurde.This allows the Routing Service to transmit messages to endpoints that require a different MessageVersion than the endpoint the message was received over. Die RoutingBehavior registriert auch eine diensterweiterung, die RoutingExtension, die einen Zugangspunkt zum Ändern der routingdienstkonfiguration zur Laufzeit.The RoutingBehavior also registers a service extension, the RoutingExtension, which provides an accessibility point for modifying the Routing Service configuration at run time.

Die RoutingConfiguration -Klasse bietet eine einheitliche Möglichkeit zum Konfigurieren und aktualisieren die Konfiguration des Routingdiensts.The RoutingConfiguration class provides a consistent means of configuring and updating the configuration of the Routing Service. Sie enthält Parameter, die als die Einstellungen für den Routingdienst fungieren und dient zum Konfigurieren der RoutingBehavior beim Starten des Diensts oder übergeben wird, um die RoutingExtension routing ändern die Konfiguration zur Laufzeit.It contains parameters that act as the settings for the Routing Service and is used to configure the RoutingBehavior when the service starts, or is passed to the RoutingExtension to modify routing configuration at run time.

Die Routinglogik, mit der das inhaltsbasierte Routing von Nachrichten durchgeführt wird, wird definiert, indem mehrere MessageFilter-Objekte zu Filtertabellen (MessageFilterTable<TFilterData>-Objekten) gruppiert werden.The routing logic used to perform content-based routing of messages is defined by grouping multiple MessageFilter objects together into filter tables (MessageFilterTable<TFilterData> objects). Eingehende Nachrichten werden anhand der in der Filtertabelle vorhanden und für jeden enthaltenen Nachrichtenfilter ausgewertet MessageFilter , entspricht die Nachricht an einen Zielendpunkt weitergeleitet.Incoming messages are evaluated against the message filters contained in the filter table, and for each MessageFilter that matches the message, forwarded to a destination endpoint. Die Filtertabelle, die zum Weiterleiten von Nachrichten verwendet werden soll wird angegeben, indem Sie entweder die RoutingBehavior in der Konfiguration oder per Code mit der RoutingConfiguration Objekt.The filter table that should be used to route messages is specified by using either the RoutingBehavior in configuration or through code by using the RoutingConfiguration object.

Definieren von EndpunktenDefining Endpoints

Es scheint so zu sein, als ob Sie die Konfiguration beginnen sollten, indem Sie die zu verwendende Routinglogik definieren. Stattdessen sollte der erste Schritt darin bestehen, die Form der Endpunkte zu ermitteln, an die Sie Nachrichten weiterleiten möchten.While it may seem that you should start your configuration by defining the routing logic you will use, your first step should actually be to determine the shape of the endpoints you will be routing messages to. Der Routingdienst verwendet Verträge, die die Form der Kanäle definieren, die zum Empfangen und Senden von Nachrichten verwendet werden. Aus diesem Grund muss die Form des Eingabekanals mit der Form des Ausgabekanals übereinstimmen.The Routing Service uses contracts that define the shape of the channels used to receive and send messages, and therefore the shape of the input channel must match that of the output channel. Wenn Sie die Weiterleitung z. B. an Endpunkte durchführen, die die Anforderung-Antwort-Kanalform verwenden, müssen Sie an den Eingangsendpunkten einen kompatiblen Vertrag verwenden, z. B. IRequestReplyRouter.For example, if you are routing to endpoints that use the request-reply channel shape, then you must use a compatible contract on the inbound endpoints, such as the IRequestReplyRouter.

Wenn die Zielendpunkte Verträge mit mehreren Kommunikationsmustern verwenden (z. B. eine Mischung aus unidirektionalen und bidirektionalen Vorgängen), können Sie also keinen einzelnen Dienstendpunkt erstellen, der Nachrichten empfängt und an all diese Zielendpunkte weiterleitet.This means that if your destination endpoints use contracts with multiple communication patterns (such as mixing one-way and two-way operations,) you cannot create a single service endpoint that can receive and route messages to all of them. Sie müssen bestimmen, welche Endpunkte über kompatible Formen verfügen, und einen oder mehrere Dienstendpunkte definieren, an denen die Nachrichten empfangen werden, die an die Zielendpunkten weitergeleitet werden sollen.You must determine which endpoints have compatible shapes and define one or more service endpoints that will be used to receive messages to be routed to the destination endpoints.

Hinweis

Beim Arbeiten mit Verträgen, die mehrere Kommunikationsmuster angeben (z. B. eine Mischung aus unidirektionalen und bidirektionalen Vorgängen), besteht eine Problemumgehung in der Verwendung eines Duplexvertrags für den Routingdienst, z. B. IDuplexSessionRouter.When working with contracts that specify multiple communication patterns (such as a mix of one-way and two-way operations,) a workaround is to use a duplex contract at the Routing Service such as IDuplexSessionRouter. Dies bedeutet jedoch, dass die Bindung für die Duplexkommunikation geeignet sein muss, was ggf. nicht für alle Szenarios der Fall ist.However this means that the binding must be capable of duplex communication, which may not be possible for all scenarios. In Szenarios, in denen dies nicht möglich ist, kann das Verteilen der Kommunikation auf mehrere Endpunkte oder das Ändern der Anwendung erforderlich sein.In scenarios where this is not possible, factoring the communication into multiple endpoints or modifying the application may be necessary.

Weitere Informationen zu routingverträge, finden Sie unter Routingverträge.For more information about routing contracts, see Routing Contracts.

Nachdem der Dienstendpunkt definiert wurde, können Sie die RoutingBehavior zuordnen einen bestimmten RoutingConfiguration mit dem Endpunkt.After the service endpoint is defined, you can use the RoutingBehavior to associate a specific RoutingConfiguration with the endpoint. Beim Konfigurieren des Routingdiensts mithilfe einer Konfigurationsdatei angegeben und die RoutingBehavior wird verwendet, um die Filtertabelle angeben, die die Routinglogik zum Verarbeiten von Nachrichten, die an diesem Endpunkt empfangen enthält.When configuring the Routing Service by using a configuration file, the RoutingBehavior is used to specify the filter table that contains the routing logic used to process messages received on this endpoint. Wenn Sie den Routingdienst programmgesteuert konfigurieren können Sie die Filtertabelle angeben, mit der RoutingConfiguration.If you are configuring the Routing Service programmatically you can specify the filter table by using the RoutingConfiguration.

Im folgenden Beispiel werden die Dienst- und Clientendpunkte, die vom Routingdienst verwendet werden, sowohl programmgesteuert als auch unter Verwendung einer Konfigurationsdatei definiert.The following example defines the service and client endpoints that are used by the Routing Service both programmatically and by using a configuration file.

    <services>  
      <!--ROUTING SERVICE -->  
      <service behaviorConfiguration="routingData"  
               name="System.ServiceModel.Routing.RoutingService">  
        <host>  
          <baseAddresses>  
            <add baseAddress="http://localhost:8000/routingservice/router"/>  
          </baseAddresses>  
        </host>  
        <!-- Define the service endpoints that are receive messages -->  
        <endpoint address=""  
                  binding="wsHttpBinding"  
                  name="reqReplyEndpoint"  
                  contract="System.ServiceModel.Routing.IRequestReplyRouter" />      
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="routingData">  
          <serviceMetadata httpGetEnabled="True"/>  
          <!-- Add the RoutingBehavior and specify the Routing Table to use -->  
          <routing filterTableName="routingTable1" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    <client>  
    <!-- Define the client endpoint(s) to route messages to -->  
      <endpoint name="CalculatorService"  
                address="http://localhost:8000/servicemodelsamples/service"  
                binding="wsHttpBinding" contract="*" />  
    </client>  
//set up some communication defaults  
string clientAddress = "http://localhost:8000/servicemodelsamples/service";  
string routerAddress = "http://localhost:8000/routingservice/router";  
Binding routerBinding = new WSHttpBinding();  
Binding clientBinding = new WSHttpBinding();  
//add the endpoint the router uses to receive messages  
serviceHost.AddServiceEndpoint(  
     typeof(IRequestReplyRouter),   
     routerBinding,   
     routerAddress);  
//create the client endpoint the router routes messages to  
ContractDescription contract = ContractDescription.GetContract(  
     typeof(IRequestReplyRouter));  
ServiceEndpoint client = new ServiceEndpoint(  
     contract,   
     clientBinding,   
     new EndpointAddress(clientAddress));  
//create a new routing configuration object  
RoutingConfiguration rc = new RoutingConfiguration();  
….  
rc.FilterTable.Add(new MatchAllMessageFilter(), endpointList);  
//attach the behavior to the service host  
serviceHost.Description.Behaviors.Add(  
     new RoutingBehavior(rc));  

In diesem Beispiel wird der Routingdienst, um einen einzigen Endpunkt mit der Adresse verfügbar zu machen "http://localhost:8000/routingservice/router", die zum Empfangen von Nachrichten weitergeleitet werden.This example configures the Routing Service to expose a single endpoint with an address of "http://localhost:8000/routingservice/router", which is used to receive messages to be routed. Da die Nachrichten an die Anforderung-Antwort-Endpunkte weitergeleitet werden, verwendet der Dienstendpunkt den IRequestReplyRouter-Vertrag.Because the messages are routed to request-reply endpoints, the service endpoint uses the IRequestReplyRouter contract. Diese Konfiguration definiert auch einen einzelnen Clientendpunkt "http://localhost:8000/servicemodelsample/service", dass die Nachrichten weitergeleitet werden.This configuration also defines a single client endpoint of "http://localhost:8000/servicemodelsample/service" that messages are routed to. Der Filtertabelle vorhanden (nicht dargestellt) mit dem Namen "routingTable1" enthält die Routinglogik zum Weiterleiten von Nachrichten und bezieht sich auf den Dienstendpunkt mithilfe der RoutingBehavior (nach einer Konfigurationsdatei) oder RoutingConfiguration (für programmgesteuerte Konfiguration).The filter table (not shown) named "routingTable1" contains the routing logic used to route messages, and is associated with the service endpoint by using the RoutingBehavior (for a configuration file) or RoutingConfiguration (for programmatic configuration).

RoutinglogikRouting Logic

Um die Routinglogik zum Weiterleiten von Nachrichten zu definieren, müssen Sie ermitteln, welche in den eingehenden Nachrichten enthaltenen Daten eindeutig verarbeitet werden können.To define the routing logic used to route messages, you must determine what data contained within the incoming messages can be uniquely acted upon. Wenn beispielsweise alle Zielendpunkte der Weiterleitung die gleichen SOAP-Aktionen verwenden, ist der Wert von "Action" innerhalb der Nachricht kein guter Indikator dafür, an welchen Endpunkt die Nachricht jeweils genau weitergeleitet werden soll.For example, if all the destination endpoints you are routing to share the same SOAP Actions, the value of the Action contained within the message is not a good indicator of which specific endpoint the message should be routed to. Falls Sie Nachrichten nur an einen bestimmten Endpunkt weiterleiten müssen, sollten Sie nach Daten filtern, die den Zielendpunkt eindeutig identifizieren, an den die Nachricht weitergeleitet wird.If you must uniquely route messages to one specific endpoint, you should filter upon data that uniquely identifies the destination endpoint that the message is routed to.

Der Routingdienst stellt mehrere MessageFilter Implementierungen, die bestimmte Werte innerhalb der Nachricht, z. B. die Adresse, Aktion, Endpunktname oder sogar eine XPath-Abfrage zu überprüfen.The Routing Service provides several MessageFilter implementations that inspect specific values within the message, such as the address, action, endpoint name, or even an XPath query. Wenn keine dieser Implementierungen Ihre Anforderungen erfüllt erstellen Sie eine benutzerdefinierte MessageFilter Implementierung.If none of these implementations meet your needs you can create a custom MessageFilter implementation. Weitere Informationen zu Nachrichtenfilter und einen Vergleich der vom Routingdienst verwendeten Implementierungen, finden Sie unter Nachrichtenfilter und Auswählen eines Filters.For more information about message filters and a comparison of the implementations used by the Routing Service, see Message Filters and Choosing a Filter.

Mehrere Nachrichtenfilter werden zusammen in Filtertabellen, mit denen jedem organisiert MessageFilter ein Zielendpunkt zugeordnet.Multiple message filters are organized together into filter tables, which associate each MessageFilter with a destination endpoint. Optional kann die Filtertabelle auch verwendet werden, um auch eine Liste mit Sicherungsendpunkten anzugeben. Der Routingdienst versucht dann, die Nachricht bei einem Übertragungsfehler an diese Endpunkte zu senden.Optionally, the filter table can also be used to specify a list of back-up endpoints that the Routing Service will attempt to send the message to in the event of a transmission failure.

Standardmäßig werden alle Nachrichtenfilter einer Filtertabelle gleichzeitig ausgewertet. Sie können jedoch eine Priority-Eigenschaft angeben, die bewirkt, dass die Nachrichtenfilter in einer bestimmten Reihenfolge ausgewertet werden.By default all message filters within a filter table are evaluated simultaneously; however, you can specify a Priority that causes the message filters to be evaluated in a specific order. Alle Einträge mit der höchsten Priorität werden zuerst ausgewertet, und Nachrichtenfilter mit niedrigeren Prioritäten werden nicht ausgewertet, wenn eine Übereinstimmung mit einer höheren Prioritätsstufe gefunden wird.All entries with the highest priority are evaluated first, and message filters of lower priorities are not evaluated if a match is found at a higher priority level. Weitere Informationen zu Filtertabellen, finden Sie unter Nachrichtenfilter.For more information about filter tables, see Message Filters.

In den folgenden Beispielen wird das MatchAllMessageFilter-Objekt verwendet, das für alle Nachrichten true ergibt.The following examples use the MatchAllMessageFilter, which evaluates to true for all messages. Dies MessageFilter wird hinzugefügt, der Filtertabelle "routingTable1", die verknüpft die MessageFilter mit dem Clientendpunkt mit dem Namen "CalculatorService".This MessageFilter is added to the "routingTable1" filter table, which associates the MessageFilter with the client endpoint named "CalculatorService". Die RoutingBehavior dann gibt an, dass diese Tabelle zum Weiterleiten von Nachrichten verarbeitet, die vom Dienstendpunkt verwendet werden soll.The RoutingBehavior then specifies that this table should be used to route messages processed by the service endpoint.

<behaviors>  
  <serviceBehaviors>  
    <behavior name="routingData">  
      <serviceMetadata httpGetEnabled="True"/>  
      <!-- Add the RoutingBehavior and specify the Routing Table to use -->  
      <routing filterTableName="routingTable1" />  
    </behavior>  
  </serviceBehaviors>  
</behaviors>  
<!--ROUTING SECTION -->  
<routing>  
  <filters>  
    <filter name="MatchAllFilter1" filterType="MatchAll" />  
  </filters>  
  <filterTables>  
    <table name="routingTable1">  
      <filters>  
        <add filterName="MatchAllFilter1" endpointName="CalculatorService" />  
      </filters>  
    </table>  
  </filterTables>  
</routing>  
//create a new routing configuration object  
RoutingConfiguration rc = new RoutingConfiguration();  
//create the endpoint list that contains the endpoints to route to  
//in this case we have only one  
List<ServiceEndpoint> endpointList = new List<ServiceEndpoint>();  
endpointList.Add(client);  
//add a MatchAll filter to the Router's filter table  
//map it to the endpoint list defined earlier  
//when a message matches this filter, it is sent to the endpoint contained in the list  
rc.FilterTable.Add(new MatchAllMessageFilter(), endpointList);  

Hinweis

Standardmäßig wertet der Routingdienst nur die Header der Nachricht aus.By default, the Routing Service only evaluates the headers of the message. Um den Filtern den Zugriff auf den Text der Nachricht zu ermöglichen, müssen Sie RouteOnHeadersOnly auf false festlegen.To allow the filters to access the message body, you must set RouteOnHeadersOnly to false.

MulticastMulticast

Viele Routingdienstkonfigurationen verwenden zwar eine exklusive Filterlogik, die Nachrichten an nur einen bestimmten Endpunkt weiterleitet, aber es kann erforderlich sein, dass Sie eine bestimmte Nachricht an mehrere Zielendpunkte weiterleiten müssen.While many Routing Service configurations use exclusive filter logic that routes messages to only one specific endpoint, you may need to route a given message to multiple destination endpoints. Um für eine Nachricht per Multicast an mehrere Ziele zu senden, müssen die folgenden Bedingungen erfüllt sein:To multicast a message to multiple destinations, the following conditions must be true:

  • Die Kanalform darf nicht vom Typ "Anforderung-Antwort" sein (unidirektional oder duplex ist jedoch möglich), weil die Clientanwendung als Antwort auf die Anforderung nur eine Antwort empfangen kann.The channel shape must not be request-reply (though may be one-way or duplex,) because only one reply can be received by the client application in response to the request.

  • Mehrere Filter müssen beim Auswerten der Nachricht true zurückgeben.Multiple filters must return true when evaluating the message.

Falls diese Bedingungen erfüllt sind, wird die Nachricht an alle Endpunkte aller Filter weitergeleitet, für die die Auswertung true ergibt.If these conditions are met, the message is routed to all endpoints of all filters that evaluate to true. Das folgende Beispiel definiert eine Routingkonfiguration beschrieben, das Nachrichten an beide Endpunkte weitergeleitet werden, wenn die Endpunktadresse in der Nachricht ist dazu http://localhost:8000/routingservice/router/rounding.The following example defines a routing configuration that results in messages being routed to both endpoints if the endpoint address in the message is http://localhost:8000/routingservice/router/rounding.

<!--ROUTING SECTION -->  
<routing>  
  <filters>  
    <filter name="MatchAllFilter1" filterType="MatchAll" />  
    <filter name="RoundingFilter1" filterType="EndpointAddress"  
            filterData="http://localhost:8000/routingservice/router/rounding" />  
  </filters>  
  <filterTables>  
    <table name="routingTable1">  
      <filters>  
        <add filterName="MatchAllFilter1" endpointName="CalculatorService" />  
        <add filterName="RoundingFilter1" endpointName="RoundingCalcService" />  
      </filters>  
    </table>  
  </filterTables>  
</routing>  
rc.FilterTable.Add(new MatchAllMessageFilter(), calculatorEndpointList);  
rc.FilterTable.Add(new EndpointAddressMessageFilter(new EndpointAddress(  
    "http://localhost:8000/routingservice/router/rounding")),  
    roundingCalcEndpointList);  

SOAP-VerarbeitungSOAP Processing

Um das routing von Nachrichten zwischen unterschiedlichen Protokollen zu unterstützen die RoutingBehavior Standardmäßig fügt der SoapProcessingBehavior auf allen Clientendpunkten, die Nachrichten weitergeleitet werden.To support the routing of messages between dissimilar protocols, the RoutingBehavior by default adds the SoapProcessingBehavior to all client endpoint(s) that messages are routed to. Dieses Verhalten erstellt automatisch eine neue MessageVersion vor der Weiterleitung der Nachricht an den Endpunkt sowie eine kompatible MessageVersion für Antwortdokumente vor der Rückgabe an die anfordernde Clientanwendung.This behavior automatically creates a new MessageVersion before routing the message to the endpoint, as well as creating a compatible MessageVersion for any response document before returning it to the requesting client application.

Die Schritte zum Erstellen eines neuen MessageVersion für die ausgehende Nachricht lauten wie folgt:The steps taken to create a new MessageVersion for the outbound message are as follows:

AnforderungsverarbeitungRequest processing

  • Abrufen der MessageVersion der ausgehenden Bindung bzw. des Kanals.Get the MessageVersion of the outbound binding/channel.

  • Rufen Sie den Textreader für die ursprüngliche Nachricht ab.Get the body reader for the original message.

  • Erstellen Sie eine neue Nachricht mit der gleichen Aktion, TextReader und ein neues MessageVersion.Create a new message with the same action, body reader, and a new MessageVersion.

  • Wenn Addressing ! = Addressing.None, To, From, "FaultTo" kopieren und RelatesTo-Header in die neue Nachricht.If Addressing != Addressing.None, copy the To, From, FaultTo, and RelatesTo headers to the new message.

  • Kopieren Sie alle Eigenschaften der Nachricht in die neue Nachricht.Copy all message properties to the new message.

  • Speichern Sie die ursprüngliche Anforderungsnachricht, die zum Verarbeiten der Antwort verwendet werden soll.Store the original request message to use when processing the response.

  • Geben Sie die neue Anforderungsnachricht zurück.Return the new request message.

Verarbeitung der AntwortResponse processing

  • Abrufen der MessageVersion der ursprünglichen Anforderungsnachricht.Get the MessageVersion of the original request message.

  • Rufen Sie den Textreader für die empfangene Antwortnachricht ab.Get the body reader for the received response message.

  • Erstellen Sie eine neue Antwortnachricht mit der gleichen Aktion, TextReader und der MessageVersion der ursprünglichen Anforderungsnachricht.Create a new response message with the same action, body reader, and the MessageVersion of the original request message.

  • Wenn Addressing ! = Addressing.None, To, From, "FaultTo" kopieren und RelatesTo-Header in die neue Nachricht.If Addressing != Addressing.None, copy the To, From, FaultTo, and RelatesTo headers to the new message.

  • Kopieren Sie die Eigenschaften der Nachricht in die neue Nachricht.Copy the message properties to the new message.

  • Geben Sie die neue Antwortnachricht zurück.Return the new response message.

Wird standardmäßig die SoapProcessingBehavior den Clientendpunkten automatisch hinzugefügt wird die RoutingBehavior beim Starten des Diensts; Sie können jedoch steuern, ob SOAP-Verarbeitung mit allen Clientendpunkten hinzugefügt wird die SoapProcessingEnabled Eigenschaft.By default, the SoapProcessingBehavior is automatically added to the client endpoints by the RoutingBehavior when the service starts; however, you can control whether SOAP processing is added to all client endpoints by using the SoapProcessingEnabled property. Sie können das Verhalten auch direkt einem bestimmten Endpunkt hinzufügen und es auf Endpunktebene aktivieren oder deaktivieren, falls eine präzisere Steuerung der SOAP-Verarbeitung erforderlich ist.You can also add the behavior directly to a specific endpoint and enable or disable this behavior at the endpoint level if a more granular control of SOAP processing is required.

Hinweis

Wenn die SOAP-Verarbeitung für einen Endpunkt deaktiviert ist, der eine andere MessageVersion als die der ursprünglichen Anforderungsnachricht erfordert, müssen Sie einen benutzerdefinierten Mechanismus zum Ausführen aller SOAP-Änderungen bereitstellen, die vor dem Senden der Nachricht an den Zielendpunkt erforderlich sind.If SOAP processing is disabled for an endpoint that requires a different MessageVersion than that of the original request message, you must provide a custom mechanism for performing any SOAP modifications that are required before sending the message to the destination endpoint.

In den folgenden Beispielen wird die SoapProcessingEnabled Eigenschaft wird verwendet, um zu verhindern, dass die SoapProcessingBehavior automatisch allen Clientendpunkten hinzugefügt wird.In the following examples, the soapProcessingEnabled property is used to prevent the SoapProcessingBehavior from being automatically added to all client endpoints.

<behaviors>  
  <!--default routing service behavior definition-->  
  <serviceBehaviors>  
    <behavior name="routingConfiguration">  
      <routing filterTableName="filterTable1" soapProcessingEnabled="false"/>  
    </behavior>  
  </serviceBehaviors>  
</behaviors>  
//create the default RoutingConfiguration  
RoutingConfiguration rc = new RoutingConfiguration();  
rc.SoapProcessingEnabled = false;  

Dynamische KonfigurationDynamic Configuration

Wenn Sie zusätzliche Clientendpunkte hinzufügen oder die Filter zum Weiterleiten von Nachrichten ändern, müssen Sie eine Möglichkeit schaffen, die Konfiguration zur Laufzeit dynamisch zu aktualisieren. Auf diese Weise verhindern Sie die Unterbrechung des Diensts zu den Endpunkten, die momentan Nachrichten über den Routingdienst empfangen.When you add additional client endpoints, or need to modify the filters that are used to route messages, you must have a way to update the configuration dynamically at run time to prevent interrupting the service to the endpoints currently receiving messages through the Routing Service. Das Ändern einer Konfigurationsdatei oder des Codes der Hostanwendung ist nicht immer ausreichend, weil bei beiden Verfahren die Wiederverwendung der Anwendung erforderlich ist. Dies kann zum Verlust aller Nachrichten führen, die gerade übertragen werden, und es kann beim Warten auf den Neustart des Diensts zu einer Ausfallzeit kommen.Modifying a configuration file or the code of the host application is not always sufficient, because either method requires recycling the application, which would lead to the potential loss of any messages currently in transit and the potential for downtime while waiting on the service to restart.

Sie können nur ändern, die RoutingConfiguration programmgesteuert.You can only modify the RoutingConfiguration programmatically. Während Sie den Dienst zunächst mithilfe einer Konfigurationsdatei konfigurieren können, können Sie die Konfiguration zur Laufzeit nur ändern, indem Sie eine neue Routingconfiguration und und übergeben sie als Parameter an die ApplyConfiguration Methode verfügbar gemacht werden, indem Sie die RoutingExtension -diensterweiterung.While you can initially configure the service by using a configuration file, you can only modify the configuration at run time by constructing a new RoutingConfigution and passing it as a parameter to the ApplyConfiguration method exposed by the RoutingExtension service extension. Alle Nachrichten bei der Übertragung weiterhin mithilfe der vorherigen Konfigurations nach dem Aufruf von empfangenen Nachrichten weitergeleitet werden ApplyConfiguration verwenden Sie die neue Konfiguration.Any messages currently in transit continue to be routed using the previous configuration, while messages received after the call to ApplyConfiguration use the new configuration. Im folgenden Beispiel wird das Erstellen einer Instanz des Routingdiensts und anschließend das Ändern der Konfiguration veranschaulicht.The following example demonstrates creating an instance of the Routing Service and then subsequently modifying the configuration.

RoutingConfiguration routingConfig = new RoutingConfiguration();  
routingConfig.RouteOnHeadersOnly = true;  
routingConfig.FilterTable.Add(new MatchAllMessageFilter(), endpointList);  
RoutingBehavior routing = new RoutingBehavior(routingConfig);  
routerHost.Description.Behaviors.Add(routing);  
routerHost.Open();  
// Construct a new RoutingConfiguration  
RoutingConfiguration rc2 = new RoutingConfiguration();  
ServiceEndpoint clientEndpoint = new ServiceEndpoint();  
ServiceEndpoint clientEndpoint2 = new ServiceEndpoint();  
// Add filters to the FilterTable in the new configuration  
rc2.FilterTable.add(new MatchAllMessageFilter(),  
       new List<ServiceEndpoint>() { clientEndpoint });  
rc2.FilterTable.add(new MatchAllMessageFilter(),  
       new List<ServiceEndpoint>() { clientEndpoint2 });  
rc2.RouteOnHeadersOnly = false;  
// Apply the new configuration to the Routing Service hosted in  
routerHost.routerHost.Extensions.Find<RoutingExtension>().ApplyConfiguration(rc2);  

Hinweis

Beim Aktualisieren des Routingdiensts auf diese Weise ist es nur möglich, eine neue Konfiguration zu übergeben.When updating the Routing Service in this manner it is only possible to pass a new configuration. Es ist nicht möglich, nur bestimmte Elemente der aktuellen Konfiguration zu ändern oder neue Einträge an die aktuelle Konfiguration anzufügen. Sie müssen eine neue Konfiguration erstellen und übergeben, die die vorhandene Konfiguration ersetzt.It is not possible to modify only select elements of the current configuration or append new entries to the current configuration; you must create and pass a new configuration that replaces the existing one.

Hinweis

Alle Sitzungen, die mit der vorherigen Konfiguration geöffnet wurden, verwenden weiterhin die vorherige Konfiguration.Any sessions opened using the previous configuration continue using the previous configuration. Die neue Konfiguration wird nur von neuen Sitzungen verwendet.The new configuration is only used by new sessions.

FehlerbehandlungError Handling

Wenn beim versuchten Senden einer Nachricht eine CommunicationException auftritt, wird die Fehlerbehandlung ausgeführt.If any CommunicationException is encountered while attempting to send a message, error handling take place. Diese Ausnahmen weisen in der Regel darauf hin, dass beim Versuch der Kommunikation mit dem definierten Clientendpunkt ein Problem aufgetreten ist, z. B. EndpointNotFoundException, ServerTooBusyException oder CommunicationObjectFaultedException.These exceptions typically indicate that a problem was encountered while attempting to communicate with the defined client endpoint, such as an EndpointNotFoundException, ServerTooBusyException, or CommunicationObjectFaultedException. Der Fehlerbehandlungscode ebenfalls abfangen und versuchen, erneut zu senden, wenn eine TimeoutException auftritt, also in eine andere häufige Ausnahme, die nicht von abgeleitet ist CommunicationException.The error handling-code will also catch and attempt to retry sending when a TimeoutException occurs, which is another common exception that is not derived from CommunicationException.

Wenn eine der vorangehenden Ausnahmen auftritt, führt der Routingdienst ein Failover zu einer Liste von Sicherungsendpunkten aus.When one of the preceding exceptions occurs, the Routing Service fails over to a list of backup endpoints. Falls für alle Sicherungsendpunkte ein Kommunikationsfehler auftritt oder falls ein Endpunkt eine Ausnahme zurückgibt, die einen Fehler beim Zieldienst angibt, gibt der Routingdienst einen Fehler an die Clientanwendung zurück.If all backup endpoints fail with a communications failure, or if an endpoint returns an exception that indicates a failure within the destination service, the Routing Service returns a fault to the client application.

Hinweis

Die Fehlerbehandlungsfunktion erfasst und behandelt Ausnahmen, die beim versuchten Senden einer Nachricht oder Schließen eines Kanals auftreten.The error-handling functionality captures and handles exceptions that occur when attempting to send a message and when attempting to close a channel. Der Fehlerbehandlungscode ist nicht vorgesehen, zu erkennen oder zum Behandeln von Ausnahmen, die durch die Anwendungsendpunkte, mit dem Sie kommunizieren wird, erstellt; eine FaultException ausgelöst durch ein Dienst angezeigt wird, den Routingdienst als eine FaultMessage und zurück an den Client übergeben wird.The error-handling code is not intended to detect or handle exceptions created by the application endpoints it is communicating with; a FaultException thrown by a service appears at the Routing Service as a FaultMessage and is flowed back to the client.

Wenn beim Weiterleiten einer Nachricht durch den Routingdienst ein Fehler auftritt, erhalten Sie eventuell auf der Clientseite eine FaultException und keine EndpointNotFoundException, die Sie normalerweise bei nicht vorhandenem Routingdienst erhalten.If an error occurs when the routing service tries to relay a message, you may get a FaultException on the client side, rather than a EndpointNotFoundException you would normally get in the absence of the routing service. Daher maskiert der Routingdienst möglicherweise Ausnahmen und bietet keine vollständige Transparenz, es sei denn, Sie überprüfen geschachtelte Ausnahmen.A routing service may thus mask exceptions and not provide full transparency unless you examine nested exceptions.

Nachverfolgen von AusnahmenTracing Exceptions

Beim Senden eine Nachricht an einen Endpunkt in einer Liste ein Fehler auftritt, wird der Routingdienst die sich ergebenden Ausnahmedaten verfolgt und fügt die Details der Ausnahme als Nachrichteneigenschaft mit dem Namen Ausnahmen.When sending a message to an endpoint in a list fails, the Routing Service traces the resulting exception data and attaches the exception details as a message property named Exceptions. Dabei werden die Ausnahmedaten beibehalten, und Benutzern wird der programmgesteuerte Zugriff über einen Nachrichteninspektor ermöglicht.This preserves the exception data and allows a user programmatic access through a message inspector. Die Ausnahmedaten werden pro Nachricht in einem Wörterbuch gespeichert. Das Wörterbuch ordnet den Endpunktnamen den Ausnahmedetails zu, die beim versuchten Senden einer Nachricht an diesen Endpunkt auftreten.The exception data is stored per message in a dictionary that maps the endpoint name to the exception details encountered when trying to send a message to it.

SicherungsendpunkteBackup Endpoints

Jeder Filtereintrag innerhalb der Filtertabelle kann optional eine Liste mit Sicherungsendpunkten angeben, die verwendet werden, wenn beim Senden an den primären Endpunkt ein Übertragungsfehler auftritt.Each filter entry within the filter table can optionally specify a list of backup endpoints, which are used in the event of a transmission failure when sending to the primary endpoint. Bei einem Fehler dieser Art versucht der Routingdienst, die Nachricht an den ersten Eintrag der Liste mit den Sicherungsendpunkten zu senden.If such a failure occurs, the Routing Service attempts to transmit the message to the first entry in the backup endpoint list. Falls bei diesem Sendeversuch ebenfalls ein Übertragungsfehler auftritt, wird der nächste Endpunkt in der Liste verwendet.If this send attempt also encounters a transmission failure, the next endpoint in the backup list is tried. Der Routingdienst sendet die Nachricht an jeden Endpunkt in der Liste, bis die Nachricht erfolgreich empfangen wurde, alle Endpunkte einen Übertragungsfehler zurückgeben oder ein Endpunkt einen anderen Fehler als einen Übertragungsfehler zurückgibt.The Routing Service continues sending the message to each endpoint in the list until the message is successfully received, all endpoints return a transmission failure, or a non-transmission failure is returned by an endpoint.

In den folgenden Beispielen wird der Routingdienst für die Verwendung einer Sicherungsliste konfiguriert.The following examples configure the Routing Service to use a backup list.

<routing>  
  <filters>  
    <!-- Create a MatchAll filter that catches all messages -->  
    <filter name="MatchAllFilter1" filterType="MatchAll" />  
  </filters>  
  <filterTables>  
    <!-- Set up the Routing Service's Message Filter Table -->  
    <filterTable name="filterTable1">  
        <!-- Add an entry that maps the MatchAllMessageFilter to the dead destination -->  
        <!-- If that endpoint is down, tell the Routing Service to try the endpoints -->  
        <!-- Listed in the backupEndpointList -->  
        <add filterName="MatchAllFilter1" endpointName="deadDestination" backupList="backupEndpointList"/>  
    </filterTable>  
  </filterTables>  
  <!-- Create the backup endpoint list -->  
  <backupLists>  
    <!-- Add an endpoint list that contains the backup destinations -->  
    <backupList name="backupEndpointList">  
      <add endpointName="realDestination" />  
      <add endpointName="backupDestination" />  
    </backupList>  
  </backupLists>  
</routing>  
//create the endpoint list that contains the service endpoints we want to route to  
List<ServiceEndpoint> backupList = new List<ServiceEndpoint>();  
//add the endpoints in the order that the Routing Service should contact them  
//first add the endpoint that we know is down  
//clearly, normally you wouldn't know that this endpoint was down by default  
backupList.Add(fakeDestination);  
//then add the real Destination endpoint  
//the Routing Service attempts to send to this endpoint only if it   
//encounters a TimeOutException or CommunicationException when sending  
//to the previous endpoint in the list.  
backupList.Add(realDestination);  
//add the backupDestination endpoint  
//the Routing Service attempts to send to this endpoint only if it  
//encounters a TimeOutException or CommunicationsException when sending  
//to the previous endpoints in the list  
backupList.Add(backupDestination);  
//create the default RoutingConfiguration option              
RoutingConfiguration rc = new RoutingConfiguration();  
//add a MatchAll filter to the Routing Configuration's filter table  
//map it to the list of endpoints defined above  
//when a message matches this filter, it is sent to the endpoints in the list in order  
//if an endpoint is down or does not respond (which the first endpoint won't  
//since the client does not exist), the Routing Service automatically moves the message  
//to the next endpoint in the list and try again.  
rc.FilterTable.Add(new MatchAllMessageFilter(), backupList);  

Unterstützte FehlermusterSupported Error Patterns

In der folgenden Tabelle werden die Muster beschrieben, die mit der Verwendung von Sicherungsendpunktlisten kompatibel sind. Außerdem enthält die Tabelle Hinweise zu den Details der Fehlerbehandlung für bestimmte Muster.The following table describes the patterns that are compatible with the use of backup endpoint lists, along with notes describing the details of error handling for specific patterns.

MusterPattern SitzungSession TransaktionTransaction EmpfangskontextReceive Context Unterstützte SicherungslisteBackup List Supported HinweiseNotes
UnidirektionalOne-Way JaYes Versucht, die Nachricht erneut an einen Sicherungsendpunkt zu senden.Attempts to resend the message on a backup endpoint. Falls für diese Nachricht ein Multicast ausgeführt wird, wird nur die Nachricht im Kanal mit dem Fehler an das entsprechende Sicherungsziel verschoben.If this message is being multicast, only the message on the failed channel is moved to its backup destination.
UnidirektionalOne-Way HäkchenCheck mark NeinNo Eine Ausnahme wird ausgelöst, und für die Transaktion wird ein Rollback ausgeführt.An exception is thrown and the transaction is rolled back.
UnidirektionalOne-Way HäkchenCheck mark JaYes Versucht, die Nachricht erneut an einen Sicherungsendpunkt zu senden.Attempts to resend the message on a backup endpoint. Nachdem die Nachricht erfolgreich empfangen wurde, werden alle Empfangskontexte abgeschlossen.After the message is successfully received, complete all receive contexts. Falls die Nachricht von keinem Endpunkt erfolgreich empfangen wurde, wird der Empfangskontext nicht abgeschlossen.If the message is not successfully received by any endpoint, do not complete the receive context.

Wenn für diese Nachricht ein Multicast ausgeführt wird, wird der Empfangskontext nur abgeschlossen, falls die Nachricht von mindestens einem Endpunkt (primär oder Sicherung) erfolgreich empfangen wird.When this message is being multicast, the receive context is only completed if the message is successfully received by at least one endpoint (primary or backup). Schließen Sie den Empfangskontext nicht ab, falls der Empfang der Nachricht für keinen Endpunkt in den Multicastpfaden erfolgreich ist.If none of the endpoints in any of the multicast paths successfully receive the message, do not complete the receive context.
UnidirektionalOne-Way HäkchenCheck mark HäkchenCheck mark JaYes Brechen Sie die vorherige Transaktion ab, erstellen Sie eine neue Transaktion, und senden Sie alle Nachrichten neu.Abort the previous transaction, create a new transaction, and resend all messages. Nachrichten, für die ein Fehler aufgetreten ist, werden an ein Sicherungsziel übertragen.Messages that encountered an error are transmitted to a backup destination.

Nachdem eine Transaktion erstellt wurde, für die alle Übertragungen erfolgreich sind, schließen Sie die Empfangskontexte ab und führen für die Transaktion einen Commit aus.After a transaction has been created in which all transmissions succeed, complete the receive contexts and commit the transaction.
UnidirektionalOne-Way HäkchenCheck mark JaYes Versucht, die Nachricht erneut an einen Sicherungsendpunkt zu senden.Attempts to resend the message on a backup endpoint. In einem Multicastszenario werden nur die Nachrichten einer Sitzung, für die ein Fehler aufgetreten ist oder bei der beim Schließen der Sitzung ein Fehler aufgetreten ist, zurück an die Sicherungsziele gesendet.In a multicast scenario only the messages in a session that encountered an error or in a session whose session close failed are resent to backup destinations.
UnidirektionalOne-Way HäkchenCheck mark HäkchenCheck mark NeinNo Eine Ausnahme wird ausgelöst, und für die Transaktion wird ein Rollback ausgeführt.An exception is thrown and the transaction is rolled back.
UnidirektionalOne-Way HäkchenCheck mark HäkchenCheck mark JaYes Versucht, die Nachricht erneut an einen Sicherungsendpunkt zu senden.Attempts to resend the message on a backup endpoint. Nachdem das Senden für alle Nachrichten erfolgreich abgeschlossen wurde, zeigt die Sitzung keine Nachrichten mehr an, und der Routingdienst schließt alle ausgehenden Sitzungskanäle. Außerdem werden alle Empfangskontexte abgeschlossen und der eingehende Sitzungskanal geschlossen.After all message sends complete without error, the session indicates no more messages and the Routing Service successfully closes all outbound session channel(s), all receive contexts are completed, and the inbound session channel is closed.
UnidirektionalOne-Way HäkchenCheck mark HäkchenCheck mark HäkchenCheck mark JaYes Brechen Sie die aktuelle Transaktion ab, und erstellen Sie eine neue Transaktion.Abort the current transaction and create a new one. Senden Sie alle vorherigen Nachrichten der Sitzung neu.Resend all previous messages in the session. Nachdem eine Transaktion erstellt wurde, für die alle Nachrichten erfolgreich gesendet wurden, und die Sitzung keine Nachrichten mehr anzeigt, werden alle ausgehenden Sitzungskanäle geschlossen. Außerdem werden alle Empfangskontexte zusammen mit der Transaktion abgeschlossen, der eingehende Sitzungskanal wird geschlossen und für die Transaktion wird ein Commit ausgeführt.After a transaction has been created in which all messages have been successfully sent and the session indicates no more messages, all the outbound session channels are closed, receive contexts are all completed with the transaction, the inbound session channel is closed, and the transaction is committed.

Wenn für die Sitzungen ein Multicast durchgeführt wird, werden die Nachrichten, für die kein Fehler aufgetreten ist, wie vorher erneut zurück an das gleiche Ziel gesendet. Nachrichten, für die ein Fehler aufgetreten ist, werden an die Sicherungsziele gesendet.When the sessions are being multicast the messages that had no error are resent to the same destination as before, and messages that encountered an error are sent to backup destinations.
BidirektionalTwo-Way JaYes Das Senden erfolgt an ein Sicherungsziel.Send to a backup destination. Nachdem ein Kanal eine Antwortnachricht zurückgegeben hat, wird die Antwort an den ursprünglichen Client zurückgegeben.After a channel returns a response message, return the response to the original client.
BidirektionalTwo-Way HäkchenCheck mark JaYes Alle Nachrichten im Kanal werden an ein Sicherungsziel gesendet.Send all messages on the channel to a backup destination. Nachdem ein Kanal eine Antwortnachricht zurückgegeben hat, wird die Antwort an den ursprünglichen Client zurückgegeben.After a channel returns a response message, return the response to the original client.
BidirektionalTwo-Way HäkchenCheck mark NeinNo Eine Ausnahme wird ausgelöst, und für die Transaktion wird ein Rollback ausgeführt.An exception is thrown and the transaction is rolled back.
BidirektionalTwo-Way HäkchenCheck mark HäkchenCheck mark NeinNo Eine Ausnahme wird ausgelöst, und für die Transaktion wird ein Rollback ausgeführt.An exception is thrown and the transaction is rolled back.
DuplexDuplex NeinNo Die Duplexkommunikation außerhalb von Sitzungen wird momentan nicht unterstützt.Non-session duplex communication is not currently supported.
DuplexDuplex HäkchenCheck mark JaYes Das Senden erfolgt an ein Sicherungsziel.Send to a backup destination.

HostingHosting

Da der Routingdienst als WCF-Dienst implementiert wird, muss dieser entweder in einer Anwendung selbst oder von IIS oder WAS gehostet werden.Because the Routing Service is implemented as a WCF service, it must be either self-hosted within an application or hosted by IIS or WAS. Es ist ratsam, den Routingdienst entweder unter IIS, WAS oder einer Windows-Dienstanwendung zu hosten. Sie können dann die Vorteile des automatischen Startens und die Funktionen zur Lebenszyklusverwaltung nutzen, die in diesen Hostumgebungen verfügbar sind.It is recommended that the Routing Service be hosted in either IIS, WAS, or a Windows Service application to take advantage of the automatic start and life-cycle management features available in these hosting environments.

Im folgenden Beispiel wird das Hosten des Routingdiensts in einer Anwendung veranschaulicht.The following example demonstrates hosting the Routing Service in an application.

using (ServiceHost serviceHost =  
                new ServiceHost(typeof(RoutingService)))  

Um den Routingdienst unter IIS oder WAS zu hosten, müssen Sie entweder eine Dienstdatei (.svc) erstellen oder eine Aktivierung des Diensts per Konfiguration verwenden.To host the Routing Service within IIS or WAS, you must either create a service file (.svc) or use configuration-based activation of the service. Bei Verwendung einer Dienstdatei müssen Sie RoutingService angeben, indem Sie den Service-Parameter verwenden.When using a service file, you must specify the RoutingService using the Service parameter. Das folgende Beispiel enthält eine Beispieldienstdatei, mit der der Routingdienst unter IIS oder WAS gehostet werden kann.The following example contains a sample service file that can be used to host the Routing Service with IIS or WAS.

<%@ ServiceHost Language="C#" Debug="true" Service="System.ServiceModel.Routing.RoutingService,   
     System.ServiceModel.Routing, version=4.0.0.0, Culture=neutral,   
     PublicKeyToken=31bf3856ad364e35" %>  

Routingdienst und IdentitätswechselRouting Service and Impersonation

Der WCR-Routingdienst kann mit dem Identitätswechsel sowohl zum Senden als auch zum Empfangen von Nachrichten verwendet werden.The WCF Routing Service can be used with impersonation for both sending and receiving messages. Alle üblichen Windows-Einschränkungen des Identitätswechsels sind gültig.All of the usual Windows constraints of impersonation apply. Wenn es beim Schreiben eines eigenen Diensts erforderlich ist, Dienst- oder Kontoberechtigungen für die Verwendung des Identitätswechsels einzurichten, müssen Sie dieselben Schritte ausführen, um den Identitätswechsel mit dem Routingdienst zu verwenden.If you would have needed to set up service or account permissions to use impersonation when writing your own service, then you’ll have to do those same steps to use impersonation with the routing service. Weitere Informationen finden Sie unter Delegierung und Identitätswechsel.For more information, see Delegation and Impersonation.

Der Identitätswechsel mit dem Routingdienst erfordert entweder die Verwendung des ASP.NET-Identitätswechsels (im ASP.NET-Kompatibilitätsmodus) oder die Verwendung von Windows-Anmeldeinformationen, die konfiguriert wurden, um den Identitätswechsel zu ermöglichen.Impersonation with the routing service requires either the use of ASP.NET impersonation while in ASP.NET compatibility mode or the use of Windows credentials that have been configured to allow impersonation. Weitere Informationen zu den ASP.NET-Kompatibilitätsmodus, finden Sie unter WCF-Dienste und ASP.NET.For more information about ASP.NET compatibility mode, see WCF Services and ASP.NET.

Warnung

Der WCF-Routingdienst unterstützt keinen Identitätswechsel mit Standardauthentifizierung.The WCF Routing Service does not support impersonation with basic authentication.

Um den ASP.NET-Identitätswechsel mit dem Routingdienst zu verwenden, aktivieren Sie den ASP.NET-Kompatibilitätsmodus für die Hostingumgebung des Diensts.To use ASP.NET impersonation with the routing service, enable ASP.NET compatibility mode on the service hosting environment. Der Routingdienst ist bereits für die Verwendung des ASP.NET-Kompatibilitätsmodus gekennzeichnet, und der Identitätswechsel wird automatisch aktiviert.The routing service has already been marked as allowing ASP.NET compatibility mode and impersonation will automatically be enabled. Der Identitätswechsel ist die einzige unterstützte Verwendung der ASP.NET-Integration mit dem Routingdienst.Impersonation is the only supported use of ASP.NET integration with the routing service.

Um Windows-Anmeldeinformationen mit dem Routingdienst zu verwenden, müssen Sie sowohl die Anmeldeinformationen als auch den Dienst konfigurieren.To use Windows credential impersonation with the routing service you need to configure both the credentials and the service. Das Objekt für Clientanmeldeinformationen (WindowsClientCredential, auf das von der ChannelFactory zugegriffen werden kann) definiert eine AllowedImpersonationLevel-Eigenschaft, die festgelegt werden muss, um den Identitätswechsel zu ermöglichen.The client credentials object (WindowsClientCredential, accessable from the ChannelFactory) defines an AllowedImpersonationLevel property that must be set to permit impersonation. Schließlich müssen Sie für den Dienst das ServiceAuthorizationBehavior-Verhalten konfigurieren, um ImpersonateCallerForAllOperations auf true festzulegen.Finally, on the service you need to configure the ServiceAuthorizationBehavior behavior to set ImpersonateCallerForAllOperations to true. Der Routingdienst verwendet dieses Flag, um zu entscheiden, ob die Clients zum Weiterleiten von Nachrichten mit aktiviertem Identitätswechsel erstellt werden sollen.The routing service uses this flag to decide whether to create the clients for forwarding messages with impersonation enabled.

Siehe auchSee Also

NachrichtenfilterMessage Filters
RoutingverträgeRouting Contracts
Auswählen eines FiltersChoosing a Filter