利用MVC的自定义过滤器FilterAttribute、IActionFilter、IExceptionFilter实现异常处理等功能
今天在博客园上看了一篇推荐文章,还说得蛮有道理:
http://www.cnblogs.com/richieyang/p/4779028.html
项目中确实有各种后台验证过程,最常见的莫过于判空,而在捕获到了异常信息后如何处理,各个项目组有自己不同的要求。我的项目组要求是:所有业务模块的异常不允许处理,而是直接抛出。
这种统一的处理方式一方面可以简化业务模块的开发过程,即在业务模块中直接throw自定义的异常信息即可,另一方面也可以对异常进行统一的处理,如记录日志等。
上文中也提到在MVC中可以通过ExceptionFilter来进行异常拦截,一下就记录一下MVC中的ExceptionFilter及ActionFilter的用法,其实还有ResultFilter,用于拦截Action执行完毕之后,生成View之前即之后的事件,网上有文章介绍利用ResultFilter实现页面静态化的功能,我没有细看,将来有需要可以研究下。
以下先记录ExceptionFilter及ActionFilter的用法:
1:ExceptionFilter
先定义自己的ExceptionFilter,在这个ExceptionFilter中,记录了异常日志(loggerFactory及logger应该通过IoC容器获取,这里仅作示例),并通过将filterContext.ExceptionHandled置为true来阻止异常抛出,实际上就是把这个异常吞掉了,这里这样处理仅作示例。
public class MyExceptionFilter : FilterAttribute, IExceptionFilter
{
void IExceptionFilter.OnException(ExceptionContext filterContext)
{
var loggerFactory = new Log4NetLoggerFactory("Log4Net.config");
var logger = loggerFactory.Create();
logger.Debug("{0}错误信息:", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
logger.Debug(filterContext.Exception.Message);
logger.Debug(filterContext.Exception.StackTrace);
filterContext.ExceptionHandled = true;
}
}
定义之后,在需要捕获异常的Action方法上新增[MyExceptionFilter]特性即可。
2:ActionFilter
通过自定义的ActionFilter,拦截Action处理前(OnActionExecuting)及Action处理后(OnActionExecuted)事件,并在事件处理代码中进行日志记录(记录方式仅作演示,实际项目中最好通过IoC容器获取):
public class MyLoggerFilter : FilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
var loggerFactory = new Log4NetLoggerFactory("Log4Net.config");
var logger = loggerFactory.Create();
logger.Debug("{0}-Action开始执行", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
{
var user = filterContext.HttpContext.User.Identity.Name;
var loggerFactory = new Log4NetLoggerFactory("Log4Net.config");
var logger = loggerFactory.Create();
logger.Debug("{0}-Action执行完毕", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
在定义了自己的ActionFilter之后,仍然是按需在Action实现上新增[MyLoggerFilter]特性,即可对该Action进行Aop拦截。
利用MVC的自定义过滤器FilterAttribute、IActionFilter、IExceptionFilter实现异常处理等功能的更多相关文章
- MVC之 自定义过滤器(Filter)
MVC之 自定义过滤器(Filter) 一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttri ...
- asp.net MVC之 自定义过滤器(Filter) - shuaixf
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以 ...
- asp.net MVC之 自定义过滤器(Filter)
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...
- MVC之 自定义过滤器(ActionFilterAttribute)
一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名. //表示所有操作 ...
- [转]MVC之 自定义过滤器(Filter)
本文转自:http://www.cnblogs.com/kissdodog/archive/2013/01/21/2869298.html 一.自定义Filter 自定义Filter需要继承Actio ...
- MVC之自定义过滤器(ActionFilterAttribute)
一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名. //表示所有操作 ...
- MVC系统过滤器、自定义过滤器
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...
- ASP.NET MVC学习系列(4)——MVC过滤器FilterAttribute
1.概括 MVC提供的几种过滤器其实也是一种特性(Attribute),MVC支持的过滤器类型有四种,分别是:AuthorizationFilter(授权),ActionFilter(行为),Resu ...
- ASP.NET MVC 系统过滤器、自定义过滤器
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...
随机推荐
- 转:导出/导入Eclipse的workspace配置(备份Eclipse配置)
from: http://www.cnblogs.com/52php/p/5677647.html 设置好workspace配置后可以将配置保存为 *.epf 文件. 进入 File -> Ex ...
- hdu 4027
Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K ...
- IOS第五课——Gesture and TableView
这一次我们要学习Gesture.TableView.AlertView三种技术. 一.Gesture 在iOS中,可以使用系统内置的手势识别(GestureRecognizer),也可以创建自己的手势 ...
- HTML标签用法
<!DOCTYPE> 声明必须位于 <html> 标签之前.它不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令. 信息输入标签:in ...
- class 函数
cocos2d-x 3.3 lua 版本的class函数用法: local FightScene = class("FightScene", function() return c ...
- JavaScript Array 对象
JavaScript Array 对象 Array 对象 Array 对象用于在变量中存储多个值: var cars = ["Saab", "Volvo", & ...
- 关于IOS免证书真机安装的过程和问题
由于本人是边工作边转的IOS,所以一直都没怎么使用过免证书安装过程,通常都是公司申请的99美元的账号直接开发.但是前两天有个朋友需要在展会上用的Ipad上安装内网应用,申请一个苹果账号还要审核前后加起 ...
- (转)DataMatrix编码2——伽罗华域运算
原文出处:http://blog.sina.com.cn/s/blog_4572df4e01019wsj.html 伽罗华域即有限域,RS编码在此域中进行运算,故不得不对其有所了解.DataMatri ...
- CefSharp的引用、配置、实例
CefSharp的引用.配置.实例与报错排除(源码) Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfro ...
- rpc框架之 thrift 学习 2 - 基本概念
thrift的基本构架: 上图源自:http://jnb.ociweb.com/jnb/jnbJun2009.html 底层Underlying I/O以上的部分,都是由thrift编译器生成的代码, ...