這篇文章主要為大家詳細介紹了asp.net core MVC 全域過濾器之ExceptionFilter過濾器,具有一定的參考價值,感興趣的小夥伴們可以參考一下
本系類將會講解asp.net core MVC中的內建全域過濾器的使用,將分為以下章節
asp.net core MVC 過濾器之ExceptionFilter過濾器(一)
asp.net core MVC 過濾器之ActionFilter過濾器(二)
asp.net core MVC 過濾器之ResultFilter過濾器(三)
asp.net core MVC 過濾器之ResourceFilter過濾器(四)
asp.net core MVC 過濾器之AuthorizationFilter過濾器(五)
簡介
異常過濾器,顧名思義,就是當程式發生異常時所使用的過濾器。用於在系統出現未捕獲異常時的處理。
實現一個自訂異常過濾器
自訂一個全域異常過濾器需要實現IExceptionFilter介面
public class HttpGlobalExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { throw new NotImplementedException(); } }
IExceptionFilter介面會要求實現OnException方法,當系統發生未捕獲異常時就會觸發這個方法。OnException方法有一個ExceptionContext異常上下文,其中包含了具體的異常資訊,HttpContext及mvc路由資訊。系統一旦出現未捕獲異常後,比較常見的做法就是使用日誌工具,將異常的詳細資料記錄下來,方便修正調試。下面是日誌記錄的實現。
/// <summary> /// 全域異常過濾器 /// </summary> public class HttpGlobalExceptionFilter : IExceptionFilter { readonly ILoggerFactory _loggerFactory; readonly IHostingEnvironment _env; public HttpGlobalExceptionFilter(ILoggerFactory loggerFactory, IHostingEnvironment env) { _loggerFactory = loggerFactory; _env = env; } public void OnException(ExceptionContext context) { var logger = _loggerFactory.CreateLogger(context.Exception.TargetSite.ReflectedType); logger.LogError(new EventId(context.Exception.HResult), context.Exception, context.Exception.Message); var json = new ErrorResponse("未知錯誤,請重試"); if (_env.IsDevelopment()) json.DeveloperMessage = context.Exception; context.Result = new ApplicationErrorResult(json); context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.ExceptionHandled = true; }public class ApplicationErrorResult : ObjectResult { public ApplicationErrorResult(object value) : base(value) { StatusCode = (int)HttpStatusCode.InternalServerError; } }public class ErrorResponse { public ErrorResponse(string msg) { Message = msg; } public string Message { get; set; } public object DeveloperMessage { get; set; } }
註冊全域過濾器
過濾器已經編寫完畢,接下來就需要在asp.net core MVC中註冊。找到系統根目錄Startup.cs檔案,修改ConfigureServices方法如下
services.AddMvc(options => { options.Filters.Add<HttpGlobalExceptionFilter>(); });
測試
在請求中拋出一個異常
日誌正確捕獲到異常資訊
瀏覽器返回500錯誤,並且返回自訂的錯誤資訊。