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()方法调用,下面我们先讲解这两种参数类型:
- ActionExecutingContext
- Func<ActionExecutedContext>
第一个参数
public class ActionExecutingContext : ControllerContext
{
public ActionExecutingContext();
public ActionExecutingContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary<string, object> actionParameters); public virtual ActionDescriptor ActionDescriptor { get; set; }
public virtual IDictionary<string, object> ActionParameters { get; set; }
public ActionResult Result { get; set; }
}
在上面类型的定义中,我们了解到ActionExecutingContext类型继承至ControllerContext类型,并且包含着一些信息的引用,这便是可以在控制器方法执行之前执行自己的一些自定义操作。
第二个参数
public class ActionExecutedContext : ControllerContext
{ public ActionExecutedContext();
public ActionExecutedContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, bool canceled, Exception exception); public virtual ActionDescriptor ActionDescriptor { get; set; }
public virtual bool Canceled { get; set; }
public virtual Exception Exception { get; set; }
public bool ExceptionHandled { get; set; }
public ActionResult Result { get; set; }
}
ActionExecutedContext类型跟ActionExecutingContext类型的区别在于前者多了两个属性一个是用于保存异常信息的,另一个属性是用来设置是否处理了异常,这个会在异常过滤器篇幅中讲解。
切回主题,大概知道这两种类型的定义就行了,说到Func<ActionExecutedContext>类型的参数,在MVC框架中默认的设置了Lambda表达式,并且对返回类型中的Result属性又设置了一个表达式调用的是ControllerActionInvoker类型的InvokeActionMethod()方法,这个方法后面会讲到。我们看一下表达式的定义,不然有点混乱:
Func<ActionExecutedContext> seed = () =>
{
new ActionExecutedContext(controllerContext,actionDescriptor, false,null)
{
Result = this.InvokeActionMethod(controllerContext, actionDescriptor, parameters)
}
};
上述的这些参数都准备完毕后,可以调用执行最后的ControllerActionInvoker类型的InvokeActionMethodFilter()方法,而其中的IActionFilter类型的参数则有在前面篇幅中讲到的FilterInfo类型中的ActionFilters属性提供,并且是遍历执行的,最后可以看到在InvokeActionMethodFilter()方法的内部首先是由IActionFilter类型的参数调用了OnActionExecuting()方法,然后执行Func<ActionExecutedContext>类型的参数,因为上面说到的,这个委托类型的参数已经定义好了默认的执行方式,是执行ControllerActionInvoker类型的中的InvokeActionMethod()方法,在此方法执行后在执行IActionFilter类型的OnActionExecuted()方法,并且最终的结果值返回到了ActionExecutedContext类型的Result属性中。
最后我们看一下IActionFilter类型的结构定义:
public interface IActionFilter
{
// 摘要:
// 在执行操作方法后调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnActionExecuted(ActionExecutedContext filterContext);
//
// 摘要:
// 在执行操作方法之前调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnActionExecuting(ActionExecutingContext filterContext);
}
行为过滤器大概的执行过程讲解完毕了,下一篇会对这种类型的过滤器的应用作大概讲解。
作者:金源
出处:http://www.cnblogs.com/jin-yuan/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
ASP.NET MVC 过滤器(三)的更多相关文章
- ASP.NET MVC 过滤器(一)
ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- ASP.NET MVC 视图(三)
ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...
- ASP.NET MVC 路由(三)
ASP.NET MVC路由(三) 前言 通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处 ...
- ASP.NET MVC 过滤器(四)
ASP.NET MVC 过滤器(四) 前言 前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍. ASP ...
- ASP.NET MVC 过滤器(五)
ASP.NET MVC 过滤器(五) 前言 上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大 ...
- Asp.net Mvc 过滤器执行顺序
Asp.net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)- ...
- ASP.NET MVC过滤器
在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有.园子里关于过滤器的资料也有很多,这篇文章主要是记 ...
- ASP.NET MVC过滤器(一)
MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...
随机推荐
- find命令与cat命令区别
在当前目录下查找 MEMBERINTERFACE 这个字符串的文件find . -name '*'|xargs grep "MEMBERINTERFACE"find / -name ...
- 多个jar包合并成一个jar包的办法
步骤: 1.将多个JAR包使用压缩软件打开,并将全包名的类拷贝到一个临时目录地下. 2.cmd命令到该临时目录下,此时会有很多.class文件,其中需要带完整包路径 3.执行 jar -cvfM te ...
- solr DIH 知识梳理
solr DIH 知识梳理 web.xml中listener配置 <listener> <listener-class>org.apache.solr.handler.data ...
- CentOS 6.4下编译安装MySQL 5.6.14
概述: CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.14. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server ...
- Codeforces Round #257 (Div. 2)
A - Jzzhu and Children 找到最大的ceil(ai/m)即可 #include <iostream> #include <cmath> using name ...
- JavaScript解惑记之Array.prototype.sort()
前言 看JS红宝书的5.2.5章节关于sort()方法,如何用一个compare函数,让数组顺序,倒序,有点云里雾里的.在网上度娘了一下,发现更迷糊了.走投无路的情况下,只能发动神技能,去 stack ...
- Drawing in Singapore
说到画画,其实很多人都会画.只是很多人都把这种潜能给埋起来了,没有特意的去开发出来.且不论画的好与不好,好看与不好看.自己把自己所想的东西方式表达出来,画画是一种方式.我不是科班出身,全凭自己感觉来的 ...
- js get browser vertion (js获取浏览器信息版本)
1问题:js get browser vertion (js获取浏览器信息版本) 2解决方案 Copy this script into your JavaScript files. It works ...
- winfrom自定义滚动条
panel或图片什么的跟着鼠标走,这里panel自己可以加背景图或直接搞个图就行了.为了演示清楚,有个滚动条控件做对比,与自定义的同步. using System; using System.Coll ...
- HDU 2492 Ping pong (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Problem Description N(3<=N<=2000 ...