过滤器又名为筛选器,可以为咱们优雅的处理某一类需求提供解决方案,好比用户登陆、自定义数据上下文初始化、捕获异常、发布公告等。从功能性上来说过滤器没什么与优点,即过滤器可实现的功能也能够经过传统 命令式编程 方式实现。之因此推荐使用过滤器编程,是由于过滤器在优化系统/代码结构,提升代码可读性上更优异。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)); } } }