在asp.net mvc中使用自定义的Exception Filter
Filter在请求管道注入额外的逻辑。他们提供简单优雅的方法实现横切点关注。这个术语指的是在穿越整个应用程序中使用,而且不适合使用在任何单独的地方,所以这会打破关注模式的分离。经典的横切点关注的例子比如日志,认证,缓存。
Filter也被认为是横切点关注,因为这个术语在其他web application框架,包括Ruby也是实现同样功能。然而MVC Framework Filter完全不同于ASP.NET 平台的Request.Filter和Response.Filter对象。Request.Filter和Response.Filter对象在request和response流上执行转换。你可以在MVC application中使用Request.Filter 和Response.Filter,但是,通常当ASP.NET MVC程序员谈到filter时,指的是接下要谈的类型,在本文,我们会展示MVC Framework提供的filter不同的之类,如何创建使用filter,如何控制他们的执行。
我们想要在每个控制器处理数据的过程中 自动处理异常 并且转至一个友好的错误信息页面 在之前的web开发过程中 我们会在try catch中扑捉这样的异常信息并且转至我们希望的页面。这样一来 我们需要在每个catch中做相同的工作
/// <summary>
/// 自定义异常过滤器
/// </summary>
public class CustomerExceptionFilter : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
//异常未被处理
if (!filterContext.ExceptionHandled)
{
//异常类型
//重定向至错误页面
if (filterContext.Exception is ArgumentNullException)
{
filterContext.Result = new RedirectResult("/CustomerException/ArgumentException");
filterContext.ExceptionHandled = true;
}
else if (filterContext.Exception is NullReferenceException) { }
{
filterContext.Result = new RedirectResult("/CustomerException/NullException");
filterContext.ExceptionHandled = true;
}
}
}
}
Filter是.NET特性,它是加在request处理管道上的额外步骤。
特性是从System.Attribute继承的特殊的.NET类。你可以把它们附加到其它代码上,包括类,方法,属性,字段。目的就是在编译的代码中植入额外的信息,在运行事情你就可以读回它们。
C#中,特性使用的时候要加上方括号,你能通过命名参数语法组合它们的公共属性(比如,[MyAttribute(SomeProperty=value)])。在C#编译器命名约定中,如果特性类以单词Attribute结尾,你可以忽略这部分(比如,应用AuthorizeAttribute时,可以直接写[Authorize])Filter的四种基本类型
MVC Framework 支持四种不同的filter类型。每个都允许你在请求管道的不同点处引入自己的逻辑,下表列出了这四种类型。![图片](http://p.qpimg.cn/cgi-bin/cgi_imgproxy?url=http%3A%2F%2Fimg1.51cto.com%2Fattachment%2F201204%2F10%2F2359144_1334046701RizP.jpg&size=0)
在MVC Framework调用action之前,它会检查方法定义,查看实现了上述表格中的接口的特性是否存在。如果存在,那么在request管道的恰当处,有这些接口定义的方法就会被调用。framework包括了实现filter接口的默认的特性类。
在上面的自定义异常过滤器类中 主要继承了FilterAttribute 并且实现了IExceptionFilter接口的OnException方法。下面我们在Controller和action中应用以上Filter
你可以应用多个filter,无论他们匹配到controller或者单个action方法。