亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

WCF開發(fā)時(shí)如何選擇正確的實(shí)例模式(InstanceMode

系統(tǒng) 2013 0
在使用WCF實(shí)例模型時(shí),你是否思考過(guò)這幾個(gè)的問(wèn)題:
  • ”WCF中的實(shí)例模式如何正確應(yīng)用”?
  • ”使用WCF中的實(shí)例模式有何原則可以遵循嗎”??


眾所周知:客戶端調(diào)用服務(wù)時(shí),最終會(huì)將調(diào)用服務(wù)端的某個(gè)實(shí)例來(lái)完成。在WCF服務(wù)中,可以通過(guò)ServiceBehavior的InstanceContextMode設(shè)置服務(wù)實(shí)例。

InstanceContextMode定義如下:

? // ?摘要:
????
// ?????指定可用來(lái)處理包含在傳入消息中的調(diào)用的服務(wù)實(shí)例數(shù)。
???? public ? enum ?InstanceContextMode
????{
???????? // ?摘要:
????????
// ?????為每個(gè)會(huì)話創(chuàng)建一個(gè)新的?System.ServiceModel.InstanceContext?對(duì)象。
????????PerSession?=? 0 ,
???????? //
????????
// ?摘要:
????????
// ?????新的?System.ServiceModel.InstanceContext?對(duì)象在每次調(diào)用前創(chuàng)建,在調(diào)用后回收。如果信道未創(chuàng)建會(huì)話,則該值的行為就如同
????????
// ?????System.ServiceModel.InstanceContextMode.PerCall?一樣。
????????PerCall?=? 1 ,
???????? //
????????
// ?摘要:
????????
// ?????只有一個(gè)?System.ServiceModel.InstanceContext?對(duì)象用于所有傳入呼叫,并且在調(diào)用后不回收。如果服務(wù)對(duì)象不存在,則創(chuàng)建一個(gè)。
????????Single?=? 2 ,?}?

既然InstanceContextMode有三個(gè)枚舉值,那就說(shuō)明WCF服務(wù)端的實(shí)例有三種表現(xiàn)形式。那在平時(shí)的開發(fā)過(guò)程中,我們應(yīng)遵循什么樣的原則來(lái)采用哪種實(shí)例模式。??

首先看看在三種實(shí)例模式下,服務(wù)端實(shí)例具有怎樣的表現(xiàn)。?

服務(wù)實(shí)現(xiàn):在服務(wù)的構(gòu)造函數(shù)中,初始化計(jì)數(shù)器,進(jìn)行服務(wù)調(diào)用時(shí),將計(jì)數(shù)器進(jìn)行累加輸出。如下:

private ? int ?_counter;
public ?AddService()
{
????_counter?=? 0 ;
????Console.WriteLine( " Single?Mode " );
}

public ? int ?Add( int ?x,? int ?y)
{
?????Console.WriteLine( " Start?invoke... " );
?????Console.WriteLine( " Invoke?Thread?Id?is?{0} " ,?System.Threading.Thread.CurrentThread.ManagedThreadId);???????????
?????_counter++;
?????Console.WriteLine( " counter?is?:{0} " ,?_counter);
????? return ?x?+?y;
}


?

1、各種實(shí)例模式的表現(xiàn) ?

PerCall模式

客戶端調(diào)用時(shí),服務(wù)端輸出如下:

WCF開發(fā)時(shí)如何選擇正確的實(shí)例模式(InstanceMode)? ?

可以看出: PerCall 模式下,每次進(jìn)行服務(wù)調(diào)用,實(shí)例都會(huì)進(jìn)行初始化,并且實(shí)例銷毀與服務(wù)調(diào)用是同一個(gè)線程完成的。?

PerSession模式 ?

客戶端調(diào)用時(shí),服務(wù)端輸出如下:

WCF開發(fā)時(shí)如何選擇正確的實(shí)例模式(InstanceMode)? ?

?可以看出: PerSession模式下,每次進(jìn)行服務(wù)調(diào)用,實(shí)例都會(huì)進(jìn)行初始化,但是對(duì)與每個(gè)代理,服務(wù)會(huì)使用同一個(gè)實(shí)例對(duì)象來(lái)為客戶端服務(wù)。注意:同一客戶端值的是同一個(gè)代理對(duì)象(透明代理),而不是計(jì)算機(jī)

使用會(huì)話模式有三個(gè)要求:1、使用支持會(huì)話的綁定?;2、契約為會(huì)話契約;3、實(shí)例模式為:PerSession

Single模式 ??

客戶端調(diào)用時(shí),服務(wù)端輸出如下:

? ? ? ?? WCF開發(fā)時(shí)如何選擇正確的實(shí)例模式(InstanceMode)?

?可以看出: Single模式下,所有客戶端共享同一個(gè)服務(wù)實(shí)例對(duì)象。
?

? 2、如何選擇服務(wù)實(shí)例模型

?要選擇服務(wù)實(shí)例模型,首先看看這三種模型各有什么優(yōu)缺點(diǎn):

PerCall: ?

優(yōu)點(diǎn):對(duì)于客戶端調(diào)用來(lái)說(shuō),服務(wù)不用每次為服務(wù)的調(diào)用進(jìn)行狀態(tài)的同步,因?yàn)槊看芜M(jìn)行服務(wù)調(diào)用都會(huì)要求服務(wù)重新進(jìn)行資源分配;能夠?qū)蛻舳说牟l(fā)調(diào)用即使響應(yīng)。只有在并發(fā)調(diào)用的時(shí)候,服務(wù)端才會(huì)在內(nèi)存中創(chuàng)建和維護(hù)多個(gè)服務(wù)實(shí)例。在進(jìn)行服務(wù)調(diào)用時(shí),客戶端僅僅持有服務(wù)的代理,而不會(huì)占用實(shí)際的資源,只有在發(fā)生服務(wù)調(diào)用時(shí),才會(huì)獲取資源。

缺點(diǎn):對(duì)并行的調(diào)用需要自己進(jìn)行線程同步;由于每次調(diào)用都需要重建資源的狀態(tài),對(duì)性能有一定的影響。?

PerCall模式下,即使不停的創(chuàng)建于銷毀服務(wù)實(shí)例,也不會(huì)釋放與客戶端的連接。因?yàn)榻⑦B接遠(yuǎn)比服務(wù)實(shí)例的創(chuàng)建于銷毀所需資源要多的多。

?

PerSession:

?

優(yōu)點(diǎn):服務(wù)端能識(shí)別不同的客戶端代理,能為相同的客戶端分配同一個(gè)實(shí)例,這個(gè)實(shí)例對(duì)象會(huì)一直保持,直到會(huì)話的結(jié)束。

缺點(diǎn):整個(gè)會(huì)話期間,占用服務(wù)器資源,因此無(wú)法支持過(guò)多的客戶端,因?yàn)閯?chuàng)建服務(wù)實(shí)例代價(jià)比較大;與客戶端、服務(wù)器模式一樣存在可伸縮性的問(wèn)題。

維持服務(wù)端與客戶端的會(huì)話,WCF依靠傳輸層會(huì)話或者通過(guò)ws*綁定來(lái)模擬傳輸層會(huì)話。

?

?

? ? Single:

優(yōu)點(diǎn):無(wú)需考慮線程的同步問(wèn)題,客戶端對(duì)服務(wù)的調(diào)用是排隊(duì)進(jìn)行的,服務(wù)一次只能為一個(gè)客戶端進(jìn)行處理,處理完成后才能進(jìn)行為下一個(gè)客戶端服務(wù)。

缺點(diǎn):由于是串行的方式為客戶端服務(wù),所以效率比較低。服務(wù)的可伸縮性限制比較大

?

3、設(shè)計(jì)服務(wù) ?

3.1、 PerCall模式

設(shè)計(jì)單調(diào)服務(wù)(PerCall模式時(shí)):雖然可以應(yīng)用在任一服務(wù)上,但是在設(shè)計(jì)此類服務(wù)時(shí)還是應(yīng)該注意到一些問(wèn)題:由于客戶端不用關(guān)心服務(wù)端實(shí)例模型,PerCall模式下,服務(wù)也是每次都為客戶端端的調(diào)用分配新的實(shí)例對(duì)象,調(diào)用完成后就銷毀實(shí)例,因此客戶端需要進(jìn)行一些狀態(tài)管理。?為此,客戶端在進(jìn)行服務(wù)調(diào)用時(shí),服務(wù)端實(shí)例對(duì)象實(shí)例化時(shí)需要從存儲(chǔ)介質(zhì)中獲取狀態(tài),那么每個(gè)操作對(duì)都應(yīng)該有只是一個(gè)參數(shù),在進(jìn)行服務(wù)調(diào)用時(shí),通過(guò)參數(shù)來(lái)初始化狀態(tài)。

示例:

?

? ?? ?[ServiceBehavior(InstanceContextMode?=?InstanceContextMode.PerCall)]

? ? public class ?OrderService?:?IOrder,IDisposable

????{
???????? private ? int ?_counter;

???????? public ?OrderService()
????????{
????????????_counter?=? 0 ;
????????????Console.WriteLine( " perCall?Mode " );
????????????Console.WriteLine( " counter?is?{0} " ,?_counter);
????????}

???????? #region ?IOrder?Members

???????? public ? void ?Order( string ?orderId)
????????{???????????????????????
???????????? int ?amount?=?GetStore(orderId);
????????????UpdateStore(amount?-?order.Number);
????????}

???????? #endregion

???????? private ? int ?GetStore( string ?orderId)
????????{
???????????? string ?connectionString?=?ConfigurationManager.AppSettings[ " connectionString " ];
???????????? using ?( var ?connection?=? new ?SqlConnection(connectionString))
????????????{
????????????????connection.Open();
????????????????? // 獲取庫(kù)存數(shù)量信息
???????????????? return ? int ;
????????????}
????????}

???????? private ? void ?UpdateStore( int ?p)
????????{
???????????? string ?connectionString?=?ConfigurationManager.AppSettings[ " connectionString " ];
???????????? using ?( var ?connection?=? new ?SqlConnection(connectionString))
????????????{
????????????????connection.Open();
???????????????? // ?將庫(kù)存信息更新到數(shù)據(jù)庫(kù)????????????????
????????????}
????????}


???????? public ? void ?Dispose()
????????{
???????????? // 釋放資源
????????}
????}

?

? 3.2、PerSession模式

使用PreSession模式時(shí),即使WCF在一個(gè)服務(wù)實(shí)現(xiàn)中,將服務(wù)實(shí)現(xiàn)的多個(gè)契約定義為會(huì)話或者非會(huì)話模式,但最好使用一致性配置,即所有契約都支持會(huì)話,避免將不同模式的服務(wù)定義在一個(gè)服務(wù)實(shí)現(xiàn)中。?

3.3、Single模式 ?

Single模式的服務(wù)于可伸縮性有著劇烈的沖突。Single模式的服務(wù)所有的客戶端代理均使用同一個(gè)服務(wù)實(shí)例,WCF服務(wù)保證了服務(wù)狀態(tài)的同步性。存在并發(fā)性訪問(wèn)比較高的情況下,它帶來(lái)的是性能的嚴(yán)重下降。?只有在應(yīng)用場(chǎng)景中適用單例的時(shí)候使用它。通常,應(yīng)盡可能的使用其他方案來(lái)使?fàn)顟B(tài)同步,盡量避免使用Single模式.

后記:讀《WCF 服務(wù)編程》后的對(duì)實(shí)例模式的重新認(rèn)識(shí)。?

WCF開發(fā)時(shí)如何選擇正確的實(shí)例模式(InstanceMode)?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 农村苗族一级特黄a大片 | 国国产自国偷自产第38页 | 国产欧美视频在线观看 | 亚洲 自拍 另类 制服在线 | 亚洲精品98久久久久久中文字幕 | 色综合久久精品中文字幕首页 | 亚洲高清一区二区三区 | 天天干天天操天天舔 | 国产第一色 | 特级黄色毛片视频 | 欧美日韩中文一区二区三区 | a色毛片免费视频 | 男人的天堂黄 | 波多野结衣中文字幕一区二区三区 | 在线观看免费av网站 | 欧美成人精品一区二三区在线观看 | 国产一久久香蕉国产线看观看 | 香蕉视频在线观看男女 | 久久天堂夜夜一本婷婷麻豆 | 真人女人一级毛片免费视频观看 | 草草在线观看视频 | 不卡的| 久久综合伊人77777 | 欧美seav在线 | 久久亚洲人成国产精品 | 久久久在线视频精品免费观看 | 久草男人天堂 | 精品国产三级 | 国产午夜偷精品偷伦 | 欧美超级碰碰 | 日韩视频亚洲 | 久久亚洲一级α片 | yellow中文字幕久久网 | 欧美毛片大全 | 四虎在线永久精品高清 | 精品免费久久久久久成人影院 | www国产精品 | 黄色在线网站视频 | 欧美一级毛片免费大片 | 91探花视频在线观看 | 久久精品国产无限资源 |