|
系列文章導(dǎo)航:
WCF從理論到實(shí)踐(2):決戰(zhàn)紫禁之巔
WCF從理論到實(shí)踐(3):八號(hào)當(dāng)鋪之黑色契約
WCF從理論到實(shí)踐(5):Binding細(xì)解
WCF從理論到實(shí)踐(9):實(shí)例模式和對(duì)象生命周期
WCF從理論到實(shí)踐(16):操作重載(帶視頻+ppt+源碼)
WCF從理論到實(shí)踐(17):OO大背離(帶視頻+ppt+源碼)
在上文WCF從理論到實(shí)踐:事件廣播 中,已經(jīng)實(shí)現(xiàn)了完整的WCF服務(wù)端和客戶端示例,其中也涉及到了遠(yuǎn)程對(duì)象實(shí)例創(chuàng)建的問(wèn)題。本文就進(jìn)一步的探索WCF中遠(yuǎn)程對(duì)象的創(chuàng)建模式和其生命周期
本文出發(fā)點(diǎn):
通過(guò)閱讀本文,您可以了解以下知識(shí):
- WCF中有哪幾種對(duì)象實(shí)例模式?
- 幾種實(shí)例模式下對(duì)象的生命周期?
- 各種實(shí)例模式的應(yīng)用場(chǎng)合?
- 使用不同的實(shí)例模式,需要注意的有哪些?
- 代碼不騙人,用一個(gè)小范例來(lái)看看不同實(shí)例模式的區(qū)別?
本文適合的讀者
本文適合有一定WCF基礎(chǔ)知識(shí)的初學(xué)者
WCF中有哪幾種對(duì)象實(shí)例創(chuàng)建模式?
WCF中有三種實(shí)例模式,這在.NET Framework中已經(jīng)用InstanceContextMode枚舉具體的列了出來(lái),它們分別為:PerSession,PerCall,Single
幾種實(shí)例模式下對(duì)象的生命周期?
PerCall
PerCall模式工作流程如下
- 客戶端創(chuàng)建代理對(duì)象(Proxy)
- 客戶端調(diào)用代理對(duì)象的一個(gè)契約操作,代理對(duì)象將其傳遞給服務(wù)宿主程序。
- 宿主應(yīng)用程序創(chuàng)建一新的服務(wù)契約對(duì)象,并且執(zhí)行請(qǐng)求操作
- 在執(zhí)行完請(qǐng)求操作后,如果要求有應(yīng)答,那么服務(wù)契約會(huì)給代理對(duì)象一個(gè)應(yīng)答,然后銷毀自己(如果實(shí)現(xiàn)了IDisposable,則調(diào)用Dispose())。
PerSession
PerSession模式工作的流程如下:
- 客戶端創(chuàng)建代理對(duì)象(Proxy)
- 客戶端第一次調(diào)用代理對(duì)象的一個(gè)契約操作,代理對(duì)象將其調(diào)用請(qǐng)求傳遞給服務(wù)宿主
- 宿主程序創(chuàng)建新的服務(wù)對(duì)象,并執(zhí)行請(qǐng)求操作,如果有必要,返回客戶端應(yīng)答
- 客戶端再次發(fā)出調(diào)用操作的請(qǐng)求,宿主會(huì)先判斷是否已有建立好的會(huì)話,如果存在,則不需要再創(chuàng)建新的服務(wù)對(duì)象,直接使用老對(duì)象即可。
- 在時(shí)間達(dá)到指定要求或者因一些特殊原因,會(huì)話會(huì)過(guò)期,此時(shí)服務(wù)對(duì)象銷毀。
Single
Single模式工作流程如下:
- 服務(wù)端啟動(dòng),同時(shí)創(chuàng)建服務(wù)對(duì)象
- 客戶端通過(guò)代理調(diào)用契約操作
- 第一步中創(chuàng)建的服務(wù)對(duì)象接受請(qǐng)求 ,并執(zhí)行操作,進(jìn)行必要的應(yīng)答
- 第一步創(chuàng)建的服務(wù)對(duì)象將一直保留
- 服務(wù)關(guān)閉,第一步創(chuàng)建的對(duì)象銷毀
各種實(shí)例模式的應(yīng)用場(chǎng)合?
PerCall
在傳統(tǒng)模式C/S模式的應(yīng)用程序中,通常情況下存在這樣的問(wèn)題:客戶端請(qǐng)求服務(wù)端之后,服務(wù)端并不是馬上對(duì)處理客戶端請(qǐng)求時(shí)需要的資源進(jìn)行釋放,服務(wù)端往往自作多情的認(rèn)為客戶端一定是個(gè)老主顧,會(huì)時(shí)不時(shí)來(lái)消費(fèi)一番。可他卻沒(méi)想到,有的時(shí)候,客戶端是個(gè)昧良心的家伙,就算服務(wù)端再怎么獻(xiàn)殷勤,客戶端也不買賬。而對(duì)于一些非常珍貴的資源,比如數(shù)據(jù)庫(kù)連接,文件,圖像,通訊端口等。服務(wù)這種做法往往會(huì)使這些資源長(zhǎng)期被不來(lái)消費(fèi)的客戶端空閑占用,當(dāng)有新的請(qǐng)求真正要用使用他們的時(shí)候,卻因?yàn)橘Y源耗盡而無(wú)法處理。這樣對(duì)服務(wù)端就得不償失了,而PerCall就是對(duì)上面提到問(wèn)題的一種解決方案。它采用類似快餐式的經(jīng)營(yíng)方式,當(dāng)一個(gè)請(qǐng)求操作來(lái)到的時(shí)候,再創(chuàng)建服務(wù)對(duì)象,申請(qǐng)必要資源,而當(dāng)操作完畢之后,立即銷毀對(duì)象并釋放資源,留給下一個(gè)請(qǐng)求。這就可能大大提高服務(wù)端的吞吐能力。而且WCF中默認(rèn)的實(shí)例創(chuàng)建模式就是這種。
PerSession
正如上面對(duì)PerCall的描述所說(shuō),PerSession與傳統(tǒng)的C/S模式應(yīng)用程序非常相似,它能在服務(wù)端和客戶端維護(hù)狀態(tài),當(dāng)一個(gè)服務(wù)對(duì)象創(chuàng)建之后不會(huì)馬上銷毀,而是等待客戶端再次來(lái)消費(fèi)它,那這種的壞處也說(shuō)過(guò)了,可能會(huì)浪費(fèi)寶貴的服務(wù)資源,可它也是有好處的。比如它能夠保持連接和維護(hù)狀態(tài),這在要求有回調(diào)的情況下特別重要,因?yàn)槿绻?wù)端連哪個(gè)家伙點(diǎn)的菜都忘記了怎么為客人上菜呢?還有一種情況,服務(wù)端操作不需要比較多的資源或者占用的資源也不寶貴的情況下,而卻與客戶端在不同的網(wǎng)絡(luò)中,它們之間進(jìn)行一次連接可費(fèi)了老勁,這時(shí)也適用于此種實(shí)例模式。
Single
大家經(jīng)常去理發(fā)吧?去那大的理發(fā)店,里面的理發(fā)師這家伙這個(gè)多,你隨便找個(gè)就能幫你料理了,可兄弟我比較窮酸,每次都去小區(qū)理發(fā)店,里面連洗頭,在理發(fā)就1位師傅,小區(qū)人可不少,僧多飯少,你說(shuō)咱進(jìn)去得排隊(duì)吧。人家理發(fā)的時(shí)候,咱就得邊上看著,得人家都整完了,嘿,咱就洗頭,理發(fā),吹風(fēng)來(lái)個(gè)一條龍。Single模式就像上面提到的小區(qū)理發(fā)店,人家從早晨一開(kāi)業(yè),理發(fā)師就給你準(zhǔn)備好了,您也甭挑蹦撿。伺候完你,他再伺候別人,為何要這么做?其實(shí)道理也很簡(jiǎn)單,如果理發(fā)師不喝水,不吃飯,不用管食宿,不用工錢,不會(huì)唧唧歪歪,那理發(fā)店老板娘肯定請(qǐng)1萬(wàn)個(gè)過(guò)來(lái)。可現(xiàn)實(shí)不是那樣子的,是這些理發(fā)師都要吃喝拉撒睡,還要拿俸祿,就一個(gè)幾十平米的小理發(fā)店,估計(jì)給老板娘賣了也不夠他們的呢。
使用不同的實(shí)例模式,需要注意的有哪些?
- 對(duì)于PerCall模式,一定要記住,如果服務(wù)對(duì)象中的數(shù)據(jù)沒(méi)有固化,并且不是靜態(tài)變量,那它每次操作都會(huì)被重新初始化。
- 對(duì)于PerSession模式,第一要清楚有些Binding是不能用于此種模式的,具體什么可用,什么不能用,可以查閱http://www.cnblogs.com/jillzhang/archive/2008/02/03/1063406.html 。另外,PerSession模式并不是代表狀態(tài)會(huì)自動(dòng)維護(hù),那些被設(shè)置了IsTerminating=True的操作完成的時(shí)候,也會(huì)釋放資源和銷毀對(duì)象。即使不是Ture,那如果客戶端長(zhǎng)時(shí)間不與服務(wù)端聯(lián)系,達(dá)到服務(wù)端最大忍耐限度,服務(wù)端也會(huì)變心。
- 對(duì)于Single模式,既然例外就它老哥一個(gè),就簡(jiǎn)單得多了,它能保持服務(wù)對(duì)象中的非靜態(tài)全局變量。但是特別要注意的是,如果在這種模式下的話,要特別注意線程安全的問(wèn)題,讓10個(gè)人同時(shí)讓一個(gè)理發(fā)師傅來(lái)服務(wù)。
代碼不騙人,用一個(gè)小范例來(lái)看看不同實(shí)例模式的區(qū)別?
寫了一個(gè)簡(jiǎn)單的范例,來(lái)驗(yàn)證和說(shuō)明上述的觀點(diǎn),下面就先看一下最后的運(yùn)行效果:
服務(wù)端運(yùn)行效果解圖:
從上面的解圖可以看出,在服務(wù)啟動(dòng)的時(shí)候,也就是宿主ServiceHost.Open()的時(shí)候,便已經(jīng)創(chuàng)建了Single模式的服務(wù)對(duì)象實(shí)例
客戶端運(yùn)行效果截圖:
再回過(guò)頭來(lái)看服務(wù)端效果:
本文參考資料
本文范例項(xiàng)目文件:
/Files/jillzhang/Jillzhang.InstanceCtxMode.rar
NET技術(shù):WCF從理論到實(shí)踐(9):實(shí)例模式和對(duì)象生命周期,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。