Wednesday, 1 August 2012

WCF Extension and Custom Behavior

We have a simple WCF WebService that has operation for Division (dividing value1 by Value2) and return this division result back to client.
Service Code:
Class implementing the Interface:
Class implementing Interface
In Divide Method, DivideByException is thrown if value2 is zero. So we are handling this exception and sending NaN back to client.
Client Side Code: Proxy is generated by using Service reference.
Client Side code
In Client Side, we are just calling Divide Method by passing Value1 and Value2.
Following is the Tracing:
In Step 2, we see the values passed by client and in Step3 we see values Received by Service.
Debug View
Now in the case when Value2 is Zero,there is a exception in Service and we are getting back NaN.
Below is the traces
Debug View
Suppose we have requirement to make Value2 as “1” when client is sending it as Zero.
To achieve this we can create custom behavior and custom behavior can be created at client side and server side.
For this case we will create Custom behavior (with extension) to change the value at client side.

So, When value2 is Zero, we need to make it “1” and send it to Service.
At Client Side, First Part would be to create Extensions. Now Extensions are the code in which we would implement the actual logic.  For this particular scenario we would use IParameterInspector extension.
We would add check for zero value in BeforeCall method of Interface. Following way.
[Keep other methods empty]
Note: There are other two extension we could use at client side i.e IClientFormatter and IClientMessageInspector 
Once the Extensions is created it is time to create custom behavior, In WCF we have 4 types of behavior
1. Service Behavior – IserviceBehavior - Only Applicable for Service.
2. EndPoint Behavior - IEndpoint Behavior
3. Contract Behavior - IContract Behavior
4. Operation Behavior – IoperationBehavior
For this scenario, we would use IOperationBehavior interface.
Because our implementation is specify to an operation. If we implement using Endpoint or Contract behavior this would impact whole Client Run time (not a particular operation). 
We have created custom runtime extension and calling this extensions from custom behavior.
Now we will add this (DivideByValueBehavior) behavior to channelFactory.

objClient.ChannelFactory.Endpoint.Contract.Operations.Find("Divide").Behaviors.Add(new DivideByalueBehavior());
Please note when we add operation behavior to ChannelFactory we have to specify the Operation (Method) Name. In this case we are calling Divide Method, so we have specify this method name.
In Traces:
In Step2 - values which client is passing and Step3 values which Service is receiving.
As you can see Service is receiving value 2 as 1 instead of 0

This way we can implement custom behaviors at client side.