WCF異步調(diào)用正確實現(xiàn)方法講解
WCF編程工具是.NET Framework 3.5的重要組成部分,它獨特的統(tǒng)一性,安全性以及兼容性可以幫助開發(fā)人員創(chuàng)造一個功能強大的企業(yè)級應用解決方案。其中,WCF異步調(diào)用是基于消息交換(Message Exchange)來實現(xiàn)的,和我們通常使用委托來實現(xiàn)異步調(diào)用有所不同。
WCF異步調(diào)用步驟1. 創(chuàng)建服務契約。
- [ServiceContract(SessionModeSessionMode=SessionMode.Required)]
- public interface ICalculate
- {
- [OperationContract]
- int Add(int a, int b);
- }
WCF異步調(diào)用步驟2. 為契約方法添加異步版本。
我們?yōu)?Add 方法添加了 BeginAdd 和 EndAdd 兩個在 .NET SDK 中 "常見" 的異步操作方法。注意 BeginAdd 方法中我們添加了異步聲明,而 EndAdd 方法沒有。還有就是要注意異步版本方法的參數(shù)。
- [ServiceContract(SessionModeSessionMode=SessionMode.Required)]
- public interface ICalculate
- {
- [OperationContract]
- int Add(int a, int b);
- [OperationContract(AsyncPattern=true)]
- IAsyncResult BeginAdd(int a, int b, AsyncCallback callBack,
object state);- int EndAdd(IAsyncResult ar);
- }
WCF異步調(diào)用步驟3. 實現(xiàn)服務契約。
你可能注意到了,我們并沒有創(chuàng)建 Add 的委托原型,也沒有 "真正" 實現(xiàn) BeginAdd 和 EndAdd。這是因為消息交換會 "異步" 調(diào)用 Add 方法,所有的異步版本方法只是用來創(chuàng)建消息聲明而已。
- public class CalculateService : ICalculate
- {
- public int Add(int a, int b)
- {
- Thread.Sleep(5000);
- Console.WriteLine(OperationContext.Current.SessionId);
- return a + b;
- }
- public IAsyncResult BeginAdd(int a, int b, AsyncCallback
callBack, object state)- {
- throw new Exception("The method or operation is not implemented.");
- }
- public int EndAdd(IAsyncResult ar)
- {
- throw new Exception("The method or operation is not implemented.");
- }
- }
WCF異步調(diào)用步驟4. 我們給一個完整版本,看看執(zhí)行結果。
- [ServiceContract]
- public interface ICalculate
- {
- [OperationContract]
- int Add(int a, int b);
- [OperationContract(AsyncPattern = true)]
- IAsyncResult BeginAdd(int a, int b, AsyncCallback callBack,
object state);- int EndAdd(IAsyncResult ar);
- }
- public class CalculateService : ICalculate
- {
- public int Add(int a, int b)
- {
- Console.WriteLine("服務器方法 Add 開始執(zhí)行: {0}", DateTime.Now);
- try
- {
- Thread.Sleep(5000);
- return a + b;
- }
- finally
- {
- Console.WriteLine("服務器方法 Add 執(zhí)行完成: {0}", DateTime.Now);
- }
- }
- public IAsyncResult BeginAdd(int a, int b, AsyncCallback
callBack, object state)- {
- throw new Exception("The method or operation is not implemented.");
- }
- public int EndAdd(IAsyncResult ar)
- {
- throw new Exception("The method or operation is not implemented.");
- }
- }
- public class WcfTest
- {
- public static void Test()
- {
- AppDomain.CreateDomain("Server").DoCallBack(delegate
- {
- ServiceHost host = new ServiceHost(typeof(CalculateService));
- host.AddServiceEndpoint(typeof(ICalculate), new WSHttpBinding(),
- "http://localhost:8080/calc");
- host.Open();
- });
- ICalculate channel = ChannelFactory<ICalculate>.CreateChannel
(new WSHttpBinding(),- new EndpointAddress("http://localhost:8080/calc"));
- using (channel as IDisposable)
- {
- Console.WriteLine("客戶端調(diào)用 BeginAdd: {0}", DateTime.Now);
- IAsyncResult ar = channel.BeginAdd(1, 2, delegate
{ Console.WriteLine("CallBack..."); }, null);- Console.WriteLine("客戶端調(diào)用 BeginAdd 完成: {0}", DateTime.Now);
- Console.WriteLine(channel.EndAdd(ar));
- Console.WriteLine("客戶端調(diào)用 EndAdd 完成: {0}", DateTime.Now);
- }
- }
- }
輸出:
- 客戶端調(diào)用 BeginAdd: 2007-4-1 20:56:47
- 客戶端調(diào)用 BeginAdd 完成: 2007-4-1 20:56:47
- 服務器方法 Add 開始執(zhí)行: 2007-4-1 20:56:49
- 服務器方法 Add 執(zhí)行完成: 2007-4-1 20:56:54
- 3
- 客戶端調(diào)用 EndAdd 完成: 2007-4-1 20:56:55
- CallBack...
最后在WCF異步調(diào)用步驟中需要注意的是,我們必須使用支持 Session 的 Binding 對象 (BasicHttpBinding 會拋出異常)。
【編輯推薦】