對WCF異常解決辦法
首先,我認為這是一個很有用的插件,如果繼續得到改進和增強,我想該插件會被更多開發者使用。對于WCF異常源碼的學習,對于我們掌握怎樣正確創建WCF異常插件工程是很有幫助的,而且也可從中學到不少編程技巧,例如委托和模板方法。希望大家一起研究下
缺省情況下,服務端發生異常,客戶端會得到一個缺省的Exception,但這個Exception實例中并不包括詳細的異常信息。只是告訴客戶端服務端不能正常工作。在服務器和客戶端模式的程序中,有些情況下,服務啟是不能完全信賴客戶端的。#t#
比如瀏覽器和web服務器之間,為了防止非法的客戶端從異常消息中獲取服務端的比較詳細的信息,使得心懷叵測之人有機可乘,所以服務啟對于異常 返回通常會比較模糊。WCF異常也采用了這種做法,缺省情況下,它返回給客戶端的異常只告知我出錯了,但不告訴人家他哪里錯了。這通常應用于客戶端來源不明的生產環境,以此保護服務程序。
如果想消息更友好一些,可以通過IncludeExceptionDetailInFaults=True來設置返回具體的異常信息,這樣就能告訴客戶端服務出錯了,并指出錯誤出在哪里。在程序開發階段或者有些應用場合,客戶端是受信任的,WCF異常為了讓客戶端能更詳盡的了解服務端到底出了什么問題。
WCF異常也支持發送詳細的錯誤消息給客戶端,這更有利于應用程序調試。而返回詳細異常有兩種方法:***種:通過在服務端的配置文件中設置:<serviceDebug includeExceptionDetailInFaults="False" />,第二種方式為通過在代碼中指定:[ServiceBehavior(IncludeExceptionDetailInFaults=true)]
在WCF異常中,還支持更詳細的異常消息,它通過自定義的異常消息FaultMessage來傳達更多的內容。WCF采用通用的Soap Fault來處理異常,并提供了FaultException和FaultException<FaultMessage>兩個類型來描述和操作異常。
通訊異常,這通常是因為鏈路的原因,比如服務沒有啟動,網絡阻塞等。這類異常是CommunicationException或者其派生類
2) 狀態異常,這類異常通常是與上文提到的實例模式相關的,當訪問了一個已經銷毀的服務器對象時便會引發此類型的異常,它們通常是ObjectDisposedException
3) 服務異常,由服務端根據具體的業務邏輯觸發,通常是FaultException 值得注意的是當拋出服務異常的時候,不同的實例模式的處理方式有所不同:
PerSession:這種模式下,拋出異常,服務實例將銷毀,客戶端拋出FaultException,客戶端代理對象無法繼續使用 PerCall:這種模式下,拋出異常,服務實例也將銷毀。客戶端代理對象無法繼續使用 Single:這種模式下,拋出異常,服務實例會照舊運行。客戶端代理無法繼續使用。