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 }

行为过滤器大概的运行过程解说完成了,下一篇会对这样的类型的过滤器的应用作大概解说。

 

 

 

 

 

作者:金源

转载于:https://www.cnblogs.com/ldxsuanfa/p/10718006.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值