Filtri avanzatiAdvanced Filters

Questo esempio viene illustrato un servizio di routing di Windows Communication Foundation (WCF).This sample demonstrates a Windows Communication Foundation (WCF) routing service. Il servizio di routing è un componente WCF che rende più semplice includere un router basato sul contenuto nell'applicazione.The routing service is a WCF component that makes it easy to include a content-based router in your application. In questo esempio adatta l'esempio WCF calcolatrice standard per comunicare tramite il servizio di routing.This sample adapts the standard WCF Calculator sample to communicate using the routing service. In questo esempio viene illustrato come definire la logica di routing basata sul contenuto tramite l'utilizzo di filtri messaggi e tabelle dei filtri messaggi.This sample shows how to define content-based routing logic through the use of message filters and message filter tables.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your computer. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\RoutingServices\AdvancedFilters

Dettagli dell'esempioSample Details

Nella tabella seguente vengono mostrati i filtri messaggi aggiunti alla tabella dei filtri messaggi del servizio di routing.The following table shows the message filters that are added to the message filter table of the routing service.

FiltroFilter RegolaRule PrioritàPriority
If (dispone di intestazione)If (has header) RoundingRounding 22
If (mostrato in Ep2)If (showed up on Ep2) RegularRegular 11
If (mostrato con Address2)If (showed up with Address2) RoundingRounding 11
If (RoundRobin1)If (RoundRobin1) RegularRegular 00
If (RoundRobin2)If (RoundRobin2) RoundingRounding 00

I filtri messaggi e le tabelle dei filtri messaggi possono essere creati e configurati tramite codice o nel file di configurazione dell'applicazione.The message filters and message filter tables can be created and configured either through code or in the application configuration file. Per questo esempio, è possibile trovare i filtri messaggi e le tabelle dei filtri messaggi definiti tramite codice nel file RoutingService\routing.cs o definiti nel file di configurazione dell'applicazione nel file RoutingService\App.config.For this sample, you can find the message filters and message filter tables defined through code in the RoutingService\routing.cs file, or defined in the application configuration file in the RoutingService\App.config file. Nei paragrafi seguenti viene descritta la creazione tramite codice di filtri messaggi e di tabelle dei filtri messaggi per questo esempio.The following paragraphs describe how the message filters and message filter tables are created for this sample through code.

In primo luogo, XPathMessageFilter effettua la ricerca dell'intestazione personalizzata.First, an XPathMessageFilter looks for the custom header. Si noti che WSHttpBinding determina una versione envelope che utilizza SOAP 1.2, pertanto l'istruzione XPath è definita per utilizzare lo spazio dei nomi di SOAP 1.2.Note that WSHttpBinding results in an envelope version using SOAP 1.2, so the XPath statement is defined to use the SOAP 1.2 namespace. Il gestore dello spazio dei nomi predefinito per XPathMessageFilter definisce già un prefisso per lo spazio dei nomi di SOAP 1.2, /s12, che è possibile utilizzare.The default namespace manager for XPathMessageFilters already defines a prefix for the SOAP 1.2 namespace, /s12, which can be used. Tuttavia, il gestore dello spazio dei nomi predefinito non dispone dello spazio dei nomi personalizzato utilizzato dal client per definire il valore dell'intestazione effettivo, pertanto il prefisso deve essere definito.However, the default namespace manager does not have the custom namespace that the client uses to define the actual header value, so that prefix must be defined. Qualsiasi messaggio visualizzato con questa intestazione corrisponde al filtro.Any message that shows up with this header matches this filter.

XPathMessageContext namespaceManager = new XPathMessageContext();  
namespaceManager.AddNamespace("custom", "http://my.custom.namespace/");  

XPathMessageFilter xpathFilter = new XPathMessageFilter("/s12:Envelope/s12:Header/custom:RoundingCalculator = 1", namespaceManager);  

Il secondo filtro è un oggetto EndpointNameMessageFilter, che corrisponde a qualsiasi messaggio ricevuto nell'oggetto calculatorEndpoint.The second filter is an EndpointNameMessageFilter, which matches any message that was received on the calculatorEndpoint. Il nome dell'endpoint viene definito quando viene creato un oggetto endpoint del servizio.The endpoint name is defined when a service endpoint object is created.

EndpointNameMessageFilter endpointNameFilter = new EndpointNameMessageFilter("calculatorEndpoint");  

Il terzo filtro è un oggetto PrefixEndpointAddressMessageFilter.The third filter is a PrefixEndpointAddressMessageFilter. Corrisponde a qualsiasi messaggio visualizzato in un endpoint con un indirizzo che corrisponde al prefisso dell'indirizzo fornito (o alla prima parte di tale indirizzo).This matches any message that showed up on an endpoint with an address that matches the address prefix (or the front portion) provided. In questo esempio il prefisso dell'indirizzo è definito come "http://localhost/routingservice/router/rounding/".In this example the address prefix is defined as "http://localhost/routingservice/router/rounding/". Ciò significa che qualsiasi messaggio in arrivo indirizzati a "http://localhost/routingservice/router/rounding/*" corrispondenti a questo filtro.This means that any incoming messages that are addressed to "http://localhost/routingservice/router/rounding/*" are matched by this filter. In questo caso, è messaggi visualizzati nell'endpoint arrotondamento calcolatrice che dispone dell'indirizzo "http://localhost/routingservice/router/rounding/calculator".In this case, it is messages that show up on the Rounding Calculator endpoint, which has the address of "http://localhost/routingservice/router/rounding/calculator".

PrefixEndpointAddressMessageFilter prefixAddressFilter = new PrefixEndpointAddressMessageFilter(new EndpointAddress("http://localhost/routingservice/router/rounding/"));  

Gli ultimi due filtri messaggi sono oggetti MessageFilter personalizzati.The last two message filters are custom MessageFilters. In questo esempio, viene utilizzato un filtro messaggi "RoundRobin".In this example, a "RoundRobin" message filter is used. Il filtro messaggi viene creato nel file RoutingService\RoundRobinMessageFilter.cs fornito.This message filter is created in the provided RoutingService\RoundRobinMessageFilter.cs file. Quando sono impostati sullo stesso gruppo, questi filtri alternano segnalazioni relative alla corrispondenza o meno con il messaggio, in modo tale che solo uno di essi alla volta restituisca true.These filters, when set to the same group, alternate between reporting that they match the message and that they do not, such that only one of them responds true at a time.

RoundRobinMessageFilter roundRobinFilter1 = new RoundRobinMessageFilter("group1");  

RoundRobinMessageFilter roundRobinFilter2 = new RoundRobinMessageFilter("group1");  

In seguito, tutti i messaggi in questione vengono aggiunti a un oggetto MessageFilterTable<TFilterData>.Next, all of those messages are added to a MessageFilterTable<TFilterData>. In questo modo, vengono specificate le priorità per influenzare l'ordine di esecuzione dei filtri nella tabella dei filtri messaggi.In doing so, priorities are specified to influence the order in which the message filter table executes the filters. Maggiore è la priorità, prima viene eseguito il filtro; minore è la priorità, più tardi viene eseguito un filtro.The higher the priority, the sooner the filter is executed; the lower the priority, the later a filter is executed. Pertanto, un filtro con priorità 2 viene eseguito prima di un filtro con priorità 1.Thus a filter at priority 2 runs before a filter at priority 1. Se non viene specificato alcun livello di priorità, viene utilizzato quello predefinito, ovvero 0.The default priority level if none is specified is 0. Una tabella dei filtri messaggi esegue tutti i filtri a un determinato livello di priorità prima di passare al livello di priorità inferiore successivo.A message filter table executes all of the filters at a given priority level before moving to the next lowest priority level. Se viene individuata una corrispondenza a un livello di priorità specifico, la tabella dei filtri messaggi interrompe la ricerca di corrispondenze per il livello di priorità inferiore successivo.If a match is found at a particular priority, then the message filter table does not continue trying to find matches at the next lower priority.

Nota

Sebbene in questo esempio venga illustrato come utilizzare le priorità dei filtri messaggi, in genere la scelta migliore e più efficace è progettare e configurare i filtri in modo che non richiedano la definizione di priorità per funzionare correttamente.While this example shows how to use message filter priorities, in general it is more performant and better design to design and configure your filters such that they do not require prioritization to function correctly.

Il primo filtro da aggiungere è il filtro XPath e la priorità viene impostata su 2.The first filter to be added is the XPath filter and its priority is set to 2. Si tratta del primo filtro messaggi in esecuzione.This is the first message filter that executes. Se tale filtro individua l'intestazione personalizzata, a prescindere dai risultati degli altri filtri, il messaggio viene indirizzato all'endpoint del servizio di calcolo che esegue l'arrotondamento.If it finds the custom header, regardless of what the results of the other filters would be, the message is routed to the Rounding Calculator endpoint.

Al livello di priorità 1, vengono aggiunti due filtri.At priority 1, two filters are added. Anche in questo caso, tali filtri vengono eseguiti solo se il filtro XPath con priorità 2 non corrisponde al messaggio.Again, these only run if the XPath filter at priority 2 does not match the message. Questi due filtri mostrano due diverse modalità per determinare dove è stato indirizzato il messaggio al momento della visualizzazione.These two filters show two different ways to determine where the message was addressed when it showed up. Poiché i due filtri verificano di fatto se il messaggio è arrivato a uno dei due endpoint, possono essere eseguiti allo stesso livello di priorità, dal momento che non restituiscono entrambi true contemporaneamente.Because the two filters effectively check to see whether the message arrived at one of the two endpoints, they can be run at the same priority level because they do not both return true at the same time.

Infine, al livello di priorità 0 (la priorità minima) vengono eseguiti i filtri messaggi RoundRobin.Finally, at Priority 0 (the lowest priority) run the RoundRobin message filters. Poiché i filtri vengono configurati con lo stesso nome del gruppo, solo uno di essi alla volta individua una corrispondenza.Because the filters are configured with the same group name, only one of them matches at a time. Dal momento che tutti i messaggi con l'intestazione personalizzata sono stati indirizzati a specifici endpoint virtualizzati, i messaggi gestiti dai filtri messaggi RoundRobin sono gli unici messaggi indirizzati all'endpoint del router predefinito senza l'intestazione personalizzata.Because all messages with the custom header have been routed and all those addressed to the specific virtualized endpoints, messages handled by the RoundRobin message filters are only messages that were addressed to the default router endpoint without the custom header. Poiché tali messaggi attivano un messaggio per ogni chiamata, metà delle operazioni viene indirizzata all'endpoint del servizio di calcolatrice normale e l'altra metà all'endpoint del servizio di calcolatrice che esegue l'arrotondamento.Because these messages switch on a message for each call, half of the operations go to the Regular Calculator endpoint and the other half go to the Rounding Calculator endpoint.

Per usare questo esempioTo use this sample

  1. Utilizzando Visual Studio 2012Visual Studio 2012, aprire AdvancedFilters.sln.Using Visual Studio 2012Visual Studio 2012, open AdvancedFilters.sln.

  2. Per aprire Esploraselezionare Esplora dal visualizzazione menu.To open Solution Explorer, select Solution Explorer from the View menu.

  3. Premere F5 o CTRL + MAIUSC + B in Visual Studio.Press F5 or CTRL+SHIFT+B in Visual Studio.

    1. Se si desidera avviare automaticamente i progetti necessari quando si preme F5, la soluzione e scegliere proprietà.If you would like to auto-launch the necessary projects when you press F5, right-click the solution and select Properties. Selezionare il progetto di avvio nodo proprietà comuni nel riquadro a sinistra.Select the Startup Project node under Common Properties in the left pane. Selezionare il più progetti di avvio pulsante di opzione e impostare tutti i progetti per il avviare azione.Select the Multiple Startup Projects radio button and set all of the projects to have the Start action.

    2. Se si compila il progetto con CTRL+MAIUSC+B, sarà necessario avviare le applicazioni seguenti:If you build the project with CTRL+SHIFT+B, you must start the following applications:

      1. Client calcolatrice (./CalculatorClient/bin/client.exe)Calculator Client (./CalculatorClient/bin/client.exe)

      2. Servizio di calcolatrice (./CalculatorService/bin/service.exe)Calculator Service (./CalculatorService/bin/service.exe)

      3. Servizio di routing relativo alla calcolatrice (./RoundingCalcService/bin/service.exe)Routing Calculator Service (./RoundingCalcService/bin/service.exe)

      4. RoutingService (./RoutingService/bin/RoutingService.exe)RoutingService (./RoutingService/bin/RoutingService.exe)

  4. Nella finestra console del client calcolatrice premere INVIO per avviare il client.In the console window of the Calculator client, press ENTER to start the client. Il client restituisce un elenco di endpoint di destinazione da selezionare.The client returns a list of destination endpoints to choose from.

  5. Scegliere un endpoint di destinazione digitando la lettera corrispondente, quindi premere INVIO.Choose a destination endpoint by typing its corresponding letter and press ENTER.

  6. In seguito, il client chiede se si desidera aggiungere un'intestazione personalizzata.Next, the client asks you if you want to add a custom header. Premere Y per Sì o N per No, quindi premere INVIO.Press Y for Yes or N for No, then press ENTER.

  7. In base alle selezioni effettuate, verranno visualizzati output diversi.Depending on the selections you made, you should see different outputs.

    1. Quello riportato di seguito è l'output restituito se è stata aggiunta un'intestazione personalizzata ai messaggi.The following is the output returned if you added a custom header to the messages.

      Add(100,15.99) = 116  
      Subtract(145,76.54) = 68.5  
      Multiply(9,81.25) = 731.3  
      Divide(22,7) = 3.1  
      
    2. Quello riportato di seguito è l'output restituito se è stato selezionato l'endpoint del servizio di calcolatrice che esegue l'arrotondamento senza un'intestazione personalizzata.The following is the output returned if you chose the Rounding Calculator endpoint without a custom header.

      Add(100,15.99) = 116  
      Subtract(145,76.54) = 68.5  
      Multiply(9,81.25) = 731.3  
      Divide(22,7) = 3.1  
      
    3. Quello riportato di seguito è l'output restituito se è stato selezionato l'endpoint del servizio di calcolatrice normale senza un'intestazione personalizzata.The following is the output returned if you chose the Regular Calculator endpoint without a custom header.

      Add(100,15.99) = 115.99  
      Subtract(145,76.54) = 68. 46  
      Multiply(9,81.25) = 731.25  
      Divide(22,7) = 3.14285714285714  
      
    4. Quello riportato di seguito è l'output restituito se è stato selezionato l'endpoint del router predefinito senza un'intestazione personalizzata.The following is the output returned if you chose the Default Router endpoint without a custom header.

      Add(100,15.99) = 116  
      Subtract(145,76.54) = 68.46  
      Multiply(9,81.25) = 731.3  
      Divide(22,7) = 3.14285714285714  
      
  8. Il servizio di calcolatrice e il servizio di calcolo che esegue l'arrotondamento stampano inoltre un log delle operazioni richiamate nelle rispettive finestre della console.The Calculator Service and the Rounding Calculator Service also prints out a log of the operations invoked to their respective console windows.

  9. Nella finestra della console client, digitare quit e premere INVIO per uscire.In the client console window, type quit and press ENTER to exit.

  10. Premere INVIO nelle finestre della console dei servizi per terminare i servizi.Press ENTER in the services console windows to terminate the services.

Configurabile tramite codice o App.configConfigurable Via Code or App.config

L'esempio proposto è configurato per l'uso di un file App.config per la definizione del comportamento del router.The sample ships configured to use an App.config file to define the router’s behavior. È inoltre possibile modificare il nome del file RoutingService\App.config affinché non venga riconosciuto e rimuovere i commenti dalla chiamata al metodo ConfigureRouterViaCode() in RoutingService\routing.cs.You can also change the name of the RoutingService\App.config file to something else so that it is not recognized and uncomment the method call to ConfigureRouterViaCode() in RoutingService\routing.cs. Entrambi i metodi restituiscono lo stesso comportamento da parte del router.Either method results in the same behavior from the router.

ScenarioScenario

In questo esempio il router agisce come router basato sul contenuto consentendo a più tipi o implementazioni di servizi di essere esposti mediante un endpoint.This sample demonstrates the router acting as a content-based router allowing multiple types or implementation of services to be exposed through one endpoint.

Scenario realeReal World Scenario

Contoso desidera virtualizzare i propri servizi per esporre pubblicamente solo un endpoint tramite il quale viene offerto l'accesso a più tipi diversi di servizi.Contoso wants to virtualize all of their services to expose only one endpoint publicly through which they offer access to multiple different types of services. In questo caso, le funzionalità di routing basate sul contenuto del servizio di routing vengono utilizzate per determinare dove devono essere inviate le richieste in entrata.In this case they utilize the routing service’s content-based routing capabilities to determine where the incoming requests should be sent.

Vedere ancheSee Also

Hosting di AppFabric ed esempi di persistenzaAppFabric Hosting and Persistence Samples