这里用实例说明各种过滤器的用法,有不对的地方还请大神指出,共同探讨。

1. ActionFilter 方法过滤器:

  接口名为 IActionFilter ,在控制器方法调用前/后执行。

在新建的MVC程序中,添加一个类 MyFilter1Attribute 并继承ActionFilterAttribute抽象类

从上图可以看到 ActionFilterAttribute 中的所有方法,且有相应的介绍,我们可以通过继承 ActionFilterAttribute 类,并重写(override)它的方法,从而实现自定义Filter

  1.    public class MyFilter1Attribute: ActionFilterAttribute
  2. {
  3. /// <summary>
  4. /// 该方法会在Action方法执行之前调用
  5. /// </summary>
  6. /// <param name="filterContext"></param>
  7. public override void OnActionExecuting(ActionExecutingContext filterContext)
  8. {
  9. filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在Ation方法调用前执行<br/>");
  10. base.OnActionExecuting(filterContext);
  11. }
  12.  
  13. /// <summary>
  14. /// 该方法会在Action方法执行之后调用
  15. /// </summary>
  16. /// <param name="filterContext"></param>
  17. public override void OnActionExecuted(ActionExecutedContext filterContext)
  18. {
  19. filterContext.HttpContext.Response.Write("我是OnActionExecuted,我在Action方法调用后执行<br/>");
  20. base.OnActionExecuted(filterContext);
  21. }
  22.  
  23. }

然后创建一个HomeController控制器,并添加FilterTest的测试Action

  1. public class HomeController : Controller
  2. {
  3. public ActionResult Index()
  4. {
  5. return View();
  6. }
  7.  
  8. [MyFilter1]
  9. public void FilterTest()
  10. {
  11. Response.Write("我是Action方法,我在这里执行了.....<br/>");
  12. }
  13. }

运行程序并访问FilterTest方法:

上图可看出它的一个执行顺序

但是有时候也有可能有这样的场景:当检查到Action有标识某个Attribute的时候,我们需要跳出,并不执行后续的方法的情况,我们可以通过filterContextActionDescriptior类中的IsDefained方法进行判断检查

  1.      /// <summary>
  2. /// 该方法会在Action方法执行之前调用
  3. /// </summary>
  4. /// <param name="filterContext"></param>
  5. public override void OnActionExecuting(ActionExecutingContext filterContext)
  6. {
  7. filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在Ation方法调用前执行<br/>");
  8. //判断Action方法时是否有贴上MyFilter1Attribute标签
  9. if (filterContext.ActionDescriptor.IsDefined(typeof(MyFilter1Attribute), false))
  10. {
  11. //如果有,为该Action方法直接返回ContentResult,则该Action方法在这里就有了返回值,相当于在这里就结束了,不会再去执行之后的方法,例如:OnActionExecuted
  12. filterContext.Result = new ContentResult();
  13. }
  14. base.OnActionExecuting(filterContext);
  15. }

2.ResultFilter 结果过滤器:

  接口名为 IResultFilter,在控制器方法调用完,跳转至View页面前/后调用

同样在 MyFilter1Attribute 类中重写 OnResultExecuting 方法和  OnResultExecuted 方法

  1. /// <summary>
  2. /// 该方法在Action方法返回结果之前执行
  3. /// </summary>
  4. /// <param name="filterContext"></param>
  5. public override void OnResultExecuting(ResultExecutingContext filterContext)
  6. {
  7. filterContext.HttpContext.Response.Write("我是OnResultExecuting,我在Action方法返回结果前执行<br/>");
  8. base.OnResultExecuting(filterContext);
  9. }
  10.  
  11. /// <summary>
  12. /// 该方法在Action方法返回结果之后执行
  13. /// </summary>
  14. /// <param name="filterContext"></param>
  15. public override void OnResultExecuted(ResultExecutedContext filterContext)
  16. {
  17. filterContext.HttpContext.Response.Write("我是OnResultExecuted,我在Action方法返回结果后执行<br/>");
  18. base.OnResultExecuted(filterContext);
  19. }

然后在HomeController控制器中添加 FilterTest1

  1. [MyFilter1]
  2. public ActionResult FilterTest1()
  3. {
  4. Response.Write("我是测试Action1方法,我在这里执行了.....<br/>");
  5. return View();
  6. }

运行程序,并访问 FilterTest1 ,执行结果如下:

可以看出OnResultExecuting 方法是在返回结果页面之前执行的,而OnResultExecuted是返回结果页面之后执行的

3.ExceptionFilter 异常操作过滤器:

  接口名为 IExceptionFilter,在控制器的Action方法抛出异常时执行

可以通过异常过滤器捕获Controller中发生的异常,并记录到日志。

添加MyExceptionAttribute类,并继承HandleErrorAttribute,如下

  1. /// <summary>
  2. ///
  3. /// </summary>
  4. /// <param name="filterContext"></param>
  5. public override void OnException(ExceptionContext filterContext)
  6. {
  7. filterContext.HttpContext.Response.Write("我是OnException,在Controller中发生异常时进入<br/>");
  8.  
  9. //获取到异常对象
  10. Exception ex = filterContext.Exception;
  11. //获取请求的Controller和Action
  12. string controllerName = filterContext.RouteData.Values["controller"].ToString();
  13. string actionName = filterContext.RouteData.Values["action"].ToString();
  14. //记录日志
  15. string errMessage = string.Format("异常消息:控制器为:{0},Action为:{1},异常信息为:{2};", controllerName, actionName, ex.Message);
  16. OutPutLog(errMessage);
  17.  
  18. //标记异常已做处理
  19. filterContext.ExceptionHandled = true;
  20. base.OnException(filterContext);
  21. }
  22.  
  23. /// <summary>
  24. /// 输出日志
  25. /// </summary>
  26. /// <param name="message"></param>
  27. public void OutPutLog(string message)
  28. {
  29. string path = AppDomain.CurrentDomain.BaseDirectory + "/Logs.txt";
  30. using (StreamWriter sw = new StreamWriter(path, true, Encoding.Default))
  31. {
  32. sw.Flush();
  33. sw.WriteLine("时间:" + DateTime.Now);
  34. sw.WriteLine("内容:" + message);
  35. sw.WriteLine("---------------------------------------------");
  36. }
  37. }

HomeController中添加FilterTest3

  1. [MyException]
  2. public ActionResult FilterTest3()
  3. {
  4. Response.Write("我是测试Action3方法,我在这里执行了.....<br/>");
  5. string str = "131464ddddd";
  6. int i = int.Parse(str);
  7. return View();
  8. }

运行程序并访问 FilterTest3方法,将会在 str 转换成int类型时抛出异常,随后将进入OnException方法,并记录日志如下:

4.AuthorizationFilter 授权过滤器:

  接口名为 IauthorizationFilter,在所有过滤器中最先执行

添加一个MyFilter2Attribute类,并继承AuthorizeAttribute类,然后重写其OnAuthorization方法:

  1. public class MyFilter2Attribute: AuthorizeAttribute
  2. {
  3.  
  4. /// <summary>
  5. /// 在所有的Action方法过滤之前执行
  6. /// </summary>
  7. /// <param name="filterContext"></param>
  8. public override void OnAuthorization(AuthorizationContext filterContext)
  9. {
  10. filterContext.HttpContext.Response.Write("我是OnAuthorization,在所有Action方法过滤器之前执行<br/>");//base.OnAuthorization(filterContext);
  11. }
  12. }

HoneController控制器中添加 FilterTest2

  1. [MyFilter1]
  2. [MyFilter2]
  3. public ActionResult FilterTest2()
  4. {
  5. Response.Write("我是测试Action2方法,我在这里执行了.....<br/>");
  6. return View();
  7. }

运行程序并访问 FilterTest2  结果如下:

从上图执行结果可以看出,OnAuthorization 权重是最高的,将会在其他所有过滤器之前执行。

注意:

  ActionFilter 和 ResultFilter 不仅可以对单个方法进行操作,也能对整个Controller进行操作,将过滤的头部属性移至控制名称上面即可。

ASP.NET MVC 中的过滤器的更多相关文章

  1. Asp.Net MVC<五>:过滤器

    ControllerActionInvoker在执行过程中除了利用ActionDescriptor完成对目标Action方法本身的执行外,还会执行相关过滤器(Filter).过滤器采用AOP的设计,它 ...

  2. ASP.NET MVC中的错误处理

    ASP.NET MVC中的错误的错误处理跨越了两个主要领域:程序异常和路由异常的处理.前者是关于在控制器和视图中捕获错误的;而后者更多是有关重定向和HTTP错误的. 1.在WebConfig中把过滤器 ...

  3. asp.net MVC之 自定义过滤器(Filter) - shuaixf

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration :缓存的时间, 以 ...

  4. ASP.NET MVC学习之过滤器篇(2)

    下面我们继续之前的ASP.NET MVC学习之过滤器篇(1)进行学习. 3.动作过滤器 顾名思义,这个过滤器就是在动作方法调用前与调用后响应的.我们可以在调用前更改实际调用的动作,也可以在动作调用完成 ...

  5. ASP.NET MVC学习之过滤器篇(1)

    一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC ...

  6. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  7. [转]ASP.NET MVC中你必须知道的13个扩展点

    本文转自:http://www.cnblogs.com/ejiyuan/archive/2010/03/09/1681442.html ScottGu在其最新的博文中推荐了Simone Chiaret ...

  8. Asp.net mvc 中Action 方法的执行(一)

    [toc] 在 Aps.net mvc 应用中对请求的处理最终都是转换为对某个 Controller 中的某个 Action 方法的调用,因此,要对一个请求进行处理,第一步,需要根据请求解析出对应的 ...

  9. Asp.net mvc 中的 Controller 的激活

    Controller 激活是指根据路由系统解析出来的 Controller 的名称创建 控制器(Controller)的过程,这里的控制器泛指实现了 IController 接口的类型 激活过程中的核 ...

随机推荐

  1. python基础(22):模块、包

    1. 模块 1.1 什么是模块 别人写好的函数.变量.方法放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模 ...

  2. idea的service注入mapper报错

    一.问题 idea的java项目中,service类中注入mapper报错 二.解决 方法1 在mapper类上加上  @Repository 注解即可,当然不加也行,程序也不回报错,是idea的误报 ...

  3. 盘点10个CAD难点,看看有没有让你崩溃的,解决方法一并奉上

    蜀道难,难于上青天”,对于很多学习CAD的小伙伴来说CAD就跟蜀道一样,太难了,下面小编分享几个在学习CAD过程中会遇到的问题以及解决的方法,一起来看看吧! 1. 如何替换找不到的原文字体? 答:复制 ...

  4. Zipkin客户端链路追踪源码解析

    我们知道,Zipkin这个工具可以帮助我们收集分布式系统中各个系统之间的调用连关系,而且除了Servlet之外还能收集:MQ.线程池.WebSocket.Feign.Hystrix.RxJava.We ...

  5. JavaScript HTML DOM Style flexWrap 属性

    flexWrap 属性 flexWrap属性指定flex项是否应该换行. 注意:如果元素不是flex项,则flexWrap属性不起作用. 如果必要,使flex换行: document.getEleme ...

  6. Qt窗口退出与事件循环退出的问题

    我在Qt主程序中开启一个线程,线程中使用信号-槽来产生QMainWindow(GUI),main函数代码如下:int main(int argc, char *argv[]){ QApplicatio ...

  7. SQL 注入漏洞浅研究学习

    SQL注入漏洞:Web安全方面最高危的漏洞,SQL漏洞威胁着网站后台数据的安全问题. 网上常说“万能密码”,这个万能密码则就是利用了SQL注入漏洞: ' or 1=1 -- 上述的万能密码输入在用户登 ...

  8. curl http libcurl 功能使用

    /* * This example shows a HTTP PUT operation. PUTs a file given as a command * line argument to the ...

  9. 有趣的bug——Java静态变量的循环依赖

    背景 是的,标题没有错误,不是Spring Bean的循环依赖,而是静态变量之间的循环依赖. 近期的项目均是简单的Maven项目,通过K8S部署在阿里云上,其配置文件读取规则如下所示: (1) 优先读 ...

  10. vue组件懒加载

    vue2组件懒加载浅析 一. 什么是懒加载 懒加载也叫延迟加载,即在需要的时候进行加载,随用随载. 二.为什么需要懒加载 在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大, ...