ASP.NET MVC 过滤器(一)

前言

前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定、验证这些知识了。但是呢,在MVC框架中提供了一种机制在控制器方法执行之前我们还可以通过这种机制来做一些横向切面的操作,这种机制的实现就是过滤器了,在本篇和后续的篇幅中将会对几种过滤器做一番讲解,并且会对过滤器在框架中的一个执行过程进行粗略的讲解。

ASP.NET MVC过滤器

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

过滤器在系统框架中的整体对象模型

我们在获得控制器工厂生成的控制器后,执行某些控制器行为之前,总是要验证一些数据或者是请求信息什么的,这里就要用到过滤器的机制了,而在框架中过滤器是怎么运转的,通过本小节的学习会让你有个大概的了解。

现在我们切入主题来讲解一下在MVC框架中的过滤器。

图1

如上图所示的这样,在控制器执行的时候会调用ControllerActionInvoker类型的InvokeAction()方法,而在InvokeAction()方法中,框架会默认的生成控制器描述对象ControllerDescriptor和控制器行为描述对象ActionDescriptor,这两种类型的对象都是对当前的控制器和所要请求的控制器方法信息的封装,这个知识点我们会在后续的篇幅中讲到,这里只须了解一下,忽略它们的生成过程。参照如下图:

图2

按照InvokeAction()方法的执行流程,到了生成FilterInfo类型的时候,我们都知道MVC框架给我们提供了四种过滤器,哪四种后面一一介绍,那么FilterInfo类型是干什么的呢?来看一下它的对象结构:

  1. //封装有关可用的操作筛选器的信息。
  2. public class FilterInfo
  3. {
  4. public FilterInfo();
  5. public FilterInfo(IEnumerable<Filter> filters);
  6. public IList<IActionFilter> ActionFilters { get; }
  7. public IList<IAuthorizationFilter> AuthorizationFilters { get; }
  8. public IList<IExceptionFilter> ExceptionFilters { get; }
  9. public IList<IResultFilter> ResultFilters { get; }
  10. }

它的内部有着四种过滤器集合类型的属性,并且有个构造函数是接收IEnumerable<Filter>类型的,当FilterInfo类型在初始化的时候会根据构造函数传入的类型进行解析,并且对四个属性分别赋值,这就要涉及到另一个元数据描述对象Filter了。

我们来看一下Filter对象的结构:

  1. // 表示一个元数据类,它包含对一个或多个筛选器接口的实现、筛选器顺序和筛选器范围的引用。
  2. public class Filter
  3. {
  4. public const int DefaultOrder = -;
  5. public Filter(object instance, FilterScope scope, int? order);
  6.  
  7. public object Instance { get; protected set; }
  8. public int Order { get; protected set; }
  9. public FilterScope Scope { get; protected set; }
  10. }

看到这里有可能有的朋友不明白这个对象,具体怎么表示?因为元数据编程模式很少见,这里我给大家举个例子,一看就明白了:

  1. [Authorize(Order=)]
  2. public class DemoController : Controller
  3. {
  4. ……
  5. }

上面的这个列子则会在系统生成的时候生成一个Filter类型的对象,并且赋值Order等于1,而Filter类型中的Instance属性则是对上述例子中的Authorize类型实例引用,这就是元数据描述对象,当然了讲的不是太详细,能让大家明白就行了,Authorize类型的具体使用在下一篇中会有讲到。

现在我们回归主题,如图2中所表示的那样,IEnumerable<Filter>集合类型是关键,那么怎么生成IEnumerable<Filter>集合类型?

先是调用ControllerActionInvoker类型中的GetFilters()方法,我们看到方法的参数类型为控制器参数上下文对象和控制器行为元数据描述对象,这两个对象就够了,它们中包含的信息已经很多了,在ControllerActionInvoker的GetFilters()方法内部调用FilterProviderCollection类型的GetFilters(),和上面所述的类型方法签名一样,只不过返回类型有差异而已,而真正的根据参数执行生成Filter类型的对象是实现了IFilterProvider类型的对象,

看一下IFilterProvider类型的结构:

  1. // 提供用于查找筛选器的接口。
  2. public interface IFilterProvider
  3. {
  4. IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor);
  5. }

而这个对象是可以从外部注入进来的,在控制器(三)中提到过的,通过实现IDependencyResolver类型,而在框架中也会默认的实现一个(只是我通过反编译工具没看到,显示的是错误信息,表示很郁闷,后文中就叫它为默认实现)。在FilterProviderCollection类型的GetFilters()中,会通过默认实现来得到当前请求的行为上的所有过滤器元数据描述对象,并且进行排序、验证,这里就不多叙述了。然后返回IEnumerable<Filter>集合类型并且生成FilterInfo类型的对象。

IAuthorizationFilter授权认证过滤器的执行过程

图3

先来看一下IAuthorizationFilter类型的定义:

  1. public interface IAuthorizationFilter
  2. {
  3. // 摘要:
  4. // 在需要授权时调用。
  5. //
  6. // 参数:
  7. // filterContext:
  8. // 筛选器上下文。
  9. void OnAuthorization(AuthorizationContext filterContext);
  10. }

看到如上的定义,再看图3IAuthorizationFilter类型的执行过程一目了然,根据ControllerContext控制器参数上下文对象和控制器行为据描述对象actionDescriptor生成AuthorizationContext授权认证过滤器参数上下文对象,并且会遍历FilterInfo类型中的AuthorizationFilters属性,挨个的去执行我们定义的过滤器。

本篇的内容就讲到这里,下个篇幅中会讲到IAuthorizationFilter类型的使用

作者:金源

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

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC 过滤器(一)的更多相关文章

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

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

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

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

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

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

  4. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  5. Asp.net Mvc 过滤器执行顺序

    Asp.net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)- ...

  6. ASP.NET MVC过滤器

    在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有.园子里关于过滤器的资料也有很多,这篇文章主要是记 ...

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

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

  8. ASP.NET MVC 过滤器开发与使用

    ASP.NET MVC 中给我们提供了内置的过滤器,通过过滤器,我们可以在控制器内的方法前后,添加必须的业务逻辑,如权限验证,身份验证,错误处理等. 今天,我们主要介绍3个过滤器:OutputCach ...

  9. Asp.Net MVC过滤器小试牛刀

    在上学期间学习的Asp.Net MVC,基本只是大概马马虎虎的了解,基本处于知其然而不知其所以然.现在到上班,接触到真实的项目,才发现还不够用,于是从最简单的过滤器开始学习.不得不说MVC的过滤器真是 ...

随机推荐

  1. mysql 列类型

  2. 开发日志_Jan.6.2017

    Github Jan.2 接到了汤松岩的GUI框架,开始复习和学习C++的使用方法(之前的开发经历主要使用的Java,对C++和QT环境都需要一个再了解). Jan.3 正式开始工作.开始在Ubunt ...

  3. 当DevOps撞上物联网

    DevOps 领域在近年来变得流行而普遍.它强调不同的角色之间共同协作,以及如何工作得更加紧密,就像这个词语的词根暗示的那样--开发和运维.但是DevOps和物联网有什么关系? 本文选自<Dev ...

  4. solr 添加索引

    添加索引模板: <add> <doc> <field name="employeeId">05991</field> <fie ...

  5. 【BZOJ】3996: [TJOI2015]线性代数

    题意 给出一个\(N \times N\)的矩阵\(B\)和一个\(1 \times N\)的矩阵\(C\).求出一个\(1 \times N\)的01矩阵\(A\),使得\[ D = ( A * B ...

  6. 【ORACLE】MD5加密

        今天乌干达充值卡入库时,发现有资源已经存在的异常, 异常原因经过核实是由于卡资源密码在库中已经存在, 为进一步查找存在的原因, 因此需要对导入文件密码的MD5 加密, 通过MD5加密后的字符串 ...

  7. JavaScript-Object基础知识

    1.   定义:对象是JS的核心概念,也是最重要的数据类型.js的所有数据都可以被视为对象.                 对象是一种无序的数据集合,由若干个键值对(key:value)构成,由{ ...

  8. 关于zepto(相似于jquery、jQuery用于网页浏览器,zepto用于手机浏览器)

    http://blog.csdn.net/kongjiea/article/details/42522305   -----关于zepto和jquery的差别 jQuery 使用 .width() 和 ...

  9. 学习angular2

    最近在学angular2,并没有很深入,跟着官网做了一份练习,整理了一下,画了一个简单的结构图.

  10. java web(六)多个请求对应一个Servlet

    概要: 提交请求的常用方式有两种,get/post , 运行程序后被请求,在加载执行web.xml文件时通过该文件中的映射关系找到即将要执行的Servlet; 而在要执行的Servlet文件中可通过反 ...