.NET CORE 五大過濾器


一、五大過濾器

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);//寫入日志


;
            }
        }

    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM