MVC的ActionFilter
1. Filter是Aop的一种实现, 权限Filter, 异常Filter,ActionFilter
2.扩展ActionFilter
2.1)ActionFilterAttribute
这个类里面的四个方法都可以扩展,
2.2)ActionFilter的执行顺序
2.2.1.Action执行之前执行OnActionExecuting方法
2.2.2.Action执行之后View执行之前,先执行OnActionExecuted,然后执行OnResultExecuting
2.2.3.结果执行完之后,执行OnResultExecuted
****ActionFilter可以在方法执行前后,视图替换前后,加入逻辑
2.3)ActionFilter扩展和使用步骤:
2.3.1.扩展ActionFilter中的4个方法
2.3.2.注册扩展方法
2.4)ActionFilter扩展应用
例子:
网站运行模式是一种请求---响应,传输数据流---就有压缩数据流的需求---速度快,节约带宽
压缩过程:
浏览器请求时声明支持的压缩类型Accept-encoding---服务器响应时,就将数据压缩---
通过content-encoding告诉浏览器数据的压缩类型---浏览器就自行解压然后展示
2.4.1 ActionFilter扩展类
2.4.2 注册扩展类
3.Action的执行时间顺序过程(依次向下)
OnAuthorization: 权限认证
OnActionExcuting
Action
OnActionExcuted
OnResultExcuting
Render(生成试图):ExcuteResult
OnResultExcuted
***权限认证里面的异常,可以被异常捕获到
****ActionFilter里面的异常,也可以被异常捕获到
****MVC中所有的Filter都是在控制器实例化之后,执行Action方法之前,而filter的执行以及Action的执行都在try-catch中,所以可以被捕获到
4.那些场景下可以用ActionFilter4.1)统计Action的执行时间--->可以实现4.2)把这个页面上次响应的内容缓存下来,下次请求不进Action,直接返回
实现过程:
OnActionExcuting-->找缓存---key(url什么的)--value(就是viewResult)
OnResultExceted --保存缓存---key(url什么的)--value(就是viewResult)
比较麻烦,但是.net core里面的ResourceFilter可以轻松实现
4.3) Action调用多个BLL层,调用前后调入日志记录-->Aop无法实现
Filter的粒度是在方法Action,无法到达方法里面
在service层需要事务,log的时候,像这种情况,需要借助另外的AOP方式,一般是IOC容器的AOP扩展
Aop是一种程序设计思想,是OOP的一个补充升级
OOP是静态的,如果有变化,就得修改
而AOP可以不修改Action方法就增加功能