常見(jiàn)WCF異常問(wèn)題處理方案
對(duì)于WCF也學(xué)習(xí)了一段時(shí)間,但是就是一直沒(méi)有好好學(xué)一下,但是我對(duì)它的興趣還是很大的,我覺(jué)得這個(gè)設(shè)計(jì)真是太好了,它可以統(tǒng)一 windows下的通信方式,而且僅僅通過(guò)改一下配置文件就可以改變通信方式,它是微軟對(duì)SOA的一種架構(gòu)設(shè)計(jì),可以好好學(xué)一下。
#T#dotnet3.0是在 dotnet2.0的基礎(chǔ)上加了幾個(gè)功能塊,WCF、WF、WPF、CardSpace,對(duì)于WCF說(shuō)起來(lái)也很好理它的概念,首先有服務(wù)器端程,再有就是服務(wù)器端程序宿主,最后是客戶端程序。在WCF中,如果沒(méi)有指定,服務(wù)端的WCF異常不會(huì)傳遞到客戶端,如:在等于0時(shí),客戶端根本不知道異常的原因據(jù),也即"Divsionbyzero!"WCF異常信息不會(huì)傳到客戶端。
- [ServiceContract]
- publicclassCalculatorService
- ...{
- [OperationContract]
- intDivide(inta,intb)
- ...{
- if(b==0)thrownewException(“Divisionbyzero!”);
- returna/b;
- }
- }
在最簡(jiǎn)單的情況下,我們可以使用空FaultException(它只包含一個(gè)string字符串,稱(chēng)為錯(cuò)誤原因),如下所示:
- [ServiceContract]
- publicclassCalculatorService
- ...{
- [OperationContract]
- intDivide(inta,intb)
- ...{
- if(b==0)thrownewFaultException(“Divisionbyzero!”);
- returna/b;
- }
- }
當(dāng)然,我們可以定義強(qiáng)類(lèi)型的WCF異常信息,并在方法上運(yùn)用FaultContractAttribute來(lái)指定它,如下所示:
- [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來(lái)序列化Fault相關(guān)的對(duì)象實(shí)例,即使在其上使用了XmlSerializerFormatAttribute屬性。