常見WCF異常問題處理方案
對于WCF也學習了一段時間,但是就是一直沒有好好學一下,但是我對它的興趣還是很大的,我覺得這個設計真是太好了,它可以統一 windows下的通信方式,而且僅僅通過改一下配置文件就可以改變通信方式,它是微軟對SOA的一種架構設計,可以好好學一下。
#T#dotnet3.0是在 dotnet2.0的基礎上加了幾個功能塊,WCF、WF、WPF、CardSpace,對于WCF說起來也很好理它的概念,首先有服務器端程,再有就是服務器端程序宿主,最后是客戶端程序。在WCF中,如果沒有指定,服務端的WCF異常不會傳遞到客戶端,如:在等于0時,客戶端根本不知道異常的原因據,也即"Divsionbyzero!"WCF異常信息不會傳到客戶端。
- [ServiceContract]
- publicclassCalculatorService
- ...{
- [OperationContract]
- intDivide(inta,intb)
- ...{
- if(b==0)thrownewException(“Divisionbyzero!”);
- returna/b;
- }
- }
在最簡單的情況下,我們可以使用空FaultException(它只包含一個string字符串,稱為錯誤原因),如下所示:
- [ServiceContract]
- publicclassCalculatorService
- ...{
- [OperationContract]
- intDivide(inta,intb)
- ...{
- if(b==0)thrownewFaultException(“Divisionbyzero!”);
- returna/b;
- }
- }
當然,我們可以定義強類型的WCF異常信息,并在方法上運用FaultContractAttribute來指定它,如下所示:
- [DataContract]
- publicclassMathFault
- ...{
- [DataMember]
- publicstringoperation;
- [DataMember]
- publicstringdescription;
- }
- [ServiceContract]
- publicclassCalculatorService
- ...{
- [FaultContract(typeof(MathFault))]
- [OperationContract]
- intDivide(inta,intb)
- ...{
- if(b==0)
- ...{
- MathFaultm=newMathFault();
- m.operation=”/”;
- m.description=”Divisionbyzero!”;
- thrownewFaultException<MathFault>(m);
- }
- returna/b;
- }
- }
注意:不能用XmlSerializer來序列化Fault相關的對象實例,即使在其上使用了XmlSerializerFormatAttribute屬性。