Filter攔截器
Aop是MVC的主要設計方式之一,而微軟也希望我們在使用MVC的時候更好的使用攔截器來進行切面編程。攔截器則是Mvc中的一大亮點與重點
AOP(面向切面)編程已經廣泛應用在各個項目中,切面編程把我們的action切出了執行前與執行后或者是特定的需求比如異常發生時。讓我們可以在切面中從容的完成記日志、檢查權限等操作。在action中開發人員只需要關於核心業務。
可以看到Controller已經為我們集成了一些Filter接口
IActionFilter -- > Action執行前后
IAuthenticationFilter --> Action安全驗證
IAuthorizationFilter --> Action身份驗證
IExceptionFilter --> Action出現異常時
IResultFilter --> 結果返回前后
但是我們的Controller並沒有去實現這些接口中的方法,而是留給了子類也就是xxxController我們的控制器去實現。我們可以去重寫方法,但是這種方式只能在當前的控制器生效,並不能在其它的控制器中生效,這顯然並不是我們想要的。
現在我需要在action執行前去驗證一下參數的合法性並適用與所有的Controller,我們可以創建一個Attribute繼承IActionFilter和Attribute,更簡單的我們可以直接繼承ActionFilterAttribute重寫OnActionExecuting方法 (actionFilterAttribut繼承了IActionFilter與IResultFilter)
下面進行了簡單的一個判斷,如果UserName為null或者不等於admin就跳轉到Error頁面
然后再加到action上就可以完成了,但是上面提到了,我們在所有的Controller中都要用到,難道里面每個action都要去加,這太麻煩。 我們可以加到Filter的集合中在Global中進行初化。
淺談內部原理
這里不對所有的攔截器都演示一次,因為講起來篇幅挺多的。大多在博客園都可以找到不錯的文章。這里講一下像ActionFilter背后是如何實現的,是如何在action前后進行攔截的
重點其實就在AsyncControllerActionInvoker類中的InvokeActionMethodFilterAsynchronouslyRecursive方法,在這里執行了filter的OnActionExceuting方法,然后判斷Result是否為空,否的話就直接到OnActionExecuted不會走action了。 在try里可以看到方法是遞歸調用的,正常的話會去執行我們的action然后再回到這邊調用OnActionExceuted








