过滤器可以把附加逻辑注入到MVC框架的请求处理。它们实现了交叉关注。所谓交叉关注是指,可以用于整个应用程序,而又不适合放置在某个局部的位置的功能,否则会打破关注分离模式。
MVC有五种类型的过滤器,每种类型能让你在请求处理的不同点上引入逻辑。
过滤器类型 | 接口 | 默认实现 | 描述 |
认证过滤器 | IAuthenticationFilter | N/A | 最先运行,在其他任何过滤器或动作方法之前运行,但在授权过滤器之后可以在此运行。 |
授权过滤器 | IAuthorizationFilter | AuthorizeAttribute | 在认证之后,其他过滤器或动作方法之前运行。 |
动作过滤器 | IActionFilter | ActionFilterAttribute | 在动作方法之前和之后运行 |
结果过滤器 | IResultFilter | ActionFilterAttribute | 在动作结果被执行之前和之后运行 |
异常过滤器 | IExceptionFilter | HandleErrorAttribute | 仅在一个过滤器,动作方法或动作结果抛出异常时运行。 |
在MVC框架调用一个动作之前,会首先检测该方法的定义,以查看它是否具有实现上述接口的注解属性。如果有,那么便在请求处理程序的响应点上调用接口所定义的方法。
授权过滤器
授权过滤器会执行你的授权策略,以确保动作方法只被已认证用户调用,它有两个属性来指定授权策略:
名称 | 类型 | 描述 |
Users | String | 一个逗号分隔的用户名列表,允许这些用户访问这些动作方法 |
Roles | String | 一个逗号分隔的角色列表,为了访问该动作方法,用户至少是角色之一 |
异常过滤器
在调用一个动作方法时,如果抛出未处理的异常,异常过滤器才会运行。
异常过滤器必须实现IExceptionFilter接口,实现该接口需要实现OnException()方法,该方法有一个ExceptionContext类型参数,可以获取控制器和异常的信息,并能控制对异常的处理行为。
其中Result属性可以决定对异常的处理行为,一般传递一个重定向对象跳转到404页面。
ExceptionHandled可以将异常标记为“已处理”,这样就不会显示恐怖的“黄色屏幕”。
在实际项目中,我们往往不需要自己创建异常过滤器,因为微软已经创建好了HandleErrorAttribute这个异常处理类。
常用的属性有:ExceptionType通过指定捕获特定的异常,忽略其他异常。
View指定异常页面的视图名称。
1. 在使用异常过滤器前需要在web.config中添加如下属性
<customErrors mode="On" defaultRedirect="/Content/ErrorPage.html"></customErrors>
将mode设置为On是为了在调试期间也能会拦截异常,默认是RemoteOnly,意味开发期间不会拦截异常。
2. 运用内建的异常过滤器
[HandleError(ExceptionType = typeof(ArgumentException),View = "ErrorPage")]
public string Delete()
{
throw new ArgumentException("参数名不正确");
}
这样一旦在方法中出现了ArgumentException,就会跳转到ErrorPage页面