MVC与WebApi中的异常过滤器
一、MVC的异常过滤器
1、自定义MVC异常过滤器 创建一个类,继承HandleErrorAttribute即可,如果不需要作为特性使用直接实现IExceptionFilter接口即可, 注意,该接口在System.Web.Mvc 命名空间下-
///
/// 自定义的MVC异常过滤器 /// 可以在Controller或Action上单独使用,也可直接注册为全局过滤器 /// publicclassMVCExceptionFilterAttribution:HandleErrorAttribute { publicoverridevoidOnException(ExceptionContext filterContext) { base.OnException(filterContext); //标示当前异常已经被处理 //如果不手动设置为false,则异常会被Application_Error事件捕获,并可能显示到客户端 filterContext.ExceptionHandled=true; filterContext.Result=newContentResult(){Content="MVC Error"}; } }
-
protectedvoidApplication_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); //注册全局的自定义MVC异常过滤器 GlobalFilters.Filters.Add(newMVCExceptionFilterAttribution()); }
-
///
/// 处理Asp.Net中的异常 /// Controller中未处理的异常会被这里捕获 /// publicvoidApplication_Error(object sender,EventArgs e) { var exception =Server.GetLastError(); //处理异常 }
///2、注册全局WebApi过滤器 同样在Global文件中的Application_Start事件中进行过滤器的注册, 注意,与MVC不同,此处是在GlobalConfiguration上进行注册/// WebApi异常过滤器 /// 可以在Controller或Action上单独使用,也可直接注册为全局过滤器 /// publicclassWebApiExceptionFilterAttribution:ExceptionFilterAttribute { publicoverridevoidOnException(HttpActionExecutedContext actionExecutedContext) { base.OnException(actionExecutedContext); actionExecutedContext.Response=newSystem.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK){ReasonPhrase="api error"}; } }
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 MVC过滤器 ASP.Net WebApi异常处理 HttpApplication.Error 事件/// 处理Asp.Net中的异常 /// Controller中未处理的异常会被这里捕获 /// 但ApiController中的异常不会被捕获 /// publicvoidApplication_Error(object sender,EventArgs e) { var exception =Server.GetLastError(); //处理异常 }