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
Implementar la interfaz System.ServiceModel.Dispatcher.IClientMessageInspector.
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.
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>