Partager via


Procédure : inspecter ou modifier des messages sur le client

Vous pouvez inspecter ou modifier les messages entrants ou sortants sur un client WCF en implémentant un System.ServiceModel.Dispatcher.IClientMessageInspector et en l’insérant dans le runtime du client. Pour plus d’informations, consultez Extension des clients. La fonctionnalité équivalente sur le service est System.ServiceModel.Dispatcher.IDispatchMessageInspector. Pour obtenir un exemple de code complet, consultez l’exemple Inspecteurs de messages.

Pour inspecter ou modifier des messages

  1. Implémentez l'interface System.ServiceModel.Dispatcher.IClientMessageInspector.

  2. Implémentez System.ServiceModel.Description.IEndpointBehavior ou System.ServiceModel.Description.IContractBehavior en fonction de la portée à laquelle vous souhaitez insérer facilement l'inspecteur de message client. System.ServiceModel.Description.IEndpointBehavior vous permet de modifier le comportement au niveau du point de terminaison. System.ServiceModel.Description.IContractBehavior vous permet de modifier le comportement au niveau du contrat.

  3. Insérez le comportement avant d'appeler la méthode ClientBase<TChannel>.Open ou ICommunicationObject.Open sur System.ServiceModel.ChannelFactory<TChannel>. Pour plus d’informations, consultez Configuration et extension du runtime avec des comportements.

Exemple

Les exemples de code suivants affichent, dans l'ordre :

  • Une implémentation d'inspecteur client.

  • Un comportement de point de terminaison qui insère l'inspecteur.

  • Classe BehaviorExtensionElement dérivée qui vous permet d'ajouter le comportement dans un fichier de configuration.

  • Un fichier de configuration qui ajoute le comportement de point de terminaison pour insérer l'inspecteur de message client dans le runtime client.

// 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>  

Voir aussi