天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

WCF的問題和Using語句塊

  WCF客戶端不能用在Using語句塊中,因為它可能會拋出不可預知的異常。即使你捕獲了異常,仍有可能一直保持連接。讓我們來看看形成這一問題的歷史原因,并提出幾個補救措施。

  在.NET中,資源管理的基礎就是IDisposable和Using語句塊。除了CLR對象,.NET中一切對象均使用這些工具進行管理。因此,我們需要知道為何微軟對于WCF框架的資源管理如此一籌莫展。

  WCF客戶端的首要問題是Close/Dispose方法會拋出異常。這與框架設計指南以及IDisposable規約背道而馳,從而導致Dispose方法可以在Finally語句塊中被不安全的調用。

  更糟糕的是,只要不調用Abort,Close/Dispose方法就會一直保持連接。太多的連接打開就會帶來性能的問題,應用程序也會變得不夠穩定。

  在新聞組中,有關此問題的討論可以追溯到2006年,Brian McNamara介紹了這一設計缺陷的幕后故事。

ICommunicationObject(它是 ServiceHost,ClientBase,IChannel,IChannelFactory與IChannelListener最終繼承的對象) 總是具有關閉對象的兩個方法:(a)Close,(b)Abort。按照字面的理解,如果希望主動關閉對象,則調用Close;若要強制關閉則調用 Abort。

因此,Close()方法會接收一個Timeout參數,并包括一個異步版本(因為它可能阻塞線程),而且Close()還會拋出異常。Close拋出的異常為CommunicationException(CommunicationObjectFaultedException是其子類)與TimeoutException。

相反,Abort()并不會阻塞線程(也不會拋出任何異常),因此沒有Timeout值,也并不包含異步版本。

這兩個概念從最初的Indigo一直沿用至今[譯注:所謂至今是指Brian發表帖子的時間2006年10月25日]。就目前而言一切正常。

最初的定義為ICommunicationObject : IDisposalbe。作為一個標記接口,我們認為它可以用于通知用戶在可能的時候即刻釋放對象。然而問題卻接踵而來。

從Beta 1版本開始,我們修改了Dispose(),讓其等同于Abort()方法。一部分原因是Dispose()應該完成最起碼的必要的對象清理工作。在Beta 1中,這可能算得上是我們的頭號麻煩了。用戶可以將它們的通道(channel)對象放在using()語句塊中,緩存中任何等待被取出的消息都可能會丟失。事務無法提交,會話可能得到告知收到(ACKed)的消息等。

鑒于用戶的反饋,在Beta 2中我們又修改了實現,讓Dispose()近似等于Close()。我們知道,異常的拋出是問題之所在(部分原因在這篇帖子中已經說明),因此我們試圖 讓Dispose變得更加“聰明”。那就是說,如果當前并非Opened狀態,就會在內部調用Abort()。這仍然存在一系列問題,最主要的是你無法從可靠性角度推斷系統。Dispose仍然會拋出異常,但并非總是會通知你某些事情發生錯誤。最終,我們決定將IDisposable從 ICommunicationObject中移走。經過幾番爭辯,IDisposable在ServiceHost和ClientBase中被保留了下 來,因為從理論上講,對于多數用戶而言Dispose拋出異常仍然是可以接受的,他們更偏向于使用using()的便利性,具有該標記接口就可以更及時地 清除對象。你可能主張(我們的一部分開發人員抱有同樣的態度):應該將它從這兩個類中移走,然而好也罷歹也罷,我們終究作出了選擇。對于這個問題,你永遠 都不可能達成一致,因此我們在SDK樣例中給出了最佳實踐,那就是遵循try{Close}/catch{Abort}范式。


  補救措施

  Steve Smith提出了CloseConnection擴展方法[譯注:原文并沒有給出CloseConnection擴展方法的帖子,你可以訪問IDisposable與WCF]。在Finally語句塊中可以調用該方法,而不是調用Close,它封裝了Close/Abort邏輯。

  新聞組的發帖人bog1978建議使用C# lambda以支持創建類似Using的結構。方法接收一個新的客戶端對象,以及一個匿名方法,該方法持有的代碼與正常使用using語句塊包含的代碼完全相同。

  最后,還有一個補救措施是Erwyn Van Der Meer定義的WCF服務代理輔助類。用戶可以創建它,而不是通常的代理類,它可以糾正在關閉連接時出現的問題。一旦創建,它就會自動構建實際的代理,然后通過只讀屬性暴露它。

  查看英文原文:The Problems with WCF and the Using Block

NET技術WCF的問題和Using語句塊,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 抽插的日日液液H | c了瑜伽老师嗷嗷叫一节课视频 | 猫咪www958ii | 亚洲免费视频观看 | 中文字幕 人妻熟女 | 人妖欧美一区二区三区四区 | 后入内射国产一区二区 | 9LPORM原创自拍达人 | 亚洲理论在线a中文字幕 | 播色屋97超碰在人人 | 国产欧美国日产在线播放 | 国产在线观看成人免费视频 | 免费高清在线影片一区 | 亚洲七七久久桃花综合 | 日韩成人黄色 | 一区二区中文字幕在线观看 | 好满射太多了装不下了视频 | 久在线观看福利视频 | 娇妻在床上迎合男人 | 青青青青青青草 | 亚洲狠狠网站色噜噜 | 失禁 调教 刺激 哭喊男男 | 又硬又粗又大一区二区三区视频 | 无码中文字幕热热久久 | 国产69TV精品久久久久99 | www.av天堂网.com | 奇米精品一区二区三区在线观看 | 后入到高潮免费观看 | 中文字幕在线视频免费观看 | 高龄熟女50P | 色人格影院第四色 | 99re8在线视频精品 | 思思99精品国产自在现线 | 肉奴隷 赤坂丽在线播放 | 久久中文字幕亚洲精品最新 | 日韩综合网 | 精品极品三大极久久久久 | 国产永不无码精品AV永久 | 日韩AV成人无码久久精品老人 | JIZZ学生13| 久草在线福利资站免费视频 |