22 March 2014

One Way -- Operations

        In One-Way operation mode, client will send a request to the server and does not care whether it is success or failure of service execution. There is no return from the server side, it is one-way communication.

         Client will be blocked only for a moment till it dispatches its call to service. If any exception thrown by service will not reach the server.
 
        Client can continue to execute its statement, after making one-way call to server. There is no need to wait, till server execute. Sometime when one-way calls reach the service, they may not be dispatched all at once but may instead be queued up on the service side to be dispatched one at a time, according to the service's configured concurrency mode behavior.

         If the number of queued messages has exceeded the queue's capacity, the client will be blocked even if it's issued a one-way call. However, once the call is queued, the client will be unblocked and can continue executing, while the service processes the operation in the background.



Definition: 

    One-way operation can be enabled by setting IsOneWay property to true in Operation contract attribute.

[Service Contract]
Public interface IMyService
{
    [Operation Contract (IsOneWay=true)]
    Void MyMethod (EmployeeDetails emp);
}

One-Way Operations and Sessionful Services:

    Let us see the example, what will happen when you use the one-way communication with Sessionful service.

    [Service Contract (SessionMode = SessionMode. Required)]
    Interface IMyContract
    {
        [Operation Contract (IsOneWay = true)]
        Void MyMethod ();
    }
 
      As per above configuration, when client makes one-way call using MyMethod() operation and if it close the proxy. Client will be blocked until operation completes. It will be good practice, that one-way operation should be applied on per-call and singleton service.

      Suppose If you want to make use of One-way operation in Sessionful service, use in the last operation of the service which will terminate the session. This operation should not return any value.
    [Service Contract (SessionMode = SessionMode. Required)]
      Interface IMyContract
      {
        [Operation Contract]
        void MyMethod1();
 
        [Operation Contract]
        String MyMethod2 ();
 
        [Operation Contract (IsOneWay = true, IsInitiating = false,IsTerminating = true)]
        String CloseSessionService (int id);       
    }

One-Way Operations and Exceptions:

       Suppose when we are using BasicHttpBinding or WSHttpBinding, i.e. no transport session is used, if any exception throw by service will not affect the client. Client can make a call to the service using same proxy

[Service Contract]
interface IMyContract
{
   [Operation Contract(IsOneWay = true)]
   void MethodWithError( ); 
   [Operation Contract]
   void MethodWithoutError( );
}
//Client side without transport session
MyContractClient proxy = new MyContractClient( );
proxy.MethodWithError( ); //No exception is thrown from serivce
proxy.MethodWithoutError( ); //Operation will execute properly
proxy.Close( );
In the presence of transport session, any exception thrown by service will fault the client channel. Client will not be able to make new call using same proxy instance.
//Client side transport session
MyContractClient proxy = new MyContractClient( );
proxy.MethodWithError( ); 
proxy.MethodWithoutError( ); //Can not execute because channel is faulted
proxy.Close( );



No comments:

Post a Comment