Procedura: ispezionare o modificare i messaggi sul client
È possibile ispezionare o modificare i messaggi in arrivo o in uscita su un client WCF implementando un'interfaccia System.ServiceModel.Dispatcher.IClientMessageInspector e inserendola nel runtime del client. Per altre informazioni, vedere Estensione dei client. La funzionalità equivalente nel servizio è System.ServiceModel.Dispatcher.IDispatchMessageInspector. Per un esempio di codice completo, vedere l'esempio di Controlli messaggi.
Per ispezionare o modificare i messaggi
Implementare l'interfaccia System.ServiceModel.Dispatcher.IClientMessageInspector.
Implementare System.ServiceModel.Description.IEndpointBehavior o System.ServiceModel.Description.IContractBehavior in base all'ambito in cui si desidera inserire il controllo dei messaggi client. System.ServiceModel.Description.IEndpointBehavior consente di modificare il comportamento a livello di endpoint. System.ServiceModel.Description.IContractBehavior consente di modificare il comportamento a livello di contratto.
Inserire il comportamento prima di chiamare il metodo ClientBase<TChannel>.Open o ICommunicationObject.Open su System.ServiceModel.ChannelFactory<TChannel>. Per informazioni dettagliate, vedere Configurazione ed estensione del runtime con i comportamenti.
Esempio
Negli esempi di codice seguenti vengono illustrati, nell'ordine:
Un'implementazione del controllo client.
Un comportamento dell'endpoint che inserisce il controllo.
Una classe derivata da BehaviorExtensionElementche consente di aggiungere il comportamento in un file di configurazione.
Un file di configurazione che aggiunge il comportamento dell'endpoint che inserisce il controllo dei messaggi client nel runtime del 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>