Web Api 过滤器之 ExceptionFilter 异常过滤器
一.服务器出现异常,会统一向客户端返回 500 的错误.
[RoutePrefix("api/test")]
public class TestController : ApiController
{
public IHttpActionResult Get()
{
throw new Exception("出错了!");
}
}
二.全局过滤器
1.在 App_Start 里面新建一个全局过滤器
public class MyExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
//设置返回的HTTP状态码为 Bad Request 即 400
actionExecutedContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
//设置返回的异常内容
Content = new StringContent(actionExecutedContext.Exception.Message)
};
base.OnException(actionExecutedContext);
}
}
2.在 Global.asax 里面的 Application_Start 方法中添加该全局过滤器
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register); //添加全局过滤器
GlobalConfiguration.Configuration.Filters.Add(new MyExceptionFilterAttribute());
}
}
测试结果:
三.Action 过滤器
[RoutePrefix("api/test")]
public class TestController : ApiController
{
public IHttpActionResult Get()
{
throw new Exception("出错了!");
} //将自定义过滤器特性加在action上
[MyExceptionFilter]
public IHttpActionResult Post()
{
throw new Exception("怎么又出错了!");
}
}
同时注释这行代码 //GlobalConfiguration.Configuration.Filters.Add(new MyExceptionFilterAttribute());
测试结果:
四.Controller 过滤器
原理同 Action 过滤器
五.自定义异常信息
public void Get()
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
Content = new StringContent("哈哈,猪啊"),
ReasonPhrase = "pig"
});
}
六.地址接口异常处理
对于常规的异常,我们通过上面的处理方式,就可以很好进行拦截并处理了,如果接口异常是全局性的,如访问地址簿正确,或者参数多了几个信息,那么调用的接口就不是有效的地址,这样的话,返回的信息就不会被上面的拦截器进行处理了。
如我们给一个无效的API调用路径,在浏览器中获得下面错误结果。
上面结果就无法被我们的常规异常拦截器所捕获,因此不会输出经过封装好的异常信息。
如果需要拦截,我们需要增加自己的消息代理处理,用来捕获这些特殊的异常信息。


public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{ .............. config.MessageHandlers.Add(new CustomErrorMessageDelegatingHandler());


上面红色部分就是我们自己添加的消息代理处理类,用来处理一些特殊的异常信息,如下代码所示。


/// <summary>
/// API自定义错误消息处理委托类。
/// 用于处理访问不到对应API地址的情况,对错误进行自定义操作。
/// </summary>
public class CustomErrorMessageDelegatingHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) =>
{
HttpResponseMessage response = responseToCompleteTask.Result;
HttpError error = null;
if (response.TryGetContentValue<HttpError>(out error))
{
//添加自定义错误处理
//error.Message = "Your Customized Error Message";
} if (error != null)
{
//获取抛出自定义异常,有拦截器统一解析
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)
{
//封装处理异常信息,返回指定JSON对象
Content = new StringContent(new BaseResultJson(error.Message, false, 404).ToJson()),
ReasonPhrase = "Exception"
});
}
else
{
return response;
}
});
}
}


经过了上面的处理后,我们进一步测试一下不存在的地址的异常处理结果,可以看到输出的内容是经过了自定义对象的转换了。
常规的调用,如果接口不对应,那么错误也是类似下面的消息
{"errcode":404,"errmsg":"找不到与请求 URI“http://localhost:9001/api/SystemType/Delete?signature=72f8d706c79dc14d70fc3f080d4706748d754021×tamp=1443194061&nonce=0.650359861855563&appid=website_9A39C2A8&token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIxIiwiaWF0IjoxNDQzMTk0MDM4LCJqdGkiOiI1YmEyYmE5Ni0yZTA4LTQ1ZTgtYTAwNy01MmY3OTkzYTg2NzEiLCJuYW1lIjoiYWRtaW4iLCJjaGFubmVsIjoiMCIsInNoYXJlZGtleSI6IjEyMzRhYmNkIn0.RRXQmmSCJzDK5Or6rmBL5wjd-YIJoEQFc0pOzqhR6IU”匹配的 HTTP 资源。","success":false}
有了这些信息,我们就可以统一我们的调用规则,并进行异常记录和显示了,非常方便。
补充:
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
//设置返回的HTTP状态码为 Bad Request 即 400
actionExecutedContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
//设置返回的异常内容
Content = new StringContent(actionExecutedContext.Exception.Message),
ReasonPhrase = "hello world"
};
base.OnException(actionExecutedContext);
}
注意这个 hello world
Web Api 过滤器之 ExceptionFilter 异常过滤器的更多相关文章
- asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...
- Web Api 过滤器之 AuthorizationFilter 验证过滤器
该过滤器是最先执行的过滤器,即使把它放在最后 API [MyActionFilter] [MyExceptionFilter] [MyAuthorize] public void Get() { Tr ...
- asp.net core MVC 过滤器之ExceptionFilter过滤器(一)
简介 异常过滤器,顾名思义,就是当程序发生异常时所使用的过滤器.用于在系统出现未捕获异常时的处理. 实现一个自定义异常过滤器 自定义一个异常过滤器需要实现IExceptionFilter接口 publ ...
- 十五:jinja2过滤器之实现自定义过滤器
过滤器的本质就是函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传给过滤器函数,然后将函数的返回值作为滤器的返回值 1.在python文件中写好过滤的函数和逻辑2.将将函数注册到 ...
- 十四:jinja2过滤器之常用的过滤器
1.abs:返回一个数的绝对值(见上一篇)2.default:如果当前变量没有值或字段,则展示默认值(见上一篇) 3.转义过滤器:如果后端出过来的值含html标签,可以控制是否视为html标签执行或者 ...
- ASP.NET Core Web API中实现全局异常捕获与处理
处理全局异常 HANDLING ERRORS GLOBALLY 在上面的示例中,我们的 action 内部有一个 try-catch 代码块.这一点很重要,我们需要在我们的 action 方法体中处理 ...
- ASP.NET Web API 2 过滤器
Ø 前言 我们知道 ASP.NET Web API 过滤器,也是属于消息处理机制中的一部分.正因如此,我们经常使用它来完成对请求的授权验证.参数验证,以及请求的 Log 记录,程序异常捕获等. 1. ...
- asp.net core MVC 过滤器之ActionFilter过滤器(二)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core ...
- Asp.Net Web API 2第七课——Web API异常处理
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来讲解Asp.Ne ...
随机推荐
- mariadb 压缩包gz安装方式
1.解压安装包tar -zxvf mariadb-5.5.56-linux-x86_64.tar.gz 2.cd support-filescp my-small.cnf /etc/my.cnf 2. ...
- jquery 选择器 且 或
jquery选择器具有很强大的功能,基本的使用方法随处可见,jquery还提供了更为方便的使用. 且:$("div[id^='AAA_']div[id$='_DIV']"),此选择 ...
- APNS IOS 消息推送
一.Apns简介: Apns是苹果推送通知服务. 二.原理: APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备):然后,将服务器的信息接收并且 ...
- Angular4--提速--提升Angular项目的首页打开速度(包含微信登录优化)
Angular项目的首页打开速度很慢,有时候会有几秒的加载时间.如果在手机端访问的话,怕是要等待十多秒,这对用户体验很差.下面参考http://www.cnblogs.com/feiyu159/p/8 ...
- 如何配置VS使得可以通过域名或IP访问
一.前言: 在平时使用Visio Studio进行网站开发,经常会遇到一个问题.既要可以使用VS的Debug一步步跟进项目的走向,又必须是外界可以访问的.这个问题会在微信开发中非常常见,就拿微信开发中 ...
- 兄弟连教育分享:用CSS实现鼠标悬停提示的方法
兄弟连教育分享:用CSS实现鼠标悬停提示的方法 本文,兄弟连HTML5培训,分享了纯CSS实现鼠标悬停提示的方法.给大家供大家参考.具体分析如下: 这是一款比较漂亮的鼠标悬停提示效果,用纯CSS代码实 ...
- windows下安装Virtualenvwrapper
windows下安装Virtualenvwrapper 我们可以使用Virtualenvwrapper来方便地管理python虚拟环境,但是在windows上安装的时候.....直接 install ...
- CentOS7.2下Nginx的使用
Nginx的启动 指定配置文件的方式启动 nginx -c /etc/nginx/nginx.conf 对于yum安装的nginx,使用systemctl命令启动 systemctl start ng ...
- [Noip2003 PJ] 数字游戏
Description & Range 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有 ...
- python3 爬虫开发 学习总结一
virtualenv 安装虚拟环境的 pip install virtualenv安装慢的话,可以指定源 pip install -i 源地址 xxx 就可以安装xxxvirtua ...