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 ...
随机推荐
- 06. redis cluster
目录 Redis Cluster redis cluster 特点 搭建redis cluster 访问redis cluster redis-cli 访问redis cluster 重新分片数据 新 ...
- MySQL的select多表查询
select 语句: select 语句一般用法为: select 字段名 from tb_name where 条件 ; select 查询语句类型一般分为三种: 单表查询,多表查询,子查询 最简 ...
- python库包大全(转)
python 库资源大全 转自: Python 资源大全中文版 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具.官网 pyenv:简单的 Python ...
- Python 的版本控制
版本控制工具的差异 这里介绍几个工具:pyenv.pyvenv. venv.virtualenv.pyenv-virtualenv virtualenv 是针对python的包的多版本管理,通过将py ...
- 201871010101-陈来弟《面向对象程序设计(java)》第四周学习总结
...
- Escape character is ‘^]’什么意思?怎么使用telnet
在linux/unix下使用telnet(telnet ip 端口号)连接主机时提示“Escape character is '^]'.”,这是什么意思?“^”是Ctrl键的意思!1.这个提示的意思是 ...
- 00-赵志勇机器学习-Logistics_Regression-data.txt(转载)
4.45925637575900 8.22541838354701 0 0.0432761720122110 6.30740040001402 0 6.99716180262699 9.3133933 ...
- serverless 如何调试(三)
在上篇文章中,我们讲解了如何调用我们的hello-world应用,只需要使用命令: serverless invoke -f hello -l ,但是我们总不可能修改一次代码,就调用一下这个命令吧,或 ...
- 1.Java介绍
第一章 走进Java 一.Java技术体系 Java技术体系组成部分:Java程序设计语言.Java虚拟机.Class文件格式.Java API类库 JDK:Java程序设计语言 + Java虚拟机 ...
- redhat quay 集成镜像构建
redhat quay 可以类似docker hub 那样进行镜像的构建,以下是一个学习,但是在测试中发现流程是可以通的,但是 quay 在对于dockerfile 内容处理上有bug,造成build ...