『飞秋』WCF热门问题编程示例
WCF熱門問題編程示例(4):WCF客戶端如何異步調用WCF服務?
Posted on 2010-08-01 14:28 Frank Xu Lei 閱讀(296) 評論(3) 編輯 收藏 所屬分類: SOA and EAI, WCF熱門問題編程示例?
WCF熱門問題編程示例(4):WCF客戶端如何異步調用WCF服務?
How to call WCF Service asynchronously?
【1】問題描述:
WCF客戶端如何異步調用WCF服務?
How to call WCF Service asynchronously?
?
關于WCF如何實現異步調用的問題,論壇上出現了很多帖子,也有很多討論的文章,包括MSDN也給出了詳細的學習資料和示例代碼。但是很多資料過于籠統,MSDN的例子有點復雜。而我們實際項目中,要實現的需求,往往十分簡單,就是要在客戶端實現對于WCF服務操作的異步調用,也就是call WCF Service asynchronously。
【2】資料收集:
???? 這里收集一些關于WCF異步調用比較有用的參考資料和問題連接。其實關于WCF客戶端異步調用WCF服務的帖子很多,很多討論反而走了彎路,我們想要的就是簡單的異步調用WCF服務操作的例子。這里給出一些比較有價值的參考資料:
如何:以異步方式調用 WCF 服務操作
How to: Call WCF Service Operations Asynchronously
ASP.NET異步調用WCF
【3】異步調用:
???? 這里需要了解的一個重要概念就是異步調用機制,在.NET里的異步調用機制是十分重要的一個知識點。另外就是回調的概念,這里也會使用到。.Net中的異步調用實際使用的是異步委托。異步委托將要執行的方法提交到.Net的線程池,由線程池中的線程來執行異步調用。
【4】解決辦法:
知道了.NET異步調用的機制以后,我們就可以來嘗試解決這個問題。這里本質是一樣的。但編碼的過程有點差別。
當然,最容易理解的就是我們自己寫代碼來實現異步調用。
其次,Visual Studio 2008已經提供了這個支持。這個更加方便。我給出截圖:
?
? 我們這里給出的示例過程呢,是基于手寫客戶端異步調用代碼的。僅供參考,當然你也可以使用Visual Studio來幫助完成這個過程。
【5】服務端代碼:
???? 服務端代碼的實現十分簡單,這里我們依然使用早期WCF的代碼,定義一個IWCFService契約,包含一個操作SayHello,這個操作實現的功能,就是接受一name參數,然后打印返回字符串給客戶端,為了演示,這里會打印出時間信息。具體代碼如下:
//1.服務契約
[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFService
{
??? //操作契約
??? [OperationContract]
??? string SayHello(string name);
}
//2.服務類,繼承接口。實現契約
public class WCFService : IWCFService
{
??? //實現接口定義的方法
??? public string SayHello(string name)
??? {
??????? Console.WriteLine("Call Operation at {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
??????? return string.Format("Hello {0}",name);
??? }
}
【6】客戶端代碼:
??? 客戶端的實現大部分代碼與之前的沒有區別,為了方便,我們可以在Visual Studio生成的代碼基礎上修改。當然也完全可以自己重寫。??? 這里比較重要的一點,就是要實現異步調用需要的契約以及異步調用的方法。
??? 【6.1】首先這里要實現支持異步調用的契約:
public interface IWCFService {
??? [System.ServiceModel.OperationContractAttribute(Action="http://www.cnblogs.com/frank_xl/IWCFService/SayHello", ReplyAction="http://www.cnblogs.com/frank_xl/IWCFService/SayHelloResponse")]
??? string SayHello(string name);
??? [OperationContract(AsyncPattern = true)]
??? IAsyncResult BeginSayHello(string name, AsyncCallback callback, object asyncState);
??? string EndSayHello(IAsyncResult result);
}
??? 【6.2】支持異步調用的客戶端代理類:
???? 我們要在自己的WCFClient代理類里繼承這個契約,并提供異步操作調用的實現,具體代碼如下:
public string SayHello(string name) {
????????? return base.Channel.SayHello(name);
????? }
????? public IAsyncResult BeginSayHello(string name, AsyncCallback callback, object asyncState)
????? {
????????? return Channel.BeginSayHello(name, callback, asyncState);
????? }
????? public string EndSayHello(IAsyncResult result)
????? {
????????? return Channel.EndSayHello(result);
????? }
??? 【6.3】測試客戶端代碼:
?????? 客戶端代碼還有一點比較重要的地方,就是實現異步回調方法,這里我們在調用BeginSayHello方法的時候,不需要等待結果的返回,我們自己希望,WCF在調用完SayHello操作以后,執行一些必要的工作,比如顯示返回結果,或者對返回的數據做更深入的處理,這里都需要使用到回調函數。我們也可以在回調方法里,來關閉WCF客戶端,以釋放資源。
?????? 例子代碼如下:
/// <summary>
?? /// This class is defined for WCF Async Call Test
?? /// </summary>
?? public class WCFClientTest
?? {
?????? static public WCFServiceClient wcfServiceProxy = null;
?????? static void Main(string[] args)
?????? {
?????????? Console.ForegroundColor = ConsoleColor.Yellow;
?????????? WCFClientTest client = new WCFClientTest();
?????????? wcfServiceProxy = new WCFServiceClient("WSHttpBinding_IWCFService");
?????????? string name = "Frank Xu Lei";
?????????? Console.WriteLine("Client Async Call begin at {0}",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
?????????? //開始異步調用Begin Call
?????????? wcfServiceProxy.BeginSayHello(name, client.OnCompletion, null);
?????????? Console.WriteLine("press ENTER to exit…");
?????????? Console.Read();
?????? }
?????? 回調方法,Callback method
?????? void OnCompletion(IAsyncResult result)
?????? {
?????????? string value = wcfServiceProxy.EndSayHello(result);
?????????? Console.WriteLine("Returned value is {0} at {1}",value, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
?????????? result.AsyncWaitHandle.Close();
?????????? wcfServiceProxy.Close();
?????????? Console.WriteLine("Asynchronous Calls is finished");
?????? }
?? }
?
【7】運行結果:
???? 這里啟動宿主Host程序,然后運行WCF客戶端即可,我們可以看到宿主端和客戶端,異步調用操作的時間差別,打印窗口的截圖如下:
?
飛秋官網:http://www.freeeim.com/
總結
以上是生活随笔為你收集整理的『飞秋』WCF热门问题编程示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚函数表 对C++ 了解的人都应该知道虚
- 下一篇: 【飞秋】TCP粘包