過濾器又名爲篩選器,可以爲咱們優雅的處理某一類需求提供解決方案,好比用戶登陸、自定義數據上下文初始化、捕獲異常、發佈公告等。從功能性上來說過濾器沒什麼與優點,即過濾器可實現的功能也能夠經過傳統 命令式編程 方式實現。之因此推薦使用過濾器編程,是由於過濾器在優化系統/代碼結構,提升代碼可讀性上更優異。web
接下來用一個簡單的例子說明下,編程
public class LogErrorFilter : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { LogHelper.LogDetail(filterContext.Exception); } }
使用聲明的方式在Controllermvc
[LogErrorAttribute]
public class HomeController : Controller
{
public ActionResult Index()
{
throw new NotImplementedException();
}
public ActionResult Login()
{
throw new NotImplementedException();
}
}優化
LogErrorAttribute將會做用在Index和Login兩個Action上url
使用聲明的方式在Action上code
public class HomeController : Controller
{
[LogErrorAttribute]
public ActionResult Index()
{
throw new NotImplementedException();
}
public ActionResult Login()
{
throw new NotImplementedException();
}
}blog
LogErrorAttribute僅會做用在Index一個Action上。繼承
將LogErrorAttribute註冊到 HttpApplication中,即在Global的Application_Start方法作以下操做接口
protected void Application_Start() { GlobalFilters.Filters.Add(new LogErrorAttribute()); }
若是項目中存在FilterConfig類,則能夠這樣操做ip
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new LogErrorAttribute()); }
這樣,LogErrorAttribute就會記錄該web項目全部Action引起的異常。
自定義的受權過濾器能夠經過繼承FilterAttribute和實現IAuthorizationFilter來實現,覆寫的接口OnAuthorization
對於須要攔截的請求只須要給AuthorizationContext的Result屬性賦值便可。
public class LoginCheckFilterAttribute : FilterAttribute,IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { if (!AuthorizeCore(filterContext)) //具體驗證用戶的邏輯 { var url = HttpUtility.UrlEncode(filterContext.HttpContext.Request.RawUrl); filterContext.Result = new RedirectResult((new UrlHelper(filterContext.RequestContext)).Content("/Login/Index?returnUrl=" + url)); } } }