一、五大過濾器
1.授權過濾器
(1) 說明:它是過濾器管道中第一個過濾器,控制對方法的訪問,僅有在它之前執行的方法,沒有之后;在授權過濾器中不會處理異常, 異常過濾器也捕獲到其中產生的異常,因此要小心應對。
(2) 實現:繼承Attribute類,實現IAuthorizationFilter接口,重寫OnAuthorization方法。
注:繼承Attribute類的目的是可以該過濾器以特性的形式作用於Controller或Action,下面過濾器都類似,不再說明。
(3).用途:通常用來做權限校驗(詳見下面案例應用)。
2. 資源過濾器
(1) 說明:只有授權過濾器在資源過濾器之前運行,里面的OnResourceExecuting重寫是在創建控制器調用的。
(2) 實現:繼承Attribute類,實現IResourceFilter接口,重寫OnResourceExecuting 和 OnResourceExecuted方法。
(異步的話實現IAsyncResourceFilter接口,重寫OnResourceExecutionAsync方法)
(3) 用途:做一些對變化要求不高的頁面的緩存(詳見下面案例應用)。
3. 操作過濾器(行為過濾器)
(1) 說明:分別在操作方法之前和之后執行
(2) 實現:繼承Attribute類,實現IActionFilter接口,重寫OnActionExecuting 和 OnActionExecuted方法。 或者直接繼承ActionFilterAttribute類,觀察源碼可知,該類繼承了Attribute類,而且還實現IActionFilter,IResultFilter接口。(異步的話實現IAsyncActionFilter接口,重寫OnActionExecutionAsync方法)
4. 結果過濾器
(1) 說明:在方法執行前后,且操作過濾器之后;結果(如:頁面渲染)的前后運行。
(2) 實現:繼承Attribute類,實現IResultFilter接口,重寫OnResultExecuting 和 OnResultExecuted方法。 或者直接繼承ResultFilterAttribute類,(或ActionFilterAttribute類), 觀察源碼可知,該類繼承了Attribute類,而且還實現IResultFilter接口。(異步的話實現IAsyncActionFilter接口, 重寫OnActionExecutionAsync方法) 還可以實現:IAlwaysRunResultFilter 或 IAsyncAlwaysRunResultFilter 接口。
(3).用途:可以獲取action的返回結果,進行一些處理,比如:根據要求返回json數據或jsonp數據(詳見cors章節)。
5. 異常過濾器
(1) 說明:用於實現常見的錯誤處理策略,沒有之前和之后事件,處理 Razor 頁面或控制器創建、模型綁定、操作過濾器或操作方法中發生的未經處理的異常。 但無法捕獲資源過濾器、結果過濾器或 MVC 結果執行中發生的異常 。
(2) 實現:繼承Attribute類,實現IExceptionFilter接口,重寫OnException方法。 或者直接繼承ExceptionFilterAttribute類,觀察源碼可知,該類繼承了Attribute類,而且還實現IExceptionFilter接口。(異步的話實現 IAsyncExceptionFilter接口,重寫OnExceptionAsync方法)
(3) 用途:全局捕獲異常,進行相關處理。
二、執行順序
1. 過濾器執行順序
異常過濾器不參與測試,測試剩余四個過濾器的執行順序,將四個過濾器在下面Index2方法上,經斷點測試執行順序如下:
OnAuthorization→OnResourceExecuting→創建控制器→OnActionExecuting→執行action業務→OnActionExecuted→OnResultExecuting→頁面渲染加載→
OnResultExecuted→OnResourceExecuted
三、使用方法
一、授權過濾器,用於判斷方法是否運行匿名方法

2、行為過濾器實現權限判斷

3、結果過濾器
public class MyResultFilterAttribute : ResultFilterAttribute { public override void OnResultExecuting(ResultExecutingContext context) { base.OnResultExecuting(context); } public override void OnResultExecuted(ResultExecutedContext context) { base.OnResultExecuted(context); } }
4、異常過濾器
public class ExceptionHandler:ExceptionFilterAttribute { public override void OnException(ExceptionContext context) { base.OnException(context); if (!context.ExceptionHandled)//如果異常沒有被處理過 { string controllerName = (string)context.RouteData.Values["controller"]; string actionName = (string)context.RouteData.Values["action"]; //string msgTemplate =string.Format( "在執行controller[{0}的{1}]方法時產生異常",controllerName,actionName);//寫入日志 ; } } }
