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.
[Service Contract (SessionMode = SessionMode. Required)]
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.
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