Benutzerdefinierter NachrichtenfilterCustom Message Filter

In diesem Beispiel wird gezeigt, wie die Nachrichtenfilter ersetzt werden, mit denen Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) Nachrichten auf Endpunkte verteilt.This sample demonstrates how to replace the message filters that Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) uses to dispatch messages to endpoints.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Wenn die erste Nachricht auf einem Kanal beim Server eintrifft, muss der Server bestimmen, welcher der mit diesem URI verknüpften Endpunkte (sofern zutreffend) die Nachricht erhalten soll.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. Dieser Prozess wird von den an den MessageFilter angefügten EndpointDispatcher-Objekten kontrolliert.This process is controlled by the MessageFilter objects attached to the EndpointDispatcher.

Jeder Endpunkt eines Diensts hat einen einzelnen EndpointDispatcher.Each endpoint of a service has a single EndpointDispatcher. Der EndpointDispatcher besitzt sowohl einen AddressFilter als auch einen ContractFilter.The EndpointDispatcher has both an AddressFilter and a ContractFilter. Die Verbindung dieser beiden Filter ist der für diesen Endpunkt verwendete Nachrichtenfilter.The union of these two filters is the message filter used for that endpoint.

Standardmäßig stimmt der AddressFilter für einen Endpunkt mit jeder Nachricht überein, die an eine Adresse gesendet wird, die wiederum mit der EndpointAddress des Dienstendpunkts übereinstimmt.By default, the AddressFilter for an endpoint matches any message that is addressed to an address that matches the service endpoint's EndpointAddress. Wird standardmäßig die ContractFilter für ein Endpunkt die Aktion der eingehenden Nachricht überprüft und gleicht jede Nachricht mit der Aktion, die eine der Aktionen von Vorgängen für die dienstendpunktvertrags entspricht (nur IsInitiating = trueAktionen gelten als).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). Demzufolge stimmt der Filter für einen Endpunkt standardmäßig nur überein, wenn sowohl der To-Header der Nachricht die EndpointAddress des Endpunkts ist als auch die Aktion der Nachricht mit einer der Aktionen der Endpunktvorgänge übereinstimmt.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.

Diese Filter können mit einer Verhaltensweise geändert werden.These filters can be changed using a behavior. Im folgenden Beispiel erstellt der Dienst ein IEndpointBehavior, das den AddressFilter und den ContractFilter auf dem EndpointDispatcher ersetzt:In the sample, the service creates an IEndpointBehavior that replaces the AddressFilter and ContractFilter on the EndpointDispatcher:

class FilteringEndpointBehavior : IEndpointBehavior …  

Es werden zwei Adressfilter definiert: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  

Das FilteringEndpointBehavior wird konfigurierbar gemacht und ermöglicht zwei verschiedene Varianten.The FilteringEndpointBehavior is made configurable and allows for two different variations.

public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement  

Variante 1 gleicht nur Adressen ab, die ein "e" (aber eine beliebige Aktion) enthalten, wohingegen Variante 2 nur die Adressen ohne "e" abgleicht: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());  

Der Dienst registriert das neue Verhalten in der Konfigurationsdatei:In the configuration file, the service registers the new behavior:

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

Anschließend erstellt der Dienst endpointBehavior-Konfigurationen für jede Variante: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>  

Schließlich verweist der Endpunkt des Diensts auf eine der 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" />  

Die Implementierung der Clientanwendung ist einfach. Sie erstellt zwei Kanäle zum URI des Diensts (indem der Wert als der zweite (via)-Parameter an CreateChannel(EndpointAddress) übergeben wird) und sendet eine einzelne Nachricht auf jedem Kanal, verwendet aber jeweils verschiedene Endpunktadressen.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. Infolgedessen besitzen die vom Client ausgehenden Nachrichten unterschiedliche To-Ziele, und der Server antwortet entsprechend, wie von der Ausgabe des Clients veranschaulicht: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  

Durch einen Wechsel der Variante in der Konfigurationsdatei des Servers wird der Filter getauscht, und der Client sieht das andere Verhalten (die Nachricht an urn:e ist erfolgreich, die Nachricht an urn:a jedoch nicht).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" />  

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) - und WFWF -Beispiele herunterzuladen.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)Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Extensibility\MessageFilter

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Führen Sie zum Erstellen der Projektmappe die Anweisungen im Erstellen der Windows Communication Foundation-Beispiele.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  2. Um das Beispiel in einer einzigen Computer-Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

  3. Um das Beispiel in einer computerübergreifenden Konfiguration ausführen möchten, befolgen Sie die Anweisungen unter Ausführen der Windows Communication Foundation-Beispiele , und ändern Sie die folgende Zeile in 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");  
    

    Ersetzen Sie "localhost" mit dem Namen des Servers.Replace localhost with the name of server.

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

Siehe auchSee Also