Introduzione al routingRouting Introduction

Il servizio di routing fornisce un intermediario SOAP di collegamento generico in grado di indirizzare i messaggi in base al relativo contenuto.The Routing Service provides a generic pluggable SOAP intermediary that is capable of routing messages based on message content. Il servizio di routing consente di creare logica di routing complessa per l'implementazione di scenari quali l'aggregazione dei servizi, il controllo delle versioni dei servizi, il routing prioritario e il routing multicast.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. Il servizio di routing offre inoltre funzionalità di gestione degli errori che consentono di configurare elenchi di endpoint di backup ai quali vengono inviati i messaggi se si verifica un errore di invio all'endpoint di destinazione primario.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.

Questo argomento è destinato a coloro i quali non hanno familiarità con il servizio di routing e ne illustra la configurazione di base e l'hosting.This topic is intended for those new to the Routing Service and covers basic configuration and hosting of the Routing Service.

ConfigurazioneConfiguration

Il servizio di routing viene implementato come servizio WCF che espone uno o più endpoint servizio i quali ricevono i messaggi dalle applicazioni client e li indirizzano a uno o più endpoint di destinazione.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. Il servizio include un elemento RoutingBehavior che viene applicato agli endpoint servizio esposti.The service provides a RoutingBehavior, which is applied to the service endpoints exposed by the service. Questo comportamento viene usato per configurare diversi aspetti del funzionamento del servizio.This behavior is used to configure various aspects of how the service operates. Per facilitare la configurazione quando si usa un file di configurazione, i parametri vengono specificati nel RoutingBehavior.For ease of configuration when using a configuration file, the parameters are specified on the RoutingBehavior. In uno scenario basato su codice, questi parametri vengono invece specificati come parte di un RoutingConfiguration oggetto, che può quindi essere passato a un RoutingBehavior.In code-based scenarios, these parameters would be specified as part of a RoutingConfiguration object, which can then be passed to a RoutingBehavior.

Inizialmente, questo comportamento aggiunge agli endpoint client SoapProcessingBehavior, il quale è usato per eseguire l'elaborazione SOAP dei messaggi.When starting, this behavior adds the SoapProcessingBehavior, which is used to perform SOAP processing of messages, to the client endpoints. In questo modo il servizio di Routing trasmettere messaggi a endpoint che richiedono una diversa MessageVersion rispetto all'endpoint è stato ricevuto il messaggio.This allows the Routing Service to transmit messages to endpoints that require a different MessageVersion than the endpoint the message was received over. Il RoutingBehavior registra inoltre un'estensione del servizio di RoutingExtension, che fornisce un punto di accessibilità per la modifica della configurazione del servizio di Routing in fase di esecuzione.The RoutingBehavior also registers a service extension, the RoutingExtension, which provides an accessibility point for modifying the Routing Service configuration at run time.

Il RoutingConfiguration classe fornisce un modo coerente per configurare e aggiornare la configurazione del servizio di Routing.The RoutingConfiguration class provides a consistent means of configuring and updating the configuration of the Routing Service. Contiene parametri che agiscono come le impostazioni per il servizio di Routing e viene usati per configurare il RoutingBehavior all'avvio del servizio, oppure è passato per il RoutingExtension per modificare il routing configurazione in fase di esecuzione.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.

La logica di routing usata per indirizzare i messaggi in base al contenuto viene definita raggruppando più oggetti MessageFilter in tabelle di filtri (oggetti MessageFilterTable<TFilterData>).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). I messaggi in ingresso vengono valutati in base ai filtri messaggi contenuti nella tabella dei filtri e per ogni MessageFilter che corrisponde al messaggio, inoltrato a un endpoint di destinazione.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. La tabella dei filtri che deve essere utilizzato per indirizzare i messaggi viene specificata, utilizzando il RoutingBehavior nella configurazione o tramite codice con il RoutingConfiguration oggetto.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.

Definizione di endpointDefining Endpoints

Sebbene possa sembrare opportuno iniziare la configurazione definendo la logica di routing che verrà usata, è consigliabile che il primo passaggio consista nel determinare la forma degli endpoint a cui verranno indirizzati i messaggi.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. Il servizio di routing usa contratti che definiscono la forma dei canali usati per ricevere e inviare messaggi, pertanto la forma del canale di input deve corrispondere a quella del canale di output.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. Se ad esempio si esegue il routing a endpoint che usano la forma del canale di tipo request/reply, è necessario usare un contratto compatibile negli endpoint in ingresso, ad esempio 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.

Ciò significa che se gli endpoint di destinazione usano contratti con più modelli di comunicazione (ad esempio una combinazione di operazioni unidirezionali e bidirezionali), non è possibile creare un singolo endpoint servizio in grado di ricevere e indirizzare i messaggi a tutti.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. È necessario determinare quali endpoint dispongono di forme compatibili e definire uno o più endpoint servizio che verranno usati per ricevere i messaggi da indirizzare agli endpoint di destinazione.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.

Nota

Quando si usano contratti che specificano più modelli di comunicazione (ad esempio una combinazione di operazioni unidirezionali e bidirezionali), una soluzione alternativa è rappresentata dall'utilizzo di un contratto di tipo duplex nel servizio di routing, ad esempio 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. Ciò implica tuttavia che l'associazione deve supportare la comunicazione duplex, il che potrebbe non essere possibile per tutti gli scenari.However this means that the binding must be capable of duplex communication, which may not be possible for all scenarios. Negli scenari in cui questa soluzione non è possibile, può risultare necessario eseguire il factoring della comunicazione in più endpoint oppure modificare l'applicazione.In scenarios where this is not possible, factoring the communication into multiple endpoints or modifying the application may be necessary.

Per ulteriori informazioni sui contratti di routing, vedere contratti di Routing.For more information about routing contracts, see Routing Contracts.

Dopo aver definito l'endpoint del servizio, è possibile utilizzare il RoutingBehavior per associare uno specifico RoutingConfiguration con l'endpoint.After the service endpoint is defined, you can use the RoutingBehavior to associate a specific RoutingConfiguration with the endpoint. Quando si configura il servizio di Routing utilizzando un file di configurazione di RoutingBehavior viene utilizzata per specificare la tabella dei filtri che contiene la logica di routing usata per elaborare i messaggi ricevuti su questo endpoint.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. Se si sta configurando il servizio di Routing a livello di codice è possibile specificare la tabella dei filtri utilizzando la RoutingConfiguration.If you are configuring the Routing Service programmatically you can specify the filter table by using the RoutingConfiguration.

Nell'esempio seguente gli endpoint servizio e client usati dal servizio di routing sono definiti sia a livello di codice sia tramite un file di configurazione.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));  

Questo esempio mostra come configurare il servizio di Routing per esporre un unico endpoint con un indirizzo di "http://localhost:8000/routingservice/router", che consente di ricevere messaggi da indirizzare.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. Poiché i messaggi vengono indirizzati agli endpoint di tipo request/reply, l'endpoint servizio usa il contratto IRequestReplyRouter.Because the messages are routed to request-reply endpoints, the service endpoint uses the IRequestReplyRouter contract. Questa configurazione definisce inoltre un singolo endpoint client "http://localhost:8000/servicemodelsample/service" che i messaggi vengano instradati alla.This configuration also defines a single client endpoint of "http://localhost:8000/servicemodelsample/service" that messages are routed to. La tabella dei filtri (non illustrata) denominata "routingTable1" contiene la logica di routing usata per instradare i messaggi e viene associata all'endpoint di servizio utilizzando il RoutingBehavior (per un file di configurazione) o RoutingConfiguration (per la configurazione a livello di codice).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).

Logica di routingRouting Logic

Per definire la logica di routing usata per indirizzare i messaggi, è necessario stabilire su quali dati contenuti nei messaggi in entrata è possibile intervenire in modo univoco.To define the routing logic used to route messages, you must determine what data contained within the incoming messages can be uniquely acted upon. Se ad esempio tutti gli endpoint di destinazione del routing condividono le stesse azioni SOAP, il valore dell'elemento Action all'interno del messaggio non rappresenta un indicatore utile dell'endpoint specifico a cui deve essere indirizzato il messaggio.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. Se è necessario indirizzare i messaggi in modo univoco a un endpoint specifico, è consigliabile applicare filtri in base a dati che identificano in modo univoco l'endpoint di destinazione a cui il messaggio viene indirizzato.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.

Il servizio di Routing offre diverse MessageFilter implementazioni che controllano valori specifici all'interno del messaggio, ad esempio l'indirizzo, azione, il nome dell'endpoint o perfino una query XPath.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. Se nessuna delle implementazioni soddisfa le proprie esigenze, è possibile creare un oggetto personalizzato MessageFilter implementazione.If none of these implementations meet your needs you can create a custom MessageFilter implementation. Per ulteriori informazioni sui filtri messaggi e un confronto tra le implementazioni utilizzato dal servizio di Routing, vedere filtri messaggi e scelta di un filtro.For more information about message filters and a comparison of the implementations used by the Routing Service, see Message Filters and Choosing a Filter.

Più filtri dei messaggi vengono organizzati insieme in apposite tabelle nelle quali ogni MessageFilter con un endpoint di destinazione.Multiple message filters are organized together into filter tables, which associate each MessageFilter with a destination endpoint. Facoltativamente, è inoltre possibile usare la tabella dei filtri per specificare un elenco di endpoint di backup a cui il servizio di routing tenterà di inviare il messaggio qualora si verifichi un errore di trasmissione.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.

Per impostazione predefinita, tutti i filtri messaggi all'interno di una tabella vengono valutati contemporaneamente. È tuttavia possibile specificare un oggetto Priority che impone la valutazione dei filtri messaggi in un ordine specifico.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. Tutte le voci con priorità massima vengono valutati per primi, mentre i filtri dei messaggi di priorità inferiore non vengono valutati se viene individuata una corrispondenza a un livello di priorità superiore.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. Per ulteriori informazioni sulle tabelle di filtro, vedere filtri messaggi.For more information about filter tables, see Message Filters.

Negli esempi seguenti viene usato MatchAllMessageFilter, il quale restituisce true per tutti i messaggi.The following examples use the MatchAllMessageFilter, which evaluates to true for all messages. Questo MessageFilter viene aggiunto alla tabella dei filtri "routingTable1", che associa il MessageFilter con l'endpoint client denominato "CalculatorService".This MessageFilter is added to the "routingTable1" filter table, which associates the MessageFilter with the client endpoint named "CalculatorService". Il RoutingBehavior quindi specifica che questa tabella deve essere utilizzato per indirizzare i messaggi elaborati dall'endpoint del servizio.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);  

Nota

Per impostazione predefinita, il servizio di routing valuta solo le intestazioni del messaggio.By default, the Routing Service only evaluates the headers of the message. Per consentire ai filtri di accedere al corpo del messaggio, è necessario impostare RouteOnHeadersOnly su false.To allow the filters to access the message body, you must set RouteOnHeadersOnly to false.

MulticastMulticast

Sebbene molte configurazioni del servizio di routing utilizzino logica di filtro esclusiva che indirizza i messaggi a un unico specifico endpoint, potrebbe essere necessario indirizzare il messaggio in questione a più endpoint di destinazione.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. Per il multicast di un messaggio a più destinazioni, è necessario che siano soddisfatte le condizioni seguenti:To multicast a message to multiple destinations, the following conditions must be true:

  • La forma del canale non deve essere di tipo request/reply (tuttavia può essere unidirezionale o duplex), poiché l'applicazione client può ricevere una sola risposta alla richiesta.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.

  • Più filtri devono restituire true in seguito alla valutazione del messaggio.Multiple filters must return true when evaluating the message.

Se vengono soddisfatte queste condizioni, il messaggio viene indirizzato a tutti gli endpoint di tutti i filtri che restituiscono true.If these conditions are met, the message is routed to all endpoints of all filters that evaluate to true. L'esempio seguente definisce una configurazione di routing che determina i messaggi instradati a entrambi gli endpoint se l'indirizzo dell'endpoint nel messaggio è 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);  

Elaborazione SOAPSOAP Processing

Per supportare il routing dei messaggi tra protocolli diversi, il RoutingBehavior per impostazione predefinita viene aggiunto il SoapProcessingBehavior per tutti gli endpoint client che sono indirizzati i messaggi.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. Questo comportamento crea automaticamente un nuovo MessageVersion prima di routing del messaggio all'endpoint, nonché la creazione di una matrice compatibile MessageVersion per qualsiasi documento di risposta prima di restituirlo a l'applicazione client richiedente.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.

I passaggi eseguiti per creare un nuovo MessageVersion per il messaggio in uscita sono i seguenti:The steps taken to create a new MessageVersion for the outbound message are as follows:

Elaborazione della richiestaRequest processing

  • Ottenere il MessageVersion dell'associazione/canale in uscita.Get the MessageVersion of the outbound binding/channel.

  • Ottenere il reader del corpo per il messaggio originale.Get the body reader for the original message.

  • Creare un nuovo messaggio con la stessa azione, reader del corpo e un nuovo MessageVersion.Create a new message with the same action, body reader, and a new MessageVersion.

  • Se Addressing ! = Addressing, copiare To, From, FaultTo e RelatesTo nel nuovo messaggio.If Addressing != Addressing.None, copy the To, From, FaultTo, and RelatesTo headers to the new message.

  • Copiare tutte le proprietà del messaggio nel nuovo messaggio.Copy all message properties to the new message.

  • Archiviare il messaggio di richiesta originale da usare per l'elaborazione della risposta.Store the original request message to use when processing the response.

  • Restituire il nuovo messaggio di richiesta.Return the new request message.

Elaborazione delle risposteResponse processing

  • Ottenere il MessageVersion del messaggio di richiesta originale.Get the MessageVersion of the original request message.

  • Ottenere il reader del corpo per il messaggio di risposta ricevuto.Get the body reader for the received response message.

  • Creare un nuovo messaggio di risposta con la stessa azione, reader del corpo e MessageVersion del messaggio di richiesta originale.Create a new response message with the same action, body reader, and the MessageVersion of the original request message.

  • Se Addressing ! = Addressing, copiare To, From, FaultTo e RelatesTo nel nuovo messaggio.If Addressing != Addressing.None, copy the To, From, FaultTo, and RelatesTo headers to the new message.

  • Copiare le proprietà del messaggio nel nuovo messaggio.Copy the message properties to the new message.

  • Restituire il nuovo messaggio di risposta.Return the new response message.

Per impostazione predefinita, il SoapProcessingBehavior viene aggiunta automaticamente agli endpoint client per il RoutingBehavior all'avvio del servizio; tuttavia, è possibile controllare se l'elaborazione SOAP viene aggiunto a tutti gli endpoint client tramite il SoapProcessingEnabled proprietà.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. È inoltre possibile aggiungere il comportamento direttamente a un endpoint specifico e abilitare o disabilitare tale comportamento al livello dell'endpoint se è necessario un controllo più granulare dell'elaborazione SOAP.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.

Nota

Se l'elaborazione SOAP è disabilitata per un endpoint che richiede un elemento MessageVersion diverso rispetto a quello del messaggio di richiesta originale, è necessario fornire un meccanismo personalizzato per l'esecuzione di eventuali modifiche SOAP da apportare prima dell'invio del messaggio all'endpoint di destinazione.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.

Negli esempi seguenti, il soapProcessingEnabled proprietà viene utilizzata per impedire la SoapProcessingBehavior vengano aggiunti automaticamente a tutti gli endpoint client.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;  

Configurazione dinamicaDynamic Configuration

Quando si aggiungono ulteriori endpoint client oppure occorre modificare i filtri usati per il routing dei messaggi, è necessario disporre di un modo per aggiornare dinamicamente la configurazione in fase di esecuzione allo scopo di evitare interruzioni del servizio per gli endpoint attualmente definiti per la ricezione dei messaggi tramite il servizio di routing.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. La modifica di un file di configurazione o del codice dell'applicazione host non è sempre sufficiente poiché tali metodi richiedono il riciclo dell'applicazione, il che potrebbe causare la perdita di eventuali messaggi attualmente in transito nonché tempi di inattività durante l'attesa del riavvio del servizio.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.

È possibile modificare solo il RoutingConfiguration a livello di codice.You can only modify the RoutingConfiguration programmatically. Mentre è possibile configurare inizialmente il servizio utilizzando un file di configurazione, è possibile modificare solo la configurazione in fase di esecuzione esclusivamente costruendo un nuovo RoutingConfigution e passarlo come parametro per il ApplyConfiguration (metodo) esposti dal RoutingExtension estensione del servizio.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. Eventuali messaggi attualmente in transito continuano a essere indirizzati in base alla configurazione precedente, mentre quelli ricevuti dopo la chiamata a ApplyConfiguration utilizzare la nuova configurazione.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. Nell'esempio seguente viene illustrata la creazione di un'istanza del servizio di routing e successivamente la modifica della configurazione.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);  

Nota

Per aggiornare il servizio di routing in questo modo è possibile passare solo una nuova configurazione.When updating the Routing Service in this manner it is only possible to pass a new configuration. Non è possibile modificare solo elementi scelti della configurazione corrente o aggiungere nuove voci alla configurazione corrente. È necessario creare e passare una nuova configurazione che sostituisca quella esistente.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.

Nota

Le eventuali sessioni aperte usando la configurazione precedente continuano a usare quest'ultima.Any sessions opened using the previous configuration continue using the previous configuration. La nuova configurazione viene usata solo dalle nuove sessioni.The new configuration is only used by new sessions.

Gestione degli erroriError Handling

Se si verificano eccezioni CommunicationException durante il tentativo di inviare un messaggio, viene eseguita la gestione degli errori.If any CommunicationException is encountered while attempting to send a message, error handling take place. Queste eccezioni indicano in genere che si è verificato un problema durante il tentativo di comunicare con l'endpoint client definito, ad esempio EndpointNotFoundException, ServerTooBusyException o 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. Codice di gestione degli errori verrà inoltre rilevare e tentare di ripetere l'invio un TimeoutException si verifica, ovvero un'altra eccezione comune non derivata da 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.

Quando si verifica una delle eccezioni precedenti, il servizio di routing esegue il failover a un elenco di endpoint di backup.When one of the preceding exceptions occurs, the Routing Service fails over to a list of backup endpoints. Se in tutti gli endpoint di backup si verifica un errore di comunicazione oppure un endpoint restituisce un'eccezione indicante un errore all'interno del servizio di destinazione, il servizio di routing restituisce un errore all'applicazione client.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.

Nota

La funzionalità di gestione degli errori acquisisce e gestisce le eccezioni che si verificano quando si tenta di inviare un messaggio e di chiudere un canale.The error-handling functionality captures and handles exceptions that occur when attempting to send a message and when attempting to close a channel. Il codice di gestione degli errori non può rilevare o gestire eccezioni create dagli endpoint applicazione con che cui sta comunicando; un FaultException generata da un servizio viene visualizzato nel servizio di Routing come un FaultMessage e viene propagata al client.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.

Se si verifica un errore quando il servizio di routing tenta di inoltrare un messaggio, potrebbe essere generata un'eccezione FaultException sul lato client, anziché l'eccezione EndpointNotFoundException che verrebbe generata di norma in assenza del servizio di routing.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. Un servizio di routing potrebbe quindi mascherare eventuali eccezioni e non fornire completa trasparenza a meno che non si esamino le eccezioni annidate.A routing service may thus mask exceptions and not provide full transparency unless you examine nested exceptions.

Traccia delle eccezioniTracing Exceptions

Quando si invia un messaggio a un endpoint in un elenco ha esito negativo, il servizio di Routing analizza i dati dell'eccezione risultante e la collega i dettagli dell'eccezione come una proprietà di messaggio denominata eccezioni.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. Ciò consente di mantenere i dati dell'eccezione e l'accesso utente a livello di codice tramite un controllo messaggi.This preserves the exception data and allows a user programmatic access through a message inspector. I dati dell'eccezione vengono archiviati per ciascun messaggio in un dizionario che stabilisce il mapping del nome dell'endpoint ai dettagli dell'eccezione verificatasi durante il tentativo di inviare un messaggio.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.

Endpoint di backupBackup Endpoints

Ogni voce di filtro all'interno della tabella dei filtri può facoltativamente specificare un elenco di endpoint di backup da usare in caso di errore di trasmissione durante l'invio all'endpoint primario.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. Se si verifica un errore di questo tipo, il servizio di routing tenta di trasmettere il messaggio alla prima voce nell'elenco di endpoint di backup.If such a failure occurs, the Routing Service attempts to transmit the message to the first entry in the backup endpoint list. Se durante il tentativo di invio si verifica un errore di trasmissione, viene eseguito un tentativo con l'endpoint successivo nell'elenco di quelli di backup.If this send attempt also encounters a transmission failure, the next endpoint in the backup list is tried. Il servizio di routing continua a inviare il messaggio a ogni endpoint nell'elenco finché il messaggio non viene ricevuto correttamente, tutti gli endpoint restituiscono un errore di trasmissione oppure viene restituito un errore non di trasmissione da un endpoint.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.

Negli esempi seguenti il servizio di routing viene configurato per l'uso di un elenco di backup.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);  

Modelli di errore supportatiSupported Error Patterns

Nella tabella seguente vengono descritti i modelli compatibili con l'uso di elenchi di endpoint di backup, insieme a note che descrivono dettagli specifici di gestione degli errori.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.

CriterioPattern SessioneSession TransazioneTransaction Contesto di ricezioneReceive Context Elenco di backup supportatoBackup List Supported NoteNotes
UnidirezionaleOne-Way Yes Tenta di inviare di nuovo il messaggio a un endpoint di backup.Attempts to resend the message on a backup endpoint. Se per il messaggio viene usata la trasmissione multicast, solo il messaggio nel canale con errori viene spostato alla relativa destinazione di backup.If this message is being multicast, only the message on the failed channel is moved to its backup destination.
UnidirezionaleOne-Way Segno di spuntaCheck mark NoNo Viene generata un'eccezione e viene eseguito il rollback della transazione.An exception is thrown and the transaction is rolled back.
UnidirezionaleOne-Way Segno di spuntaCheck mark YesYes Tenta di inviare di nuovo il messaggio a un endpoint di backup.Attempts to resend the message on a backup endpoint. Dopo che il messaggio viene ricevuto correttamente, completare tutti i contesti di ricezione.After the message is successfully received, complete all receive contexts. Se il messaggio non viene ricevuto correttamente da uno o più endpoint, non completare il contesto di ricezione.If the message is not successfully received by any endpoint, do not complete the receive context.

Se per il messaggio viene usata la trasmissione multicast, il contesto di ricezione viene completato solo se il messaggio viene ricevuto correttamente da almeno un endpoint (primario o di backup).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). Se nessuno degli endpoint in uno o più percorsi multicast riceve correttamente il messaggio, non completare il contesto di ricezione.If none of the endpoints in any of the multicast paths successfully receive the message, do not complete the receive context.
UnidirezionaleOne-Way Segno di spuntaCheck mark Segno di spuntaCheck mark YesYes Interrompere la transazione precedente, creare una nuova transazione e inviare nuovamente tutti i messaggi.Abort the previous transaction, create a new transaction, and resend all messages. I messaggi per i quali si verifica un errore vengono trasmessi a una destinazione di backup.Messages that encountered an error are transmitted to a backup destination.

Dopo che è stata creata una transazione in cui tutte le trasmissioni hanno esito positivo, completare i contesti di ricezione ed eseguire il commit della transazione.After a transaction has been created in which all transmissions succeed, complete the receive contexts and commit the transaction.
UnidirezionaleOne-Way Segno di spuntaCheck mark YesYes Tenta di inviare di nuovo il messaggio a un endpoint di backup.Attempts to resend the message on a backup endpoint. In un scenario multicast vengono inviati di nuovo a destinazioni di backup solo i messaggi in una sessione nella quale si è verificato un errore o in una sessione la cui chiusura ha avuto esito negativo.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.
UnidirezionaleOne-Way Segno di spuntaCheck mark Segno di spuntaCheck mark NoNo Viene generata un'eccezione e viene eseguito il rollback della transazione.An exception is thrown and the transaction is rolled back.
UnidirezionaleOne-Way Segno di spuntaCheck mark Segno di spuntaCheck mark YesYes Tenta di inviare di nuovo il messaggio a un endpoint di backup.Attempts to resend the message on a backup endpoint. Dopo che tutte le operazioni di invio dei messaggi vengono completate senza errori, la sessione indica che non sono presenti altri messaggi e il servizio di routing chiude correttamente tutti i canali di sessione in uscita, tutti i contesti di ricezione vengono completati e il canale di sessione in ingresso viene chiuso.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.
UnidirezionaleOne-Way Segno di spuntaCheck mark Segno di spuntaCheck mark Segno di spuntaCheck mark YesYes Interrompere la transazione corrente e crearne una nuova.Abort the current transaction and create a new one. Inviare di nuovo tutti i messaggi precedenti nella sessione.Resend all previous messages in the session. Dopo che è stata creata una transazione in cui tutti i messaggi vengono inviati correttamente e la sessione indica che non sono presenti altri messaggi, tutti i canali di sessione in uscita vengono chiusi, i contesti di ricezione vengono tutti completati con la transazione, il canale di sessione in ingresso viene chiuso e viene eseguito il commit della transazione.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.

Quando per le sessioni viene usata la trasmissione multicast, i messaggi senza errori vengono inviati di nuovo alla stessa destinazione, mentre quelli per i quali si è verificato un errore vengono inviati a destinazioni di backup.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.
BidirezionaleTwo-Way Yes Inviare a una destinazione di backup.Send to a backup destination. Dopo che un canale restituisce un messaggio di risposta, viene restituita la risposta al client originale.After a channel returns a response message, return the response to the original client.
BidirezionaleTwo-Way Segno di spuntaCheck mark YesYes Inviare tutti i messaggi nel canale a una destinazione di backup.Send all messages on the channel to a backup destination. Dopo che un canale restituisce un messaggio di risposta, viene restituita la risposta al client originale.After a channel returns a response message, return the response to the original client.
BidirezionaleTwo-Way Segno di spuntaCheck mark NoNo Viene generata un'eccezione e viene eseguito il rollback della transazione.An exception is thrown and the transaction is rolled back.
BidirezionaleTwo-Way Segno di spuntaCheck mark Segno di spuntaCheck mark NoNo Viene generata un'eccezione e viene eseguito il rollback della transazione.An exception is thrown and the transaction is rolled back.
DuplexDuplex NoNo La comunicazione duplex non di sessione non è attualmente supportata.Non-session duplex communication is not currently supported.
DuplexDuplex Segno di spuntaCheck mark YesYes Inviare a una destinazione di backup.Send to a backup destination.

HostingHosting

Poiché il servizio di routing viene implementato come servizio WCF, deve essere indipendente all'interno di un'applicazione o ospitato da IIS o WAS.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. È consigliabile che il servizio di routing sia ospitato in IIS, WAS o un'applicazione di servizio Windows per sfruttare le funzionalità di avvio automatico e di gestione del ciclo di vita disponibili in tali ambienti di hosting.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.

Nell'esempio seguente viene illustrato l'hosting del servizio di routing in un'applicazione.The following example demonstrates hosting the Routing Service in an application.

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

Per ospitare il servizio di routing in IIS o WAS, è necessario creare un file del servizio (con estensione svc) oppure usare l'attivazione basata sulla configurazione del servizio.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. Se si usa un file del servizio, è necessario specificare RoutingService mediante il parametro Service.When using a service file, you must specify the RoutingService using the Service parameter. L'esempio seguente contiene un servizio di esempio che può essere usato per ospitare il servizio di routing con IIS o WAS.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" %>  

Servizio di routing e rappresentazioneRouting Service and Impersonation

Il servizio di routing di WCF può essere usato con la rappresentazione sia per l'invio sia per la ricezione di messaggi.The WCF Routing Service can be used with impersonation for both sending and receiving messages. Si applicano tutti i consueti vincoli di rappresentazione di Windows.All of the usual Windows constraints of impersonation apply. Come per la configurazione delle autorizzazioni dell'account o del servizio per usare la rappresentazione durante la scrittura del servizio, questi stessi passaggi sono necessari per usare la rappresentazione con il servizio di routing.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. Per ulteriori informazioni, vedere delega e rappresentazione.For more information, see Delegation and Impersonation.

La rappresentazione con il servizio di routing richiede l'uso della rappresentazione ASP.NET in modalità di compatibilità ASP.NET o l'uso delle credenziali di Windows che sono state configurate per consentire la rappresentazione.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. Per ulteriori informazioni sulle modalità di compatibilità ASP.NET, vedere servizi WCF e ASP.NET.For more information about ASP.NET compatibility mode, see WCF Services and ASP.NET.

Avviso

Il servizio di routing di WCF non supporta la rappresentazione con l'autenticazione di base.The WCF Routing Service does not support impersonation with basic authentication.

Per usare la rappresentazione ASP.NET con il servizio di routing, abilitare la modalità di compatibilità ASP.NET nell'ambiente host del servizio.To use ASP.NET impersonation with the routing service, enable ASP.NET compatibility mode on the service hosting environment. Il servizio di routing è già stato contrassegnato come servizio che consente la modalità di compatibilità ASP.NET e la rappresentazione verrà abilitata automaticamente.The routing service has already been marked as allowing ASP.NET compatibility mode and impersonation will automatically be enabled. La rappresentazione è l'unico utilizzo supportato dell'integrazione ASP.NET con il servizio di routing.Impersonation is the only supported use of ASP.NET integration with the routing service.

Per usare la rappresentazione di credenziali di Windows con il servizio di routing è necessario configurare sia le credenziali sia il servizio.To use Windows credential impersonation with the routing service you need to configure both the credentials and the service. L'oggetto delle credenziali client (WindowsClientCredential, accessibile da ChannelFactory) definisce una proprietà AllowedImpersonationLevel che deve essere impostata per consentire la rappresentazione.The client credentials object (WindowsClientCredential, accessable from the ChannelFactory) defines an AllowedImpersonationLevel property that must be set to permit impersonation. Infine, nel servizio è necessario configurare il comportamento di ServiceAuthorizationBehavior per impostare ImpersonateCallerForAllOperations su true.Finally, on the service you need to configure the ServiceAuthorizationBehavior behavior to set ImpersonateCallerForAllOperations to true. Il servizio di routing usa questo flag per decidere se creare i client per inoltrare i messaggi con la rappresentazione abilitata.The routing service uses this flag to decide whether to create the clients for forwarding messages with impersonation enabled.

Vedere ancheSee Also

Filtri per messaggiMessage Filters
Contratti di routingRouting Contracts
Scelta di un filtroChoosing a Filter