WCF實現將服務器端的錯誤信息返回到客戶端
2011-12-21 11:37 by Ref Tian, 398 visits, 收藏, 編輯
最近在園子裏轉看到有人對如題的實現有疑問,今天有時間就寫了項目把實現簡單的講解一下,如果你是牛逼人物那就繞道吧,哥不想浪費你的時間,現在開始:
默認WCF是不允許將服務器的異常信息返回到客戶端的(主要是客戶端不一定能夠識別clr的異常信息),如果你有這方面的需求可以通過SOAP的Fault包的形式返回異常信息,首先要做的就是設置配置文件,將默認不允許返回錯誤信息的設置改成如下:
<behaviors> <serviceBehaviors> <behavior name="Bhc"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/><!--如此設置會將服務器端得錯誤返回到客戶端,實際的發佈中需要將此項目設置成false--> </behavior> </serviceBehaviors> </behaviors>
然後定義承載信息的DataContract
[DataContract] public class Erro { [DataMember] public string Message { get; set; } }
上邊的代碼 就不用介紹了 就是一個數據合同
//服務契約定義了可以遠程調用的對象和方法 //定義服務契約 [XmlSerializerFormat]//定義序列化的方式 [ServiceContract(SessionMode = SessionMode.Allowed)]//SessionMode = SessionMode.Allowed:設置此屬性意味著可以使用會話Binding public interface IActionMain { //定義操作契約 [DataContractFormat]//定義序列化的方式 [OperationContract] string GetName(string pInc); [FaultContract(typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據 [FaultContract(typeof(DivideByZeroException))] [OperationContract] DataCollection Return(); }
在方法中定義屬性,這裏有兩種實現
1.使用自定義的錯誤類型 [FaultContract(typeof(ErroInfo.Erro))]//如果有異常就返回下面定義的數據契約的結構數據
2.使用系統的異常類型 [FaultContract(typeof(DivideByZeroException))] 在契約實現類中將異常拋出
throw new FaultException<DivideByZeroException>(new DivideByZeroException("這個是自定義的異常!"));
到此服務器端的實現完成。
下邊看客戶端的實現
配置文件不需要特殊設置,調用函數,抓取異常,代碼如下:
try { return this.Channel.Return(); } catch (FaultException<ErroInfo.Erro> exception) { throw new Exception(exception.Detail.Message); } catch(FaultException<DivideByZeroException> exception) { throw new Exception(exception.Detail.Message); }
FaultException<ErroInfo.Erro> exception:這個抓取的是定義的異常類型。
FaultException<DivideByZeroException> exception:這個抓取的是系統異常類型
注意這裏獲取異常的信息的方法是exception.Detail.Message,而不是Message。
運行效果如下:
示例代碼:Demo