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