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