引言

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

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


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

报告意外预料之外的异常

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

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

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

捕获自定义异常处理

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

  1. /// <summary>
  2. /// 异常处理代码
  3. /// </summary>
  4. public enum ResponseCode
  5. {
  6. /// <summary>
  7. /// 成功 8200
  8. /// </summary>
  9. Success = ,
  10. /// <summary>
  11. /// 用户不存在 8300
  12. /// </summary>
  13. UserNotExist = ,
  14. /// <summary>
  15. /// 用户无效 8301
  16. /// </summary>
  17. UserInvalid = ,
  18. /// <summary>
  19. /// 密码错误 8302
  20. /// </summary>
  21. PasswordError = ,
  22. /// <summary>
  23. /// Token无效 8303
  24. /// </summary>
  25. TokenInvalid = ,
  26. /// <summary>
  27. /// 非用户绑定号码 8304
  28. /// </summary>
  29. NotBingMobile = ,
  30. /// <summary>
  31. /// 原始密码输入错误 8305
  32. /// </summary>
  33. OldPasswordError = ,
  34. /// <summary>
  35. /// 用户名已经存在
  36. /// </summary>
  37. LoginNameExist = ,
  38. /// <summary>
  39. /// 用户昵称已经存在
  40. /// </summary>
  41. NickNameExist = ,
  42. /// <summary>
  43. /// 未找到资源
  44. /// </summary>
  45. NotFound = ,
  46. /// <summary>
  47. /// 服务内部错误 8500
  48. /// </summary>
  49. ServerInternalError = ,
  50. /// <summary>
  51. /// WCF服务内部错误
  52. /// </summary>
  53. WcfServiceError = ,
  54. /// <summary>
  55. /// 缺少参数
  56. /// </summary>
  57. MissParam = ,
  58. /// <summary>
  59. /// 参数值无效
  60. /// </summary>
  61. ParamValueInvalid = ,
  62. /// <summary>
  63. /// 非法参数(值)
  64. /// </summary>
  65. IllegalParam = ,
  66. /// <summary>
  67. /// 接口返回对象为空
  68. /// </summary>
  69. ResDataIsEmpty = ,
  70. /// <summary>
  71. /// 数据已经存在,通用
  72. /// </summary>
  73. DataExist =
  74. }

ResponseCode

  1. /// <summary>
  2. /// 逻辑异常
  3. /// </summary>
  4. public class CustomException : Exception
  5. {
  6. public CustomException(ResponseCode code)
  7. {
  8. this.Code = code;
  9. }
  10.  
  11. public CustomException(ResponseCode code, string msg)
  12. {
  13. this.Code = code;
  14. this.Msg = msg;
  15. }
  16.  
  17. private string _msg;
  18.  
  19. public ResponseCode Code { get; private set; }
  20.  
  21. public string Msg
  22. {
  23. get { return _msg; }
  24. set { _msg = value ?? ""; }
  25. }
  26. }

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

运行结果

WCF客户端获取服务端异常[自定义异常]的更多相关文章

  1. 客户端获取服务端自定义类数据 z

    客户端获取服务端自定义类数据 问题一:超时问题,在最后获取数据的时候突然提示服务超时,服务已断开 解决:配置文件添加: <bindings> <wsHttpBinding> & ...

  2. WCF 客户端与服务端消息传输

    WCF很多需要认证信息,保证服务的安全,可以使用消息来实现 WCF 实现消息的方式: WCF中有两个接口: IClientMessageInspector [定义一个消息检查器对象,该对象可以添加到 ...

  3. WCF学习心得--客户端获取服务端自定义类数据

    因项目需求,需要一个WCF服务,赶鸭子上架吧!下面直接切入正题! 首先创建WCF应用程序,具体如何创建就不赘述了,网上一大篇,我主要说说自己遇到的问题 问题一:超时问题,在最后获取数据的时候突然提示服 ...

  4. WCF客户端与服务端通信简单入门教程

    服务端 1.新建空白解决方案,然后再空白解决方案中新建:WCF服务应用程序.建完后如图: 2.删掉自动生成的IService1.cs和Service.svc并添加WCF服务文件StudentServi ...

  5. WCF客户端和服务端配置

    服务端: <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samp ...

  6. WCF初探-10:WCF客户端调用服务

    创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: ...

  7. WCF 服务端异常封装

    通常WCF服务端异常的详细信息只有在调试环境下才暴露出来,但我目前有需求需要将一部分异常的详细信息传递到客户端,又需要保证一定的安全性. 最简单的办法当然是在服务端将异常捕获后,序列化传给客户端,但这 ...

  8. WCF心跳判断服务端及客户端是否掉线并实现重连接

    WCF心跳判断服务端及客户端是否掉线并实现重连接 本篇文章将通过一个实例实现对WCF中针对服务端以及客户端是否掉线进行判断:若掉线时服务器或客户端又在线时将实现自动重连:将通过WCF的双工知识以及相应 ...

  9. asp.net获取服务端和客户端信息

    asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...

随机推荐

  1. Activiti Modeler 5.22.0整合到Spring项目

    转载 https://blog.csdn.net/u010411264/article/details/71480354

  2. CDR 2017版本LiveSketch工具是什么,怎么用?

    LiveSketch 工具在提供手绘草图的简便性和速度的同时,结合了智能笔触调整和向量绘图.在您绘制草图时,CorelDRAW 2017会分析您输入笔触的属性.时序和空间接近度,对其进行调整并将其转换 ...

  3. JS怎样写闰年

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. 面试题sql

    查询书的价格10到20 之前显示10to20 没有显示unknown CREATE TABLE book(price INT,NAME VARCHAR(20)) SELECT NAME AS '名字' ...

  5. 多进程Socket_Server

    import socketserverclass MyServer(socketserver.BaseRequestHandler): def handle(self): #继承BaseRequest ...

  6. Java 面向对象详解

    0 引言 接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学过的基础知识的想法. 1 面向对象 面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设 ...

  7. C语言基本语法——字符串

    1.什么是字符串 2.字符串与普通字符数组的区别 3.字符串的定义方式 4.字符串的使用 5.什么是字符串数组 6.字符串数组的赋值 7.字符串数组的遍历 1.什么是字符串 • 用双引号引起来的多个字 ...

  8. [Codeforces 226E]Noble Knight's Path

    题目大意:有一棵n个节点的树,m年.初始每个节点都有.每天有如下操作:1. 给定c,让c没有(c只可能没有一次).2. 给定s,t,k,y,求从第y+1年到现在(即忽略y+1年之前的操作1),s到t的 ...

  9. shell试题

    1.按单词出现频率降序排序! 2.按字母出现频率降序排序! The months of learning in Old Boy education are the few months that I ...

  10. vuejs 基础总结(one)

    vuejs 入门知识点 1.active-class 是哪个组件的属性?嵌套路由怎么定义 (1).active-class 是 vue-router 模块的 router-link 组件的属性 (2) ...