引言

经过不断的摸索,询问/调试,终于学会了关于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 = ,
/// <summary>
/// 用户不存在 8300
/// </summary>
UserNotExist = ,
/// <summary>
/// 用户无效 8301
/// </summary>
UserInvalid = ,
/// <summary>
/// 密码错误 8302
/// </summary>
PasswordError = ,
/// <summary>
/// Token无效 8303
/// </summary>
TokenInvalid = ,
/// <summary>
/// 非用户绑定号码 8304
/// </summary>
NotBingMobile = ,
/// <summary>
/// 原始密码输入错误 8305
/// </summary>
OldPasswordError = ,
/// <summary>
/// 用户名已经存在
/// </summary>
LoginNameExist = ,
/// <summary>
/// 用户昵称已经存在
/// </summary>
NickNameExist = ,
/// <summary>
/// 未找到资源
/// </summary>
NotFound = ,
/// <summary>
/// 服务内部错误 8500
/// </summary>
ServerInternalError = ,
/// <summary>
/// WCF服务内部错误
/// </summary>
WcfServiceError = ,
/// <summary>
/// 缺少参数
/// </summary>
MissParam = ,
/// <summary>
/// 参数值无效
/// </summary>
ParamValueInvalid = ,
/// <summary>
/// 非法参数(值)
/// </summary>
IllegalParam = ,
/// <summary>
/// 接口返回对象为空
/// </summary>
ResDataIsEmpty = ,
/// <summary>
/// 数据已经存在,通用
/// </summary>
DataExist =
}

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

运行结果

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. 关于CR0寄存器

    开始的时候,我认为CR0.WP如果被置位,那么内存的页面只读属性将会失效,导致可以被写入数据. 这几天正好碰到一个问题,查看了资料才发现,之前的理解不完整. 引用Intel手册中的一句话: CR0.W ...

  2. Boost Asio(一)初探

    一.简介 Boost Asio ( asynchronous input and output)关注数据的异步输入输出.Boost Asio 库提供了平台无关性的异步数据处理能力(当然它也支持同步数据 ...

  3. Unity 获取坐标函数 坐标转换函数

    获取世界坐标:transform.position 获取本地坐标:transform.localPosition 获取鼠标坐标:Input.mousePosition 获取手指触摸区域坐标:Input ...

  4. ZBrush国庆中秋大放价,优惠提前享!

    没记错的话,上次的ZBrush活动应该是17年春节吧,悄么蔫地就把端午节等一系列节日忽略了,这让苦苦等待的小伙伴们情何以堪,这试用版用的也不得劲儿! 终于等到你,ZBrush官方消息称,17年中秋国庆 ...

  5. C# 正则表达式大全(转载)

    文章导读 正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法.Regex 类表示不可变(只读)的 ...

  6. Pyhton学习——Day8

    ###########################################max函数#################################################### ...

  7. JS取出特定字符前后的字符串,针对一串字符里面的单个字符前后的字符串

    //针对一串自负里面的单个字符前后的字符串<!doctype html> <html> <head> <meta charset="utf-8&qu ...

  8. Python数据分析8-----网页文本处理

    1.去除网页的标签,如<br/> from bs4 import BeautifulrSoup preData=BeautifulSoup(data,'html.parser').get_ ...

  9. CF1037E Trips (离线+图上构造)

    题目大意:一共有n个人,每天早上会有两个人成为朋友,朋友关系不具有传递性,晚上,它们会组织旅游,如果一个人去旅游,那么他不少于$k$个朋友也要和他去旅游,求每天的最大旅游人数 一开始并没有想到反向建图 ...

  10. Linux下的进程环境

    僵尸进程.孤儿进程.守护进程.进程组.会话.前台进程组.后台进程组 1,僵尸进程 子进程结束,父进程没有明确的答复操作系统内核:已收到子进程结束的消息.此时操作系统内核会一直保存该子进程的部分PCB信 ...