When an operation has no return value, and the client does not care about the
success or failure of the invocation. WCF offers one-way operations to support
this sort of fire-and-forget invocation,: once the client issues the call, WCF
generates a request message, but no correlated reply message will ever return to
the client. The one-way message exchange pattern is useful when a client needs
to send information to a service but doesn't receive a response. In reality,
it's "fire and acknowledge" because the caller receives an acknowledgement that
the message was successfully committed to the communication channel.
When a client sends a message to a service endpoint whose operation is marked as
one-way, control is returned to the caller before the service operation
completes. One-way operations are specified on the [OperationContract] attribute
by using the IsOneWay=true modifier.
Configuring One-Way Operations
The OperationContract has a property IsOneWay which is Boolean type.
- [AttributeUsage(AttributeTargets.Method)]
- public sealed class OperationContractAttribute : Attribute
- {
- public bool IsOneWay
- { get; set; }
- }
Default value of IsOneWay property is false. You need to set IsOneWay to true to
configures the method as a one-way operation:
- [ServiceContract]
- public interface IArticleService
- {
- [OperationContract(IsOneWay=true)]
- void OneWayMethod();
- }
One way Operation in WCF
- namespace WCFService
- {
- [ServiceContract]
- public interface IArticleService
- {
- [OperationContract(IsOneWay=true)]
- void OneWayMethod();
-
- [OperationContract]
- DataTable GetAllArticles();
- }
- }
-
- namespace WCFService
- {
- public class ArticleService : IArticleService
- {
-
- public void OneWayMethod()
- {
-
-
- }
-
- public DataTable GetAllArticles()
- {
- using (var Context = new ArticleDBEntities())
- {
- DataTable objDt = new DataTable();
- objDt = Context.Articles.ToList().CopyToDataTable();
- return objDt;
- }
- }
- }
- }
Both service operations in service contract are implemented same but one is
marked as one-way operation. When any client calls OneWayMethod the client-side
proxy call returns immediately and doesn't wait for the response. When the
client calls GetAllArticles the client-side proxy call blocks while the service
executes the statement.
Client implemented code
- ArticleServiceClient proxy = new ArticleServiceClient();
-
- proxy.OneWayMethod();
-
- DataTable objDt = new DataTable();
- objDt = proxy.GetAllArticles();
- proxy.Close();
You should turn on reliability for your services, even for one-way calls. This
will ensure delivery of the requests to the service
Sessionful Services with One-Way Operations
You can design a sessionful contract with one-way operations:
- [ServiceContract(SessionMode = SessionMode.Required)]
- interface IArticleService
- {
- [OperationContract(IsOneWay = true)]
- void OneWayMethod();
- }
If the client issues a one-way call and then closes the proxy while the method
executes, the client will still be blocked until the operation completes.