Procedimiento para inspeccionar o modificar mensajes en el cliente

Para inspeccionar o modificar los mensajes de entrada o de salida través de un cliente de WCF, puede implementar una instancia de la interfaz System.ServiceModel.Dispatcher.IClientMessageInspector e insertarla en el tiempo de ejecución de cliente. Para obtener más información, consulte Extensión de clientes. La característica equivalente del servicio es System.ServiceModel.Dispatcher.IDispatchMessageInspector. Para obtener un ejemplo de código completo, consulte la muestra Inspectores de mensajes.

Inspeccionar o modificar los mensajes

  1. Implementar la interfaz System.ServiceModel.Dispatcher.IClientMessageInspector.

  2. Implemente System.ServiceModel.Description.IEndpointBehavior o System.ServiceModel.Description.IContractBehavior según el ámbito en el que desee insertar el inspector de mensaje de cliente. La interfaz System.ServiceModel.Description.IEndpointBehavior puede usarse para cambiar el comportamiento en el nivel de punto de conexión. La interfaz System.ServiceModel.Description.IContractBehavior puede usarse para cambiar el comportamiento en el nivel de contrato.

  3. Inserte el comportamiento antes de llamar al método ClientBase<TChannel>.Open o ICommunicationObject.Open en System.ServiceModel.ChannelFactory<TChannel>. Para obtener más información, consulte Configuración y extensión del tiempo de ejecución mediante comportamientos.

Ejemplo

Los siguientes ejemplos de código muestran, en orden:

  • Una implementación de inspector de cliente.

  • Un comportamiento del punto de conexión que inserta el inspector.

  • BehaviorExtensionElement- clase derivada que permite agregar el comportamiento en un archivo de configuración.

  • Un archivo de configuración que agrega el comportamiento del extremo que inserta el inspector de mensaje de cliente en el tiempo de ejecución del cliente.

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

Consulte también