Filter執行順序


ASP.NET MVC Framework支持四種不同類型的Filter:

  1. Authorization filters – 實現IAuthorizationFilter接口的屬性.
  2. Action filters – 實現IActionFilter接口的屬性.
  3. Result filters – 實現IResultFilter接口的屬性.
  4. Exception filters – 實現IExceptionFilter接口的屬性.

Filter的默認的執行順序按上面的列表中順序進行。如驗證(authorization)Filter永遠都是最開始執行的,異常(exception)Filter永遠都是最后執行的,當然你也可以根據需要通過Order屬性設定過濾器執行的順序。

 

ASP.NET MVC Framework包括幾種Action Filter:

 

名稱 說明
OutputCacheAttribute  類似於 Web Form中在 OutputCache 指令。 OutputCache 屬性允許在 MVC Framework 緩存控制器的輸出。
ValidateInputAttribute 

類似於 Web Form中 ValidateRequest 屬性。 MVC 框架默認將為 檢查HTML 或其他危險輸入傳入的 HTTP 請求。 如果檢測到,將引發異常。 使用此屬性可以禁用請求驗證。

AuthorizeAttribute Authorize 屬性,可以對控制器操做的聲明性的授權檢查。 該屬性可以限制特定角色中的用戶的操作。 當您創建只應該給管理員角色中的用戶的操作時,您可以使用此屬性。默認使用的ASP.NET Membership服務,如果不使用ASP.NET 的Membership服務,可以繼承AuthorizeAttribute,重寫實現。
ValidateAntiForgeryTokenAttribute 此屬性是一個解決方案以幫助防止跨站點的請求攻擊 (CSRF)。 它允許驗證的 HTTP POST 為特定於用戶的標記在 Framework。 有關詳細信息 CSRFs,請參閱" 使用 ASP.NET MVC AntiForgeryToken() 幫助器防止跨站點請求偽造 (CSFR)."

驗證(authorization)filter用於實現在controller action上的驗證和授權,如Authorize filter就是一個驗證filter的例子;

Action filter包含一些邏輯,用於該action執行之前或者之后。比如可以使用一個action filter來修改action返回的view data;

Result filter包含一些邏輯,用於該action的view result執行之前和之后。比如可以修改一個view result在view被呈現到瀏覽器之前;

異常(Exception)Action用於處理異常信息,同樣可以使用異常filter記錄錯誤日志。

這些的filter類型是根據指定的順序執行的,如果需要控制他們的執行順序,需要設置filter的Order屬性。

這些類的基類為System.Web.Mvc.FilterAttribute類,如果需要實現一個特定的filter類型,可以創建一個繼承這個類的類,並且實現一個或多個IAuthorization、IActionFilter、IResultFilter、ExceptionFilter接口。

Action過濾器的作用范圍

除了用Action過濾器標記一個Action方法外,你也可以用來標記一個完成的控制器類。如果這樣的話,這個Action過濾器將會應用到該控制器的所有Action方法上。

另外,如果你的控制器類繼承自別的控制器類,而基控制器類可能有它自己的Action過濾器Attributes。如果你在子類中重寫了基控制器類的Action方法,則子類的該Action方法也會有它自己的從基類繼承而來的Action過濾器Attributes。

Action過濾器的執行順序

每一個Action過濾器都有一個 Order 屬性,用來決定Action過濾器在該范圍內的執行順序。Order屬性必需是0(默認值)或者更大的整數值。省略Order屬性則會給該過濾器的Order值為 -1, 表明為指明順序。任何一個在同一范圍的Action過濾器Order設為 -1 的都將按不確定的順序執行,單在此之前過濾器有一個特定的順序(注:下面會說到).

當設置Order屬性的值的時候,必需指定一個唯一的值。如果兩個或者更多的Action過濾器具有相同的Order屬性值,將會拋出一個異常。

來看一個示例:

namespace WebApplication.Controllers
{
    [LoginCheckAttribute(Order=1)]
    [UserAuthorizeAttribute(Order=2)]
    public class BaseController : Controller
    {
    }
}
[Filter1(Order = 2)]
[Filter2(Order = 3)]
[Filter3(Order = 1)]
public void Index()
{
    RenderView("Index");
}

Filter的執行順序為:Filter3 => Filter1 => Filter2.

內置過濾器簡介

1 OutputCacheAttribute

[OutputCache(Duration=10,VaryByParam="none")]
        public ActionResult TestCache() {
            ViewBag.Time = DateTime.Now.ToString();
            return View();
        }

 


免責聲明!

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



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