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 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...
随机推荐
- B/S系统常见缺陷整理和解决方案
最近部门整理了今年所有项目测试团队提出的BUG,筛选了几十个作为常规通用的缺陷,我根据这些缺陷内容,去掉和业务相关的知识,整理出了一份缺陷描述和解决方案. 其实WEB系统中常规的缺陷分类后也就那么多, ...
- 2 Unique Binary Search Trees II_Leetcode
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- 利用C# Winform做Windows系统任务栏
最近公司做一个考试系统,需要一个答题栏,要求:占用屏幕上方一部分区域,而且始终置顶,当其他窗口最大化时"答题栏"始终置前并且不遮挡最大化窗口的任何部分!就像windows任务栏一样 ...
- UWP学习记录6-设计和UI之控件和模式3
UWP学习记录6-设计和UI之控件和模式3 1.按钮 按钮,响应用户输入和引发 Click 事件的控件. 使用<Button>就能创建一个按钮控件了.按钮是 ContentControl, ...
- MySQL开发规范
字段设计 (1)建议使用UNSIGNED存储非负数值. (2)建议使用INT UNSIGNED存储IPV4. (4)INT类型固定占用4字节存储,例如INT(4)仅代表显示字符宽度为4位,不代表存储长 ...
- CentOS 7 安装后没有ifconfig命令
/bin,/sbin,/usr/bin,/usr/sbin下面都没有ifconfig命令. 执行命令 yum install net-tools 即可.
- 搭建selenium grid简单配置
1.使用selenium提供的服务端独立jar包 :服务端.客户端都是运行于java7环境. 2.启动hub: hub配置文件如下: Java -jar selenium-server-standal ...
- ASP.NET中GridView数据导出到Excel
/// <summary> /// 导出按钮 /// </summary> /// <param name="sender"></para ...
- C语言-占位符
%a 浮点数.十六进制数字和p-记数法(C99) %A 浮点数.十六进制数字和p-记法(C99) %c 一个字符 %d 有符号十进制整数 %e 浮点数.e-记数法 %E ...
- [知识点]字符串Hash
1.前言 字符串的几大主要算法都多少提及过,现在来讲讲一个称不上什么算法, 但是非常常用的东西——字符串Hash. 2.Hash的概念 Hash更详细的概念不多说了,它的作用在于能够对复杂的状态进行简 ...