• 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 !

  • 相关阅读:
    二叉树的建树,按层遍历,结点总数,页结点,深度以及三序非递归遍历二叉树,建立中序线索二叉树
    志愿者选拔(单调队列)
    重建二叉树(中后序求前序)
    New Year Table(几何)
    Hopscotch(细节)
    红黑树(中序二叉树)
    Linux-awk命令详解
    Python--常用模块
    Python--re模块
    Python--模块与包
  • 原文地址:https://www.cnblogs.com/sheldon-lou/p/4934082.html
Copyright © 2020-2023  润新知