Vorgehensweise: Überprüfen oder Ändern von Nachrichten auf dem Client

Sie können die eingehenden oder ausgehenden Nachrichten für einen WCF-Client überprüfen oder ändern, indem Sie einen System.ServiceModel.Dispatcher.IClientMessageInspector implementieren und in die Client-Laufzeit einfügen. Weitere Informationen finden Sie unter Erweitern von Clients. Die entsprechende Funktion für den Dienst ist der System.ServiceModel.Dispatcher.IDispatchMessageInspector. Ein vollständiges Codebeispiel finden Sie im Beispiel Message Inspectors.

So überprüfen oder ändern Sie Nachrichten

  1. Implementieren Sie die System.ServiceModel.Dispatcher.IClientMessageInspector-Schnittstelle.

  2. Implementieren Sie ein System.ServiceModel.Description.IEndpointBehavior oder System.ServiceModel.Description.IContractBehavior, je nach dem Bereich, in dem Sie den Clientnachrichteninspektor einfügen möchten. Mit System.ServiceModel.Description.IEndpointBehavior können Sie das Verhalten auf Endpunktebene ändern. Mit System.ServiceModel.Description.IContractBehavior können Sie das Verhalten auf Vertragsebene ändern.

  3. Fügen Sie das Verhalten ein, bevor Sie die ClientBase<TChannel>.Open-Methode oder die ICommunicationObject.Open-Methode für die System.ServiceModel.ChannelFactory<TChannel> aufrufen. Weitere Informationen: Konfigurieren und Erweitern der Laufzeit mit Verhalten.

Beispiel

Die unten aufgeführten Codebeispiele zeigen der Reihe nach Folgendes:

  • Eine Clientinspektorimplementierung.

  • Ein Endpunktverhalten, das den Inspektor einfügt.

  • Eine von BehaviorExtensionElement abgeleitete Klasse, mit der Sie das Verhalten einer Konfigurationsdatei hinzufügen können.

  • Eine Konfigurationsdatei, die das Endpunktverhalten hinzufügt, das den Clientnachrichteninspektor in die Clientlaufzeit einfügt.

// Client message inspector  
public class SimpleMessageInspector : IClientMessageInspector  
{  
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)  
    {  
        // Implement this method to inspect/modify messages after a message  
        // is received but prior to passing it back to the client
        Console.WriteLine("AfterReceiveReply called");  
    }  
  
    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)  
    {  
        // Implement this method to inspect/modify messages before they
        // are sent to the service  
        Console.WriteLine("BeforeSendRequest called");  
        return null;  
    }  
}  
// Endpoint behavior  
public class SimpleEndpointBehavior : IEndpointBehavior  
{  
    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)  
    {  
         // No implementation necessary  
    }  
  
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)  
    {  
        clientRuntime.MessageInspectors.Add(new SimpleMessageInspector());  
    }  
  
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)  
    {  
         // No implementation necessary  
    }  
  
    public void Validate(ServiceEndpoint endpoint)  
    {  
         // No implementation necessary  
    }  
}  
// Configuration element
public class SimpleBehaviorExtensionElement : BehaviorExtensionElement  
{  
    public override Type BehaviorType  
    {  
        get { return typeof(SimpleEndpointBehavior); }  
    }  
  
    protected override object CreateBehavior()  
    {  
         // Create the  endpoint behavior that will insert the message  
         // inspector into the client runtime  
        return new SimpleEndpointBehavior();  
    }  
}  
<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
    <system.serviceModel>  
        <client>  
            <endpoint address="http://localhost:8080/SimpleService/"
                      binding="wsHttpBinding"
                      behaviorConfiguration="clientInspectorsAdded"
                      contract="ServiceReference1.IService1"  
                      name="WSHttpBinding_IService1"/>  
        </client>  
  
      <behaviors>  
        <endpointBehaviors>  
          <behavior name="clientInspectorsAdded">  
            <simpleBehaviorExtension />  
          </behavior>  
        </endpointBehaviors>  
      </behaviors>  
      <extensions>  
        <behaviorExtensions>  
          <add  
            name="simpleBehaviorExtension"  
            type="SimpleServiceLib.SimpleBehaviorExtensionElement, Host, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"/>  
        </behaviorExtensions>  
      </extensions>  
    </system.serviceModel>  
</configuration>  

Siehe auch