一、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(); //處理異常 }
?
參考資料:
ASP.Net MVC過濾器
ASP.Net WebApi異常處理
HttpApplication.Error 事件