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 ...
随机推荐
- sqlmap选项卡介绍及常用语句
sqlmap的使用方式:python sqlmap.py [options]: sqlmap中一共有以下十六个选项卡: 1.帮助选项卡: 2.Target(目标选项卡): 3.Request(请求选项 ...
- Python基础(二)--基本数据类型、格式化输出、基本运算符
一.基本数据类型 1.数字类型 #int整型 定义:age=10 #age=int(10) 用于标识:年龄,等级,身份证号,qq号,个数 #float浮点型 定义:salary=3.1 #salary ...
- 目标检测论文解读6——SSD
背景 R-CNN系列算法检测速度不够快,YOLO v1检测准确率较低,而且无法检测到密集目标. 方法 SSD算法跟YOLO类似,都属于one stage的算法,即通过回归算法直接从原图得到预测结果,为 ...
- Eclipse调用Tomcat出错
错误提示:The server cannot be started because one or more of the ports are invalid. Open the server edit ...
- JDK1.8 LocalDate 使用方式;LocalDate 封装Util,LocalDate工具类(三)
未完待续 ........ 前言: 大企鹅的日常分享,第三步,最近一直在想策略设计模式和工厂模式结合优化ifelse的写法,看了很多资料,终于写出了自己要写的东西,在这段时间里,也有求助小伙伴,但是, ...
- offsetWidth的bug
#div1{width:200px;border:1px solid red;} 这个时候如果用 offsetWidth 提取 #div1 的宽 得到的值是 202: 也就是说 offsetWidt ...
- [冬令营Day1 T2]sequence
题目描述 Description 给一个长度为N的序列以及Q的询问,每次两个参数l,r,问你序列[l,r]中的最大连续和 输入描述 Input Description 一行二个正整数N,Q. 接下来一 ...
- [冬令营day1T3]Tree
题目描述 Description 给一棵N个节点的无根树,求路径长度=K的简单路径数 输入描述 Input Description 第一行两个正整数N,K 接下来N-1行,每行两个正整数x,y,表示 ...
- redhat quay 集成镜像构建
redhat quay 可以类似docker hub 那样进行镜像的构建,以下是一个学习,但是在测试中发现流程是可以通的,但是 quay 在对于dockerfile 内容处理上有bug,造成build ...
- 5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(配置MQTT的SSL证书,验证安全通信)
4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(为域名申请SSl证书) 前面的准备工作终于完了 复制这两个证书 放到云端MQTT的这个位置,其实放哪里都可以 ...