『飞秋』WCF热门问题编程示例
WCF熱門問題編程示例(4):WCF客戶端如何異步調(diào)用WCF服務(wù)?
Posted on 2010-08-01 14:28 Frank Xu Lei 閱讀(296) 評(píng)論(3) 編輯 收藏 所屬分類: SOA and EAI, WCF熱門問題編程示例?
WCF熱門問題編程示例(4):WCF客戶端如何異步調(diào)用WCF服務(wù)?
How to call WCF Service asynchronously?
【1】問題描述:
WCF客戶端如何異步調(diào)用WCF服務(wù)?
How to call WCF Service asynchronously?
?
關(guān)于WCF如何實(shí)現(xiàn)異步調(diào)用的問題,論壇上出現(xiàn)了很多帖子,也有很多討論的文章,包括MSDN也給出了詳細(xì)的學(xué)習(xí)資料和示例代碼。但是很多資料過于籠統(tǒng),MSDN的例子有點(diǎn)復(fù)雜。而我們實(shí)際項(xiàng)目中,要實(shí)現(xiàn)的需求,往往十分簡(jiǎn)單,就是要在客戶端實(shí)現(xiàn)對(duì)于WCF服務(wù)操作的異步調(diào)用,也就是call WCF Service asynchronously。
【2】資料收集:
???? 這里收集一些關(guān)于WCF異步調(diào)用比較有用的參考資料和問題連接。其實(shí)關(guān)于WCF客戶端異步調(diào)用WCF服務(wù)的帖子很多,很多討論反而走了彎路,我們想要的就是簡(jiǎn)單的異步調(diào)用WCF服務(wù)操作的例子。這里給出一些比較有價(jià)值的參考資料:
如何:以異步方式調(diào)用 WCF 服務(wù)操作
How to: Call WCF Service Operations Asynchronously
ASP.NET異步調(diào)用WCF
【3】異步調(diào)用:
???? 這里需要了解的一個(gè)重要概念就是異步調(diào)用機(jī)制,在.NET里的異步調(diào)用機(jī)制是十分重要的一個(gè)知識(shí)點(diǎn)。另外就是回調(diào)的概念,這里也會(huì)使用到。.Net中的異步調(diào)用實(shí)際使用的是異步委托。異步委托將要執(zhí)行的方法提交到.Net的線程池,由線程池中的線程來(lái)執(zhí)行異步調(diào)用。
【4】解決辦法:
知道了.NET異步調(diào)用的機(jī)制以后,我們就可以來(lái)嘗試解決這個(gè)問題。這里本質(zhì)是一樣的。但編碼的過程有點(diǎn)差別。
當(dāng)然,最容易理解的就是我們自己寫代碼來(lái)實(shí)現(xiàn)異步調(diào)用。
其次,Visual Studio 2008已經(jīng)提供了這個(gè)支持。這個(gè)更加方便。我給出截圖:
?
? 我們這里給出的示例過程呢,是基于手寫客戶端異步調(diào)用代碼的。僅供參考,當(dāng)然你也可以使用Visual Studio來(lái)幫助完成這個(gè)過程。
【5】服務(wù)端代碼:
???? 服務(wù)端代碼的實(shí)現(xiàn)十分簡(jiǎn)單,這里我們依然使用早期WCF的代碼,定義一個(gè)IWCFService契約,包含一個(gè)操作SayHello,這個(gè)操作實(shí)現(xiàn)的功能,就是接受一name參數(shù),然后打印返回字符串給客戶端,為了演示,這里會(huì)打印出時(shí)間信息。具體代碼如下:
//1.服務(wù)契約
[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFService
{
??? //操作契約
??? [OperationContract]
??? string SayHello(string name);
}
//2.服務(wù)類,繼承接口。實(shí)現(xiàn)契約
public class WCFService : IWCFService
{
??? //實(shí)現(xiàn)接口定義的方法
??? 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】客戶端代碼:
??? 客戶端的實(shí)現(xiàn)大部分代碼與之前的沒有區(qū)別,為了方便,我們可以在Visual Studio生成的代碼基礎(chǔ)上修改。當(dāng)然也完全可以自己重寫。??? 這里比較重要的一點(diǎn),就是要實(shí)現(xiàn)異步調(diào)用需要的契約以及異步調(diào)用的方法。
??? 【6.1】首先這里要實(shí)現(xiàn)支持異步調(diào)用的契約:
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】支持異步調(diào)用的客戶端代理類:
???? 我們要在自己的WCFClient代理類里繼承這個(gè)契約,并提供異步操作調(diào)用的實(shí)現(xiàn),具體代碼如下:
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】測(cè)試客戶端代碼:
?????? 客戶端代碼還有一點(diǎn)比較重要的地方,就是實(shí)現(xiàn)異步回調(diào)方法,這里我們?cè)谡{(diào)用BeginSayHello方法的時(shí)候,不需要等待結(jié)果的返回,我們自己希望,WCF在調(diào)用完SayHello操作以后,執(zhí)行一些必要的工作,比如顯示返回結(jié)果,或者對(duì)返回的數(shù)據(jù)做更深入的處理,這里都需要使用到回調(diào)函數(shù)。我們也可以在回調(diào)方法里,來(lái)關(guān)閉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"));
?????????? //開始異步調(diào)用Begin Call
?????????? wcfServiceProxy.BeginSayHello(name, client.OnCompletion, null);
?????????? Console.WriteLine("press ENTER to exit…");
?????????? Console.Read();
?????? }
?????? 回調(diào)方法,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】運(yùn)行結(jié)果:
???? 這里啟動(dòng)宿主Host程序,然后運(yùn)行WCF客戶端即可,我們可以看到宿主端和客戶端,異步調(diào)用操作的時(shí)間差別,打印窗口的截圖如下:
?
飛秋官網(wǎng):http://www.freeeim.com/
總結(jié)
以上是生活随笔為你收集整理的『飞秋』WCF热门问题编程示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚函数表 对C++ 了解的人都应该知道虚
- 下一篇: 【飞秋】TCP粘包