引言
经过不断的摸索,询问/调试,终于学会了关于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 }
/// <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 ?? ""; } } }
当我们需要客户端获取到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
运行结果