MVC的请求是由Action响应的,Action是一个实例方法,得先实例化控制器再InvokeAction,MVCHandler完成Controller的实例化,控制器的实例+Action名称交给ControllerActionInvoker,InvokeAction找出Filter,做各种检查,如果Result不为空就直接Result,如果为空继续执行Action。
IL解读MVCHandler
ProcessRequest里实例化控制器,controller.Excute完成方法调用。
子类里执行ExcuteCore,负责调用方法。ControllerActionInvoker的InvokeAction执行Action方法。
找出Descriptor描述的特性,Filter,先检查Filter,如果有Result就直接返回Result,如果没有Result再执行Action。
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;