MVC与WebApi中的异常过滤器


一、MVC的异常过滤器

  1、自定义MVC异常过滤器 创建一个类,继承HandleErrorAttribute即可,如果不需要作为特性使用直接实现IExceptionFilter接口即可, 注意,该接口在System.Web.Mvc 命名空间下  
  1. /// 
    /// 自定义的MVC异常过滤器
    /// 可以在Controller或Action上单独使用,也可直接注册为全局过滤器
    /// 
    publicclassMVCExceptionFilterAttribution:HandleErrorAttribute
    {
    publicoverridevoidOnException(ExceptionContext filterContext)
    {
    base.OnException(filterContext);
    //标示当前异常已经被处理
    //如果不手动设置为false,则异常会被Application_Error事件捕获,并可能显示到客户端
    filterContext.ExceptionHandled=true;
    filterContext.Result=newContentResult(){Content="MVC Error"};
    }
    }
  2、注册MVC全局过滤器     直接在Global文件中的Application_Start事件中进行注册    
  1. protectedvoidApplication_Start()
    {
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    //注册全局的自定义MVC异常过滤器
    GlobalFilters.Filters.Add(newMVCExceptionFilterAttribution());
    }
    3、注册Asp.Net异常处理     除了可以注册MVC的异常处理过滤器外,还可以直接在Global文件中的Application_Error事件中处理Asp.Net中的异常
  1. /// 
    /// 处理Asp.Net中的异常
    /// Controller中未处理的异常会被这里捕获
    /// 
    publicvoidApplication_Error(object sender,EventArgs e)
    {
    var exception =Server.GetLastError();
    //处理异常
    }
  MVC中的异常首先会被过滤器捕获,如果异常在过滤中标识为已处理,则不会被Application_Error事件再次捕获,否则Application_Error事件中的代码会被触发。         二、WebApi中异常过滤器   1、自定义WebApi异常过滤器       创建一个类,继承自ExceptionFilterAttribute即可,如果不需要以特性的方式进行使用,则只需要实现IExceptionFilter接口即可, 注意,该接口在System.Web.Http.Filters命名空间下  
/// 
/// WebApi异常过滤器
/// 可以在Controller或Action上单独使用,也可直接注册为全局过滤器
/// 
publicclassWebApiExceptionFilterAttribution:ExceptionFilterAttribute
{
publicoverridevoidOnException(HttpActionExecutedContext actionExecutedContext)
{
base.OnException(actionExecutedContext);
actionExecutedContext.Response=newSystem.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK){ReasonPhrase="api error"};
}
}
  2、注册全局WebApi过滤器     同样在Global文件中的Application_Start事件中进行过滤器的注册, 注意,与MVC不同,此处是在GlobalConfiguration上进行注册
protectedvoidApplication_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
//注册MVC中的过滤器 详见MVCExceptionFilter项目示例
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//注册一个自定义的全局WebApi异常过滤器
GlobalConfiguration.Configuration.Filters.Add(newWebApiExceptionFilterAttribution());
}
    3、注册Asp.Net异常处理     在WebApi的项目中同样可以注册Asp.Net的异常处理事件,但是此处并不会捕获WebApi中APIController中抛出的异常,只会捕获MVC中 Controller抛出的异常
/// 
/// 处理Asp.Net中的异常
/// Controller中未处理的异常会被这里捕获
/// 但ApiController中的异常不会被捕获
/// 
publicvoidApplication_Error(object sender,EventArgs e)
{
var exception =Server.GetLastError();
//处理异常
}
  参考资料:     ASP.Net MVC过滤器     ASP.Net WebApi异常处理     HttpApplication.Error 事件