一、MVC的异常过滤器
1、自定义MVC异常过滤器
创建一个类,继承HandleErrorAttribute即可,如果不需要作为特性使用直接实现IExceptionFilter接口即可,
注意,该接口在System.Web.Mvc 命名空间下
-
/// <summary> /// 自定义的MVC异常过滤器 /// 可以在Controller或Action上单独使用,也可直接注册为全局过滤器 /// </summary> 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事件中进行注册
-
protectedvoidApplication_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); //注册全局的自定义MVC异常过滤器 GlobalFilters.Filters.Add(newMVCExceptionFilterAttribution()); }
3、注册Asp.Net异常处理
除了可以注册MVC的异常处理过滤器外,还可以直接在Global文件中的Application_Error事件中处理Asp.Net中的异常
-
/// <summary> /// 处理Asp.Net中的异常 /// Controller中未处理的异常会被这里捕获 /// </summary> publicvoidApplication_Error(object sender,EventArgs e) { var exception =Server.GetLastError(); //处理异常 }
MVC中的异常首先会被过滤器捕获,如果异常在过滤中标识为已处理,则不会被Application_Error事件再次捕获,否则Application_Error事件中的代码会被触发。
二、WebApi中异常过滤器
1、自定义WebApi异常过滤器
创建一个类,继承自ExceptionFilterAttribute即可,如果不需要以特性的方式进行使用,则只需要实现IExceptionFilter接口即可,
注意,该接口在System.Web.Http.Filters命名空间下
/// <summary> /// WebApi异常过滤器 /// 可以在Controller或Action上单独使用,也可直接注册为全局过滤器 /// </summary> 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抛出的异常
/// <summary> /// 处理Asp.Net中的异常 /// Controller中未处理的异常会被这里捕获 /// 但ApiController中的异常不会被捕获 /// </summary> publicvoidApplication_Error(object sender,EventArgs e) { var exception =Server.GetLastError(); //处理异常 }
参考资料:
时间: 2024-10-22 08:35:55