.NET绿叶社区!
返回

IL源码解读,理解MVC里面Filter这个AOP的实现原理

2020-06-11 MVC Filter AOP 239 0

MVC的请求是由Action响应的,Action是一个实例方法,得先实例化控制器再InvokeAction,MVCHandler完成Controller的实例化,控制器的实例+Action名称交给ControllerActionInvoker,InvokeAction找出Filter,做各种检查,如果Result不为空就直接Result,如果为空继续执行Action。

IL解读MVCHandler

IL源码解读,理解MVC里面Filter这个AOP的实现原理

ProcessRequest里实例化控制器,controller.Excute完成方法调用。

IL源码解读,理解MVC里面Filter这个AOP的实现原理

子类里执行ExcuteCore,负责调用方法。ControllerActionInvoker的InvokeAction执行Action方法。

IL源码解读,理解MVC里面Filter这个AOP的实现原理

找出Descriptor描述的特性,Filter,先检查Filter,如果有Result就直接返回Result,如果没有Result再执行Action。

IL源码解读,理解MVC里面Filter这个AOP的实现原理

IL源码解读,理解MVC里面Filter这个AOP的实现原理

MVC再调用方法前检查了特性,满足某个特性就先执行特性的东西,这样就等同在方法前加入了新的逻辑。这就是AOP的效果。

示例:权限验证AOP实现[Authorize]

OnAuthorization这个方法会发生在Action执行之前。效果:在没有修改Action,Action执行前,能自动取执行AuthorizeAttribute的方法。

1 标记到Action,Action注册,只对Action生效

2 Controller注册,对Controller生效

3 全局注册,在Global注册FilterConfig

[AllowAnonymous]标记匿名特性,全局检测需要在AuthorizeAttribute里处理支持,方法如下

 if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))

    return;

if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))

    return;

点赞 收藏

顶部