Så här gör du: Inspektera eller ändra meddelanden på klienten
Du kan inspektera eller ändra inkommande eller utgående meddelanden i en WCF-klient genom att implementera en System.ServiceModel.Dispatcher.IClientMessageInspector och infoga den i klientkörningen. Mer information finns i Utöka klienter. Motsvarande funktion i tjänsten är System.ServiceModel.Dispatcher.IDispatchMessageInspector. Ett fullständigt kodexempel finns i exemplet Meddelandekontroll .
Så här inspekterar eller ändrar du meddelanden
Implementera gränssnittet System.ServiceModel.Dispatcher.IClientMessageInspector.
Implementera en System.ServiceModel.Description.IEndpointBehavior eller System.ServiceModel.Description.IContractBehavior beroende på det omfång där du vill infoga klientmeddelandekontrollen. System.ServiceModel.Description.IEndpointBehavior gör att du kan ändra beteende på slutpunktsnivå. System.ServiceModel.Description.IContractBehavior gör att du kan ändra beteende på kontraktsnivå.
Infoga beteendet innan du anropar ClientBase<TChannel>.Open metoden eller ICommunicationObject.Open på System.ServiceModel.ChannelFactory<TChannel>. Mer information finns i Konfigurera och utöka körningen med beteenden.
Exempel
Följande kodexempel visas i ordning:
En implementering av klientkontroll.
Ett slutpunktsbeteende som infogar inspektören.
A BehaviorExtensionElement– härledd klass som gör att du kan lägga till beteendet i en konfigurationsfil.
En konfigurationsfil som lägger till slutpunktsbeteendet som infogar klientmeddelandekontrollen i klientkörningen.
// 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>