欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

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


眾所周知:客戶端調(diào)用服務時,最終會將調(diào)用服務端的某個實例來完成。在WCF服務中,可以通過ServiceBehavior的InstanceContextMode設置服務實例。

InstanceContextMode定義如下:

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

既然InstanceContextMode有三個枚舉值,那就說明WCF服務端的實例有三種表現(xiàn)形式。那在平時的開發(fā)過程中,我們應遵循什么樣的原則來采用哪種實例模式。??

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

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

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、各種實例模式的表現(xiàn) ?

PerCall模式

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

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

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

PerSession模式 ?

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

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

?可以看出: PerSession模式下,每次進行服務調(diào)用,實例都會進行初始化,但是對與每個代理,服務會使用同一個實例對象來為客戶端服務。注意:同一客戶端值的是同一個代理對象(透明代理),而不是計算機

使用會話模式有三個要求:1、使用支持會話的綁定?;2、契約為會話契約;3、實例模式為:PerSession

Single模式 ??

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

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

?可以看出: Single模式下,所有客戶端共享同一個服務實例對象。
?

? 2、如何選擇服務實例模型

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

PerCall: ?

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

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

PerCall模式下,即使不停的創(chuàng)建于銷毀服務實例,也不會釋放與客戶端的連接。因為建立連接遠比服務實例的創(chuàng)建于銷毀所需資源要多的多。

?

PerSession:

?

優(yōu)點:服務端能識別不同的客戶端代理,能為相同的客戶端分配同一個實例,這個實例對象會一直保持,直到會話的結(jié)束。

缺點:整個會話期間,占用服務器資源,因此無法支持過多的客戶端,因為創(chuàng)建服務實例代價比較大;與客戶端、服務器模式一樣存在可伸縮性的問題。

維持服務端與客戶端的會話,WCF依靠傳輸層會話或者通過ws*綁定來模擬傳輸層會話。

?

?

? ? Single:

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

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

?

3、設計服務 ?

3.1、 PerCall模式

設計單調(diào)服務(PerCall模式時):雖然可以應用在任一服務上,但是在設計此類服務時還是應該注意到一些問題:由于客戶端不用關(guān)心服務端實例模型,PerCall模式下,服務也是每次都為客戶端端的調(diào)用分配新的實例對象,調(diào)用完成后就銷毀實例,因此客戶端需要進行一些狀態(tài)管理。?為此,客戶端在進行服務調(diào)用時,服務端實例對象實例化時需要從存儲介質(zhì)中獲取狀態(tài),那么每個操作對都應該有只是一個參數(shù),在進行服務調(diào)用時,通過參數(shù)來初始化狀態(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();
????????????????? // 獲取庫存數(shù)量信息
???????????????? return ? int ;
????????????}
????????}

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


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

?

? 3.2、PerSession模式

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

3.3、Single模式 ?

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

后記:讀《WCF 服務編程》后的對實例模式的重新認識。?

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


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 96自拍视频| 91免费视频网站 | 国产二区三区在线播放 | 午夜九九九 | 日本高清com | 国产在线观看福利 | 国产亚洲欧美视频 | 日本高清视频wwww色 | 久久国产免费 | 欧美一区二区三区精品国产 | 久久草在线精品视频99 | 天天艹天天 | 中文字幕第一页在线 | 精品国产一区二区三区四 | 欧美一级毛片欧美毛片视频 | 草莓视频69 | 亚洲欧洲日本天天堂在线观看 | 欧美第八页 | 91精品国产高清一区二区三区 | 玖玖精品视频在线观看 | 成人午夜视频网站 | 九九热视频精品在线观看 | 免费观看性欧美一级 | 成年人黄网站 | 日韩在线观看中文字幕 | 亚洲精品国产精品乱码不97 | 在线二区 | 久久这里只有精品免费看青草 | 6080yy免费毛片一级新视觉 | 国产成人综合一区精品 | 九九九九九九精品免费 | 国产中文字幕久久 | 九九视屏 | aaa一级毛片免费 | 国产高清毛片 | 精品小视频 | 久久久精品视频免费看 | 久久99国产亚洲精品观看 | 午夜精品视频在线看 | 色在线观看视频 | 欧美日韩性高爱潮视频 |