前言
天气转凉,提前过冬了。感冒依旧没好,因为双休日伙食太好了,各种鱼各种肉。
第19集 创建然后抛出强类型的SOAP faults Creating and throwing strongly typed SOAP faults
上一集介绍了使用SOAP fault而不是默认的.net Exception来避免由于异常使当前的channel进入faulted状态。这集介绍如何使用强类型的SOAP faults。
总共有3个步骤:
1. 创建一个类用来表示SOAP fault,给类加上DataContract特性(因为客户端要用这个),里面的属性用DataMember特性修饰。
[DataContract] public class DivideByZeroFault { [DataMember] public string Error { get; set; } [DataMember] public string Details { get; set; } }
Error用来放异常信息,Details用来放自定义内容。
2. 给OperationContract 修饰的Divide方法加上FaultContract特性修饰。表明这个方法可能会抛DivideByZeroFault。
[ServiceContract] public interface ICalculatorService { [FaultContract(typeof(DivideByZeroFault))] [OperationContract] double Divide(int numerator, int denominator); }
3. 把原先的throw FaultException改成泛型的FaultException<T>
public class CalculatorService : ICalculatorService { public double Divide(int numerator, int denominator) { try { return numerator / denominator; } catch(DivideByZeroException ex) { throw new FaultException<DivideByZeroFault>(new DivideByZeroFault() { Error = ex.Message, Details = "Denominator can't be zero" }); } catch(Exception ex) { throw new FaultException(ex.Message, new FaultCode("Unknow Code")); } } }
如果是除零异常,则抛出FaultException<DivideByZeroFault>的,否者抛出普通的FaultException。
服务端的OK了,下面更新一下客户端调用。
首先更新一下服务引用。然后对客户端catch块做一下修改,改成如下:
private void btnCalc_Click(object sender, EventArgs e) { try { int num = int.Parse(tbNumerator.Text.Trim()), denominator = int.Parse(tbDenominator.Text.Trim()); lbRst.Text = client.Divide(num, denominator).ToString(); } catch(FaultException<DivideByZeroFault> ex) { lbRst.Text = ex.Detail.Error + " - " + ex.Detail.Details; } catch(Exception ex) { lbRst.Text = ex.Message; } }
调用测试一下:
如我们所愿。
这集好像挺简单的,讲了如何使用FaultException<T>来添加自定义的error message。
Thank You !