zoukankan      html  css  js  c++  java
  • WCF客户端获取服务端异常[自定义异常]

    引言

    经过不断的摸索,询问/调试,终于学会了关于WCF客户端与服务端之间异常的处理机制,在此来记录自己的成果,用于记录与分享给需要的伙伴们。

    首先感谢【.NET技术群】里群主【轩】的大力帮助,如有需要大家也请欢迎加入【.NET技术群】(群号:199281001),一起讨论交流.NET技术(ASP.NET MVC4、MVC5/C#/WPF/WCF),但愿大家在技术上有更多的成就,废话不多说,直接开始分享。


     关于WCF服务端的原生抛出异常,我就不多说了,相信大家找到这篇博文的时候,已经尝试过诸多方法了,其中最简单的抛出原生的异常直接在[web.config]中配置[红字部分]中的false改为true就可以捕获抛出的异常

    报告意外预料之外的异常

    在你开发WCF服务时,为了在客户端程序调试,将会把服务端发生的所有异常(包括预料之内的和预料之外的)转换成SOAP faults消息传送至客户端是非常有用的。

    调试的时候将WCF服务的配置文件 设置为true,等正式上线的时候设置为false

    <behaviors>
          <serviceBehaviors>
            <behavior>
              <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
              <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
          </serviceBehaviors>
        </behaviors>

    捕获自定义异常处理

    首先,先附上自定义设计的异常类ResponseCode[异常代码]CustomException[自定义异常]

    /// <summary>
        /// 异常处理代码
        /// </summary>
        public enum ResponseCode
        {
            /// <summary>
            /// 成功  8200
            /// </summary>
            Success = 8200,
            /// <summary>
            /// 用户不存在   8300
            /// </summary>
            UserNotExist = 8300,
            /// <summary>
            /// 用户无效    8301
            /// </summary>
            UserInvalid = 8301,
            /// <summary>
            /// 密码错误    8302
            /// </summary>
            PasswordError = 8302,
            /// <summary>
            /// Token无效     8303
            /// </summary>
            TokenInvalid = 8303,
            /// <summary>
            /// 非用户绑定号码     8304
            /// </summary>
            NotBingMobile = 8304,
            /// <summary>
            /// 原始密码输入错误    8305
            /// </summary>
            OldPasswordError = 8305,
            /// <summary>
            /// 用户名已经存在
            /// </summary>
            LoginNameExist = 8321,
            /// <summary>
            /// 用户昵称已经存在
            /// </summary>
            NickNameExist = 8322,
            /// <summary>
            /// 未找到资源
            /// </summary>
            NotFound = 8404,
            /// <summary>
            /// 服务内部错误  8500
            /// </summary>
            ServerInternalError = 8500,
            /// <summary>
            /// WCF服务内部错误
            /// </summary>
            WcfServiceError = 8501,
            /// <summary>
            /// 缺少参数
            /// </summary>
            MissParam = 8600,
            /// <summary>
            /// 参数值无效
            /// </summary>
            ParamValueInvalid = 8700,
            /// <summary>
            /// 非法参数(值)
            /// </summary>
            IllegalParam = 8701,
            /// <summary>
            /// 接口返回对象为空
            /// </summary>
            ResDataIsEmpty = 8800,
            /// <summary>
            /// 数据已经存在,通用
            /// </summary>
            DataExist = 8900
        }
    ResponseCode
    /// <summary>
        /// 逻辑异常
        /// </summary>
        public class CustomException : Exception
        {
            public CustomException(ResponseCode code)
            {
                this.Code = code;
            }
    
            public CustomException(ResponseCode code, string msg)
            {
                this.Code = code;
                this.Msg = msg;
            }
    
            private string _msg;
    
            public ResponseCode Code { get; private set; }
    
    
            public string Msg
            {
                get { return _msg; }
                set { _msg = value ?? ""; }
            }
        }
    CustomException

    当我们需要客户端获取到WCF服务端的抛出的异常的时候,使用FaultException

    WCF类库在System.ServiceModel命名空间下提供了FaultException类。如果WCF服务抛出FaultException对象,WCF运行时将生成SOAP fault消息并回传给客户端程序。

    这个处理自定义异常的时候,并不需要把上述<serviceDebug includeExceptionDetailInFaults="false" />中的false改为true

    服务端抛出异常

    客户端捕获异常

    (ResponseCode)(Enum.Parse(typeof(ResponseCode),ex.Code.Name))//这一条只是将捕获的异常信息重新返回为枚举类型对象的值而已,不用枚举可以直接使用ex.Code.Name

    运行结果

    真正的谦卑是对真理持续不断的追求。
  • 相关阅读:
    CPP标准模板库 随笔
    C++ Concurrency In Action 一些重点
    标准模板库(STL)
    单链表常见操作
    android三大组件之Intent
    数组k平移三种方法(java)
    java中空字符串、null的区别
    java最大最小堆
    java学习笔记之基础知识
    笔试题集锦
  • 原文地址:https://www.cnblogs.com/huanghzm/p/4812739.html
Copyright © 2011-2022 走看看