WebApi自定义全局异常过滤器及返回数据格式化
WebApi在这里就不多说了,一种轻量级的服务,应用非常广泛。我这这里主要记录下有关 WebApi的相关知识,以便日后使用。
当WebApi应用程序出现异常时,我们都会使用到异常过滤器进行日志记录,并在Global全局文件中注册,过滤器是一种AOP设计思想,即面向切面编程,其跟主业务无关,可以减少项目中的代码量以及降低各模块之间的耦合度。首先是ExceptionFilterAttribute抽象类,重写其中的OnException方法去自定义自己的异常过滤器。直接上代码。
/// <summary>
/// 自定义程序异常过滤器
/// </summary>
public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
/// <summary>
/// NLog日志记录
/// </summary>
private static Logger logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name); /// <summary>
/// 异常处理
/// </summary>
/// <param name="context"></param>
public override void OnException(HttpActionExecutedContext context)
{ var ex = context.Exception.InnerException == null ? context.Exception : context.Exception.InnerException;
//记录日志错误信息
logger.Error($"{context.ActionContext.ControllerContext.ControllerDescriptor.ControllerType.FullName}." +
$"{context.ActionContext.ActionDescriptor.ActionName}{Environment.NewLine}" +
$"Arguments: {JsonConvert.SerializeObject(context.ActionContext.ActionArguments)}{Environment.NewLine}" +
$"Message:{ex.ToString()}{Environment.NewLine}");
//返回客户端异常信息
context.Response = context.Request.CreateResponse(HttpStatusCode.OK,new WebApiFitlerResult() {
code = WebApiFitlerResult.CodeEnumType.程序异常,
msg = ex.Message
});
}
}
其中WebApiFitlerResult类为博主自定的错误信息类,包含错误状态码和错误信息属性。
最后在Global文件中的Application_Start管道方法中的全局配置中注册。代码如下。(此代码包含返回数据格式化设置和跨域设置)
protected void Application_Start()
{
//移除xml返回格式
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
json.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
json.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
//返回空值设置
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.None
json.SerializerSettings.ContractResolver = new DefaultContractResolver(); //全局注册
GlobalConfiguration.Configure(x=> {
//跨域
x.EnableCors(new EnableCorsAttribute("*", "*", "*"));
//异常过滤器注册
x.Filters.Add(new CustomExceptionFilterAttribute());
//webapi路由注册
x.MapHttpAttributeRoutes();
});
}
我这边WebApi项目中返回的数据只有json格式,所以就把xml返回格式删除了。
WebApi自定义全局异常过滤器及返回数据格式化的更多相关文章
- @Valid 数据校验 + 自定义全局异常信息
关于javax.validation.Validator校验的使用 对于要校验的实体类:其需要校验的字段上需要添加注解 实际例子 使用:首先要拿到 validator的子类 Validator val ...
- MVC与WebApi中的异常过滤器
一.MVC的异常过滤器 1.自定义MVC异常过滤器 创建一个类,继承HandleErrorAttribute即可,如果不需要作为特性使用直接实现IExceptionFilter接口即可, 注意,该 ...
- MVC 全局异常过滤器HandleErrorAttribute
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- Yii自定义全局异常,接管系统异常
Yii自定义全局异常,接管系统异常 一般自己的框架都会使用一些自己封装的全局异常,那么在系统发生异常突发情况时候,即可自主的做一些异常机制处理,例如发送短信.发送邮件通知系统维护人员或者以更加友好的方 ...
- ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用
中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...
- springMVC自定义全局异常
SpringMVC通过HandlerExceptionResolver处理程序异常,包括Handler映射,数据绑定以及目标方法执行时所发生的异常. SpringMVC中默认是没有加装载Handler ...
- Mbp通过筛选器和中间件实现异常,日志,事务及接口返回数据格式化aop处理.
Mbp应用服务层的AOP实现 实现方法:asp.net core mvc 筛选器 + 中间件 日志,事务,和接口返回结果统一格式化采用操作筛选器,而异常处理采用中间件来处理. 最开始,我是打算用aut ...
- 一、WebAPI自定义过滤器的使用
一.WebAPI自定义过滤器的使用 1.注册过滤器 using System.Web.Http; using KYINT.WebAPIService.Handler; namespace KYINT. ...
- asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...
随机推荐
- HDU1754 && HDU1166 线段树模板题
HDU1754 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 题目分析:对于给出的一个很长的区间,对其进行单点更新值和区间求最大值的操作,由于 ...
- 目标检测论文解读6——SSD
背景 R-CNN系列算法检测速度不够快,YOLO v1检测准确率较低,而且无法检测到密集目标. 方法 SSD算法跟YOLO类似,都属于one stage的算法,即通过回归算法直接从原图得到预测结果,为 ...
- UDP基础
UDP主要特点: (1)UDP是无连接的,发送数据不需要建立连接,减少了开销和发送数据之前的时延. (2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持连接状态表. (3)UDP面向报 ...
- java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES)
java.sql.SQLException: Access denied for user 'root'@'10.1.0.2' (using password: YES) at com.mysql.c ...
- luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)
题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...
- USACO Protecting the Flowers
洛谷 P2878 [USACO07JAN]保护花朵Protecting the Flowers 洛谷传送门 JDOJ 1009: 护花 JDOJ传送门 Description FJ出去砍木材去了,把N ...
- VIJOS-P1320 清点人数
JDOJ 1427: VIJOS-P1320 清点人数 题目传送门 Description 初始时,火车上没有学生:当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能 ...
- serverless 如何调试(三)
在上篇文章中,我们讲解了如何调用我们的hello-world应用,只需要使用命令: serverless invoke -f hello -l ,但是我们总不可能修改一次代码,就调用一下这个命令吧,或 ...
- 绕过dva dispatch在更新model数据的异步
我的业务是在更新选择列表后,马上进行总价格更新,那么由于model的更新不是实时的,因此我在this.props得到的值还是旧值,解决办法就是通过dispatch成功返回的值,传给计算函数 handl ...
- ESA2GJK1DH1K基础篇: 测试APP扫描Air202上面的二维码绑定通过MQTT控制设备(兼容SIM800)
前言 此程序兼容SIM800 如果想绑定SIM800,请把其IMEI号,生成二维码,用手机APP扫描. 实现功能概要 APP通过扫描二维码获取GPRS设备的IMEI号,然后设置订阅的主题:device ...