Thursday, June 14, 2012

WCF Custom behaviours


To add custom behavior to your calls to WCF services the way to go is with message inspectors

A behavior extension element HttpBlahBehaviorExtensionElement
Will be configured thus:


<client>
      <endpoint address="http://localhost/blah/blah.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IReportingService" contract="IBlah" name="BasicHttpBinding_IBlah" behaviorConfiguration=" BlahServiceBehavior">
       </endpoint>
    </client>

<extensions>
      <behaviorExtensions>
        <add name="httpBlah" type="HttpBlahBehaviorExtensionElement” />
      </behaviorExtensions>
    </extensions>
    <behaviors>
      <endpointBehaviors>
        <behavior name="BlahServiceBehavior">
          < httpBlah />
        </behavior>
      </endpointBehaviors>
    </behaviors>


The code for HttpBlahBehaviorExtensionElement
namespace Blah.MessageInspectors
{
    public class HttpBlahBehaviorExtensionElement: BehaviorExtensionElement
    {
        public override Type BehaviorType
        {
            get
            {
                return typeof(HttpBlahEndpointBehavior);
            }
        }

        protected override object CreateBehavior()
        {
            return new HttpBlahEndpointBehavior();
        }

    }
}

This references the following behavior HttpBlahEndpointBehavior which implements IEndpointBehavior
 Code thus:

  public class HttpBlahEndpointBehavior: IEndpointBehavior
    {

        public HttpBlahEndpointBehavior ()
        {
        }

        #region IEndpointBehavior Members

        public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
        {
  HttpBlahMessageInspector inspector = new       HttpBlahMessageInspector ();
            clientRuntime.MessageInspectors.Add(inspector);
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
        {
        }

        public void Validate(ServiceEndpoint endpoint)
        {
        }

        #endregion
    }

In this case we only care about applying a behavior in this case an inspector
Here is the HttpBlahMessageInspector which implements IClientMessageInspector



public class HttpBlahMessageInspector: IClientMessageInspector
    {

        #region IClientMessageInspector Members

        public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {
        }

        public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
        {

             //do something
            return null;
        }

        #endregion
    }

No comments:

Post a Comment