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

运行结果

posted @ 2015-09-16 11:20  JaminHuang  阅读(607)  评论(0编辑  收藏  举报