WCF 入门(19)

前言

天气转凉,提前过冬了。感冒依旧没好,因为双休日伙食太好了,各种鱼各种肉。

第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;
            }
        }

调用测试一下:

QQ截图20151103190217

如我们所愿。

这集好像挺简单的,讲了如何使用FaultException<T>来添加自定义的error message。

Thank You !

原文地址:https://www.cnblogs.com/sheldon-lou/p/4934082.html