ASP.NET MVC 过滤器(三)

ASP.NET MVC 过滤器(三)

前言

本篇讲解行为过滤器的执行过程,过滤器实现、使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中,这种编程模式就是横向的插入点),言归正传,我们还是以学习过滤器为主。对于IAuthorizationFilter授权认证过滤器的使用篇幅,我知道怎么用但是写不出来,里面包含知识点很多,功底尚浅写了一半又给删掉了,宁愿不发也不能坑人,在后面的学习中假使我可以掌握了,一定会及时的写出来跟大家分享。这个目录也空在这也算是给自己的一个提醒吧。

ASP.NET MVC过滤器

  • 过滤器在系统框架中的整体对象模型
  • IAuthorizationFilter授权认证过滤器的执行过程
  • 使用IAuthorizationFilter过滤器
  • IActionFilter行为过滤器的执行过程
  • 自定义实现IActionFilter行为过滤器
  • 异常过滤器的使用

IActionFilter行为过滤器的执行过程

我们直接进入主题,这里的执行过程还是接着过滤器(一)中的部分,我们看下执行过程的示意图:

图1

如图1所示,就是整个的一个执行过程,图太大拆开来看,这样比较细致一点(这里捎带一句,后面许多部分的内容都都包含在这个示意图里,比如说Model元数据、Model绑定和Model验证)。

图2

首先是调用了ControllerActionInvoker类型的GetParameterValues()方法,GetParameterValues()方法的参数是控制器上下文参数对象【ControllerContext类型】和控制器方法描述对象【ActionDescriptor类型】,然后在此方法中会根据ActionDescriptor类型的参数来调用GetParameters()方法获取到控制器方法参数的描述对象【ParameterDescriptor类型】的集合,这里对ParameterDescriptor类型不做过多的讲解,只需了解它是包含了控制器方法参数的一些信息,比如说参数名称、参数类型等等。

图3

从图2中所示的那样,获取到了ParameterDescriptor类型的集合后,便会遍历此集合并且调用图3中所示的ControllerActionInvoker类型的GetParameterValue()方法【这里注意一下跟上面的图2所示的方法是不同的】,调用GetParameterValue()方法的目的是生成一个键值队类型的对象【红色箭头所指】,键值队中的键表示参数名称,值则为参数的值,而生成的过程是:首先MVC框架会调用用户自定义的模型绑定器(如果有自定义的)【实现了IModelBinder接口的类型】,并且调用自定义模型绑定器的方法以此来获取控制器方法参数的参数值,如果没有发现自定义的模型绑定器,则会调用默认的Model绑定器进行参数绑定,如果没有匹配的类型返回一个默认值ParameterDescriptor.DefaultValue】。(关于Model绑定器内容后续系列会有讲解)

图4

有了参数值信息的键值队过后,接着调用ControllerActionInvoker类型的InvokeActionMethodWithFilters()方法,在此方法会生成两种参数类型以便由ControllerActionInvoker类型的InvokeActionMethodFilter()方法调用,下面我们先讲解这两种参数类型:

  1. ActionExecutingContext
  2. Func<ActionExecutedContext>

第一个参数

1 public class ActionExecutingContext : ControllerContext
2 {
3 public ActionExecutingContext();
4 public ActionExecutingContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary<string, object> actionParameters);
5
6 public virtual ActionDescriptor ActionDescriptor { get; set; }
7 public virtual IDictionary<string, object> ActionParameters { get; set; }
8 public ActionResult Result { get; set; }
9 }

在上面类型的定义中,我们了解到ActionExecutingContext类型继承至ControllerContext类型,并且包含着一些信息的引用,这便是可以在控制器方法执行之前执行自己的一些自定义操作。

第二个参数

 1     public class ActionExecutedContext : ControllerContext
2 {
3
4 public ActionExecutedContext();
5 public ActionExecutedContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, bool canceled, Exception exception);
6
7 public virtual ActionDescriptor ActionDescriptor { get; set; }
8 public virtual bool Canceled { get; set; }
9 public virtual Exception Exception { get; set; }
10 public bool ExceptionHandled { get; set; }
11 public ActionResult Result { get; set; }
12 }

ActionExecutedContext类型跟ActionExecutingContext类型的区别在于前者多了两个属性一个是用于保存异常信息的,另一个属性是用来设置是否处理了异常,这个会在异常过滤器篇幅中讲解。

切回主题,大概知道这两种类型的定义就行了,说到Func<ActionExecutedContext>类型的参数,在MVC框架中默认的设置了Lambda表达式,并且对返回类型中的Result属性又设置了一个表达式调用的是ControllerActionInvoker类型的InvokeActionMethod()方法,这个方法后面会讲到。我们看一下表达式的定义,不然有点混乱:

1 Func<ActionExecutedContext> seed = () =>
2 {
3 new ActionExecutedContext(controllerContext,actionDescriptor, false,null)
4 {
5 Result = this.InvokeActionMethod(controllerContext, actionDescriptor, parameters)
6 }
7 };

上述的这些参数都准备完毕后,可以调用执行最后的ControllerActionInvoker类型的InvokeActionMethodFilter()方法,而其中的IActionFilter类型的参数则有在前面篇幅中讲到的FilterInfo类型中的ActionFilters属性提供,并且是遍历执行的,最后可以看到在InvokeActionMethodFilter()方法的内部首先是由IActionFilter类型的参数调用了OnActionExecuting()方法,然后执行Func<ActionExecutedContext>类型的参数,因为上面说到的,这个委托类型的参数已经定义好了默认的执行方式,是执行ControllerActionInvoker类型的中的InvokeActionMethod()方法,在此方法执行后在执行IActionFilter类型的OnActionExecuted()方法,并且最终的结果值返回到了ActionExecutedContext类型的Result属性中。

最后我们看一下IActionFilter类型的结构定义:

 1     public interface IActionFilter
2 {
3 // 摘要:
4 // 在执行操作方法后调用。
5 //
6 // 参数:
7 // filterContext:
8 // 筛选器上下文。
9 void OnActionExecuted(ActionExecutedContext filterContext);
10 //
11 // 摘要:
12 // 在执行操作方法之前调用。
13 //
14 // 参数:
15 // filterContext:
16 // 筛选器上下文。
17 void OnActionExecuting(ActionExecutingContext filterContext);
18 }

行为过滤器大概的执行过程讲解完毕了,下一篇会对这种类型的过滤器的应用作大概讲解。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

MVC 过滤器3的更多相关文章

  1. mvc过滤器学习(1)

    mvc 过滤器结构图 AuthorizeAttribute AuthorizeAttribute是IAuthorizationFilter的默认实现,添加了Authorize特性的Action将对用户 ...

  2. ASP.NET MVC 过滤器(一)

    ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...

  3. ASP.NET MVC 过滤器(三)

    ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...

  4. ASP.NET MVC 过滤器(四)

    ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...

  5. ASP.NET MVC 过滤器(五)

    ASP.NET MVC 过滤器(五) 前言 上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大 ...

  6. asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码

    重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...

  7. MVC过滤器详解

    MVC过滤器详解   APS.NET MVC中(以下简称"MVC")的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理. ...

  8. MVC过滤器使用案例:统一处理异常顺道精简代码

    重构的乐趣在于精简代码,模块化设计,解耦功能……而对异常处理的重构则刚好满足上述三个方面,下面是我的一点小心得. 一.相关的学习 在文章<精简自己20%的代码>中,讨论了异常的统一处理,并 ...

  9. ASP.NET MVC 过滤器详解

    http://www.fwqtg.net/asp-net-mvc-%E8%BF%87%E6%BB%A4%E5%99%A8%E8%AF%A6%E8%A7%A3.html 我经历了过滤器的苦难,我想到了还 ...

  10. ASP.NET MVC过滤器(一)

    MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...

随机推荐

  1. 手机号ID开关星号(*)

    .h文件 <span style="font-size:18px;">/** * 转成星号工具 */ @interface AsteriskTool : NSObjec ...

  2. 1023 Train Problem II(卡特兰数)

    Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want ...

  3. GG同步sqlserver报错一个案例 Invalid date format

    在里面Oracle表同步sqlserver时间,在sqlserver当应用程序数据的结束.您可能会遇到这个错误. 2014-05-17 17:20:24 WARNING OGG-01154 SQL e ...

  4. Python - 安全替换字符串模板(safe_substitute) 详细解释

    安全替换字符串模板(safe_substitute) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27057339 字 ...

  5. 学SpringMVC

    http://jinnianshilongnian.iteye.com/blog/1593441

  6. ZOJ 3802 Easy 2048 Again 像缩进DP

    链接:problemId=5334">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334 题意:一个长度为5 ...

  7. 【百度地图API】如何制作多途经点的线路导航——驾车篇

    原文:[百度地图API]如何制作多途经点的线路导航--驾车篇 摘要: 休假结束,酸奶小妹要从重庆驾车去北京.可是途中要去西安奶奶家拿牛奶饼干呢!用百度地图API,能不能帮我实现这个愿望呢? ----- ...

  8. 【百度地图API】多家地图API内存消耗对比测验(带源码)

    原文:[百度地图API]多家地图API内存消耗对比测验(带源码) 任务描述: 啊,美妙的春节结束了.酸奶小妹和妈妈的山西平遥之旅也宣告成功!距离平遥古城7km,有一个同样身为“世界文化遗产”的寺庙,叫 ...

  9. Java初认识--Java语言的书写规范及基本的运算符

    一.Java中名称的规范和书写程序的规范. 1.Java中的名称规范: (1)包名全是小写:xxyyzz: (2)类名接口名:首字母大写:XxxYyy: (3)变量名和函数名:变量名不能是关键字:多单 ...

  10. asp.net webform easyui

    建议使用   html 页面 和 一般处理程序,一般处理程序 继承 IRequiresSessionState  ,才能用 session .