ASP.NET MVC中有四种过滤器类型

【MVCFilter介绍】

首先大家得了解下MVC中的Filter效果:Filter是指的是MVC支持的一系列过滤器,包含权限验证、异常处理和Action/Result的方法过滤器,能够在不修改Action方法的基础上,为Action提供权限验证、异常处理、Action执行前后和Result执行前后,加入各种不同的功能,是MVC开发必备,同时也是相对于Webform最大的变革之一。

MVC框架支持的Filter时序图,支持在这些环节做各种功能扩展,后续会有MVC的Filter专题文章,去完成花式的扩展,敬请关注!

Filter是AOP思想实践,能完成系统的优雅扩展,然而这个又是怎么实现的呢?跟之前几篇文章中的AOP实现有什么差别呢?Let’s go!

【Filter原理】

介于篇幅限制,下文直接看重点。Asp.Net的请求最终都是由HttpHandler处理的,而MVC中默认的是MVCHandler的ProcessRequest来完成请求处理:

在MVChandler中完成控制器的实例化,然后去Execute其Action(MVC的请求最终是Action响应的)。

然后Controller里面是通过一个ActionInvoker来完成Action的调用。

在ControllerActionInvoker里面,我们看到InvokeAction方法在完成简单参数校验后,先查找Action和Controller上面的Filter,然后就去调用权限认证的Filter(权限认证第一个完成),然后以Context的Result为标志决定是否继续流程,随后又进行了ActionFilter和ResultFilter的调用,而且这整个过程被包含在try-catch中,有异常的话就进入了异常处理的Filter。是的,一切如我们所想的一样,但是这源码的细节还是太复杂,没法一一展示,只能是明白了大体思路,下面Eleven老师将这个大体思路加以实践!

【手写模拟Filter】

首先我们需要定义一个Filter的父类,然后定义几个子类,并且标记到对应的方法:

然后需要一个统一的入口来完成方法的调用,跟MVC的请求一样,需要类/方法/参数:

这里还有个问题,类名称是怎么找到一个具体的类型的呢,还缺命名空间呀?这里按照MVC的模式模拟,直接反射遍历bin里面全部的dll,找出满足类型为BaseController的类,放入一个静态字典。

然后我们就能做到,通过给方法添加特性标识,然后在方法执行时,自动的在方法前后增加对应的逻辑。Demo相对简陋,只是对MVC中Filter核心的一种模拟,核心思想为反射调用方法,支持特性检测,并增加对应的功能调用!

【结语】

本文揭示了MVC框架中,Filter的实现原理,以及通过手写一个简单的发射+特性+统一入口的形式完成AOP的效果,希望能丰富大家对AOP的认知,也让大家在使用Filter的时候能更清晰,能知道Filter的作业,也能知道Filter的局限,知其然还得知其所以然!欢迎关注公众号,欢迎讨论,欢迎转发,愿天下有需求的人都能看到!

猜你喜欢

转载自blog.csdn.net/ybb350680013/article/details/88300097