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

  • 相关阅读:
    ANDROID_MARS学习笔记_S01原始版_009_下载文件
    ANDROID_MARS学习笔记_S01原始版_009_SQLite
    ANDROID_MARS学习笔记_S01原始版_008_LooperBundle异步消息处理
    ANDROID_MARS学习笔记_S01原始版_008_Handler(异步消息处理机制)
    ANDROID_MARS学习笔记_S01原始版_007_Handler及线程的简单使用
    ANDROID_MARS学习笔记_S01原始版_006_ListView
    ANDROID_MARS学习笔记_S01原始版_005_ProgressBar
    ios Quartz 各种绘制图形用法
    ios 在UIView上画图,线条
    ios 内存管理
  • 原文地址:https://www.cnblogs.com/sheldon-lou/p/4934082.html
Copyright © 2020-2023  润新知