Filtro messaggi personalizzatoCustom Message Filter

In questo esempio viene illustrato come sostituire i filtri messaggi che utilizza Windows Communication Foundation (WCF) per inviare messaggi agli endpoint.This sample demonstrates how to replace the message filters that Windows Communication Foundation (WCF) uses to dispatch messages to endpoints.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.The setup procedure and build instructions for this sample are located at the end of this topic.

Quando il primo messaggio su un canale arriva al server, il server deve determinare quale degli endpoint associati all'URI (se presenti) deve ricevere il messaggio.When the first message on a channel arrives at the server, the server must determine which (if any) of the endpoints associated with that URI should receive the message. Questo processo viene controllato dagli oggetti MessageFilter allegati a EndpointDispatcher.This process is controlled by the MessageFilter objects attached to the EndpointDispatcher.

Ogni endpoint di un servizio ha un solo EndpointDispatcher.Each endpoint of a service has a single EndpointDispatcher. La classe EndpointDispatcher è dotata delle proprietà AddressFilter e ContractFilter.The EndpointDispatcher has both an AddressFilter and a ContractFilter. L'unione di questi due filtri è il filtro messaggi utilizzato per quell'endpoint.The union of these two filters is the message filter used for that endpoint.

Per impostazione predefinita, la proprietà AddressFilter per un endpoint corrisponde a qualsiasi messaggio indirizzato a un indirizzo che corrisponde alla classe EndpointAddress dell'endpoint del servizio.By default, the AddressFilter for an endpoint matches any message that is addressed to an address that matches the service endpoint's EndpointAddress. Per impostazione predefinita, il ContractFilter per un endpoint esamina l'azione del messaggio in ingresso e corrisponde a qualsiasi messaggio con un'azione che corrisponde a una delle azioni delle operazioni del contratto dell'endpoint di servizio (solo IsInitiating = trueazioni vengono considerate).By default, the ContractFilter for an endpoint inspects the action of the incoming message and matches any message with an action that corresponds to one of the actions of the service endpoint contract's operations (only IsInitiating=true actions are considered). Di conseguenza, per impostazione predefinita il filtro per un endpoint corrisponde solo se l'intestazione di destinazione del messaggio rappresenta la classe EndpointAddress dell'endpoint e l'azione del messaggio corrisponde a una delle azioni dell'operazione dell'endpoint.As a result, by default, the filter for an endpoint only matches if both the message's To header is the EndpointAddress of the endpoint and the message's action matches one of the endpoint operation's actions.

Questi filtri possono essere modificati utilizzando un comportamento.These filters can be changed using a behavior. Nell'esempio, il servizio crea un'interfaccia IEndpointBehavior che sostituisce le proprietà AddressFilter e ContractFilter nella classe EndpointDispatcher:In the sample, the service creates an IEndpointBehavior that replaces the AddressFilter and ContractFilter on the EndpointDispatcher:

class FilteringEndpointBehavior : IEndpointBehavior …  

Vengono definiti due filtri per l'indirizzo:Two address filters are defined:

// Matches any message whose To address contains the letter 'e'  
class MatchEAddressFilter : MessageFilter …  
// Matches any message whose To address does not contain the letter 'e'  
class MatchNoEAddressFilter : MessageFilter  

FilteringEndpointBehavior è reso configurabile e consente due variazioni diverse.The FilteringEndpointBehavior is made configurable and allows for two different variations.

public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement  

La variazione 1 corrisponde solo agli indirizzi che contengono una 'e' (ma che sono dotati di qualsiasi azione), mentre la variazione 2 corrisponde solo agli indirizzi a cui manca una 'e':Variation 1 matches only addresses that contain an 'e' (but that have any Action) whereas Variation 2 matches only addresses that lack an 'e':

if (Variation == 1)  
    return new FilteringEndpointBehavior(  
        new MatchEAddressFilter(), new MatchAllMessageFilter());  
else  
    return new FilteringEndpointBehavior(  
        new MatchNoEAddressFilter(), new MatchAllMessageFilter());  

Il servizio registra il nuovo comportamento nel file di configurazione:In the configuration file, the service registers the new behavior:

<extensions>  
    <behaviorExtensions>  
        <add name="filteringEndpointBehavior" type="Microsoft.ServiceModel.Samples.FilteringEndpointBehaviorExtension, service" />  
    </behaviorExtensions>  
</extensions>      

Il servizio quindi crea le configurazioni endpointBehavior per ogni variazione:Then the service creates endpointBehavior configurations for each variation:

<endpointBehaviors>  
    <behavior name="endpoint1">  
        <filteringEndpointBehavior variation="1" />  
    </behavior>  
    <behavior name="endpoint2">  
        <filteringEndpointBehavior variation="2" />  
    </behavior>  
</endpointBehaviors>  

L'endpoint del servizio infine fa riferimento a uno degli elementi behaviorConfigurations:Finally, the service's endpoint references one of the behaviorConfigurations:

<endpoint address=""  
        bindingConfiguration="ws"  
        listenUri=""   
        binding="wsHttpBinding"  
        contract="Microsoft.ServiceModel.Samples.IHello"   
        behaviorConfiguration="endpoint2" />  

L'implementazione dell'applicazione client è semplice: crea due canali sull'URI del servizio passando quel valore come il secondo parametro (via) su CreateChannel(EndpointAddress) e invia un solo messaggio su ogni canale, utilizzando però indirizzi endpoint diversi per ognuno.The implementation of the client application is straightforward; it creates two channels to the service's URI (by passing in that value as the second (via) parameter to CreateChannel(EndpointAddress) and sends a single message on each channel, but it uses different endpoint addresses for each. Di conseguenza, i messaggi in uscita dal client hanno designazioni di destinazione diverse e il server risponde appropriatamente, come dimostrato dall'output del client:As a result, the outbound messages from the client have different To designations, and the server responds accordingly, as demonstrated by the client's output:

Sending message to urn:e...  
Exception: The message with To 'urn:e' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher.  Check that the sender and receiver's EndpointAddresses agree.  

Sending message to urn:a...  
Hello  

La commutazione della variazione nel file di configurazione del server determina lo scambio del filtro e la visualizzazione da parte del client del comportamento contrario (il messaggio a urn:e ha esito positivo, mentre il messaggio a urn:a ha esito negativo).Switching the variation in the server's configuration file causes the filter to be swapped and the client sees the opposite behavior (the message to urn:e succeeds, whereas the message to urn:a fails).

<endpoint address=""  
          bindingConfiguration="ws"  
          listenUri=""   
          binding="wsHttpBinding"  
          contract="Microsoft.ServiceModel.Samples.IHello"   
          behaviorConfiguration="endpoint1" />  

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. 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\Extensibility\MessageFilter

Per impostare, compilare ed eseguire l'esempioTo set up, build, and run the sample

  1. Per compilare la soluzione, seguire le istruzioni in compilazione degli esempi di Windows Communication Foundation.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  2. Per eseguire l'esempio in una configurazione singolo computer, seguire le istruzioni in esegue gli esempi di Windows Communication Foundation.To run the sample in a single-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

  3. Per eseguire l'esempio in una configurazione con più computer, seguire le istruzioni in esegue gli esempi di Windows Communication Foundation e modificare la riga seguente nel Client.cs.To run the sample in a cross-machine configuration, follow the instructions at Running the Windows Communication Foundation Samples and change the following line in Client.cs.

    Uri serviceVia = new Uri("http://localhost/ServiceModelSamples/service.svc");  
    

    Sostituire localhost con il nome del server.Replace localhost with the name of server.

    Uri serviceVia = new Uri("http://servermachinename/ServiceModelSamples/service.svc");  
    

Vedere ancheSee Also