ASP.NET MVC 过滤器(一)

前言

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

ASP.NET MVC过滤器

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

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

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

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

图1

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

图2

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

     //封装有关可用的操作筛选器的信息。
public class FilterInfo
{
public FilterInfo();
public FilterInfo(IEnumerable<Filter> filters);
public IList<IActionFilter> ActionFilters { get; }
public IList<IAuthorizationFilter> AuthorizationFilters { get; }
public IList<IExceptionFilter> ExceptionFilters { get; }
public IList<IResultFilter> ResultFilters { get; }
}

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

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

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

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

     [Authorize(Order=)]
public class DemoController : Controller
{
……
}

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

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

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

看一下IFilterProvider类型的结构:

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

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

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

图3

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

     public interface IAuthorizationFilter
{
// 摘要:
// 在需要授权时调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnAuthorization(AuthorizationContext filterContext);
}

看到如上的定义,再看图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. MachineKey 操作 之 获取 MachineKey

    MachineKey获取介绍 对MachineKey进行配置,以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证.本次讲的是如 ...

  2. WebGL与three.js

    前面学习了一些webgl的基础知识,现在就用一下three.js写一个小例子,记录一下学习的过程. 效果图: 1.去github下载three.js,然后将它加载到网页中 <script src ...

  3. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  4. 好文分享_java堆栈的区别

    Java Heap Memory Heap memory is used by java runtime to allocate memory to Objects and JRE classes. ...

  5. C# DataGridView绑定数据源

    第一种: DataSet ds=new DataSet (); ]; 第二种: DataTable dt=new DataTable(); this.dataGridView1.DataSource= ...

  6. [NOIP2014]寻找道路 题解

    题目大意: 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足 ...

  7. 苹果手机微信上form表单提交的问题

    场景:前端页面请求后端php,返回带form表单dom元素,然后将其追在页面上,返回的html字段中包含表单自动提交的代码,想法是将带有表单自动提交的dom元素追加到页面上,然后表单自动提交到另外一个 ...

  8. 如何发布付费WP8应用

    如何发布付费应用,听起来蛮简单的,事实上也确实如此,但是发布付费WP8应用前的资料填写却让我郁闷不已. 我打开仪表板,点击进入账户--账户摘要,填写税务资料和付款账户,发现付款账户保存成功了,税务资料 ...

  9. mvn使用笔记

    mvn命令格式: You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:< ...

  10. Web API Get Started First

    注:此博客是自官网修剪而来,博主IT新手 一.web api与web service的不同: web api是基于Http协议,而web service是基于soap协议.两协议的区别小子看了很多,但 ...