Filter類型 | 接口 | MVC的默認實現 | Description |
Authorization | IAuthorizationFilter | AuthorizeAttribute | 最先執行,在其他類型的filter和action方法前執行 |
Action | IActionFilter | ActionFilterAttribute | 在action方法執行前和執行后執行 |
Result | IResultFilter | ActionFilterAttribute | 在result執行前和執行后執行 |
Exception | IExceptionFilter | HandleErrorAttribute | 在拋出異常時執行,(異常發生在action/result/filter) |
Authorization Filter
Authorization Filter是所有Filter類型中第一個執行的Filter,它在action方法調用前執行。Authorization Filter需要實現IAuthorizationFilter接口:
public interface IAuthorzationFilter { void OnAuthorization(AuthorizationContext context); }
可以看出,我們要實現Authorization機制的代碼就需要放在OnAuthorization方法中,而其參數類型AuthorizationContext繼承於ControllerContext,如下所示:
public class AuthorizationContext : ControllerContext { public AuthorizationContext(); public AuthorizationContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor); public virtual ActionDescriptor ActionDescriptor { get; set; } public ActionResult Result { get; set; } }
AuthorzationContext額外提供了Result屬性和ActionDescriptor屬性,result屬性表示授權階段呈現的ActionResult,而ActionDescriptor則包含了當前執行Action的信息。
Asp.net MVC給我們提供了一個IAuthorzationFilter的實現AuthorizeAttribute(沒錯,它是一個Attribute,繼承於FilterAttribute),該Attribute可以應用於Controller和Action, 它包含Roles和Users屬性,指定特定的角色和用戶才可以授權使用。比如:
public class HomeController : Controller { [Authorize(Users = "zhang, zheng", Roles = "admin")] public ActionResult Index() { return View(); } }
以上代碼表示只有用戶zhang,zheng並且擁有角色admin的用戶才可以被授權執行Index Action。
Exception Filter
當一個未處理異常拋出時,Exception Filter將會被執行。Exception Filter需要實現IExceptionFilter接口:
public interface IExceptionFilter { void OnException(ExceptionContext filerContext); }
ExceptionContext同樣繼承於ControllerContext,它提供了以下額外的屬性:
屬性名 | 類型 | 描述 |
ActionDescriptor | ActionDescriptor | 提供當前所執行的Action的信息 |
Result | ActionResult | Exception Filter所呈現的ActionResult |
Exception | Exception | 未處理的異常 |
ExceptionHandled | bool | 表示是否已有其他filter處理過此異常 |
ExceptionHandled是一個很重要的屬性。一般來說,當一個Exception Filter執行時,我們首先需要檢查ExceptionHandled屬性,如果為true,則表示已有其他filter處理過此異常了,就不需要再次進行處理了,以免覆蓋其他filter所解決的Exception。如果為false,則對該Exception進行相應的處理,處理之后將ExceptionHandled屬性設置為true。默認的,如果沒有Exception Filter將ExceptionHandled屬性設置為true, ASP.NET MVC將使用默認的異常處理,即顯示我們經常看到的異常頁面。