在asp.net mvc中使用自定义的Exception Filter

在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类型。每个都允许你在请求管道的不同点处引入自己的逻辑,下表列出了这四种类型。
图片

在MVC Framework调用action之前,它会检查方法定义,查看实现了上述表格中的接口的特性是否存在。如果存在,那么在request管道的恰当处,有这些接口定义的方法就会被调用。framework包括了实现filter接口的默认的特性类。

在上面的自定义异常过滤器类中 主要继承了FilterAttribute 并且实现了IExceptionFilter接口的OnException方法。下面我们在Controller和action中应用以上Filter

//[HandleError(ExceptionType = typeof(NullReferenceException), View = "ArgumentNullException")]
//[HandleError(ExceptionType = typeof(ArgumentException), View = "NullException")]
[CustomerExceptionFilter]
public class HelpController : Controller
{
 
public string Param(int id)
{
return "传递的参数是:ID:" + id.ToString();
}
 
public string Index()
{
return "传递的参数是:ID:";
}
}

你可以应用多个filter,无论他们匹配到controller或者单个action方法。
posted on 2013-03-06 10:03  Tank_xiao  阅读(388)  评论(0编辑  收藏  举报