1.一共有五類過濾器IAsyncAuthorizationFilter IAsyncResourceFilter IAsyncActonFilter IAsyncExceptionFilter IAsyncResultFilter 去掉Async就是同步的
2.注冊過濾器 全局注冊和Attribute注冊 用在特定的Action上
通過ExceptionFilterAttribute過濾器實現全局異常處理
(1)新建ErrorFilterAttribute.cs文件繼承ExceptionFilterAttribute類,實現OnException方法
/// <summary> /// 處理異常信息 /// </summary> /// <param name="context"></param> public override void OnException(ExceptionContext context) { ContentResult result = new ContentResult { StatusCode = 500, ContentType = "application/json; charset=utf-8" }; var error = new ErrorEntity { CreateDate = DateTime.Now, DealData = "", ErrorFrom = ErrorFrom.Site, Exception = context.Exception.ToString(), IsSolved = false, OsInfo = Environment.OSVersion.Platform.ToString(), Solution = "", SolvedBy = "", UserId = context.HttpContext.AuthenticateAsync().Result.Principal.CurUserID(), Version = "1.0.0", StackTrace = context.Exception.StackTrace }; var thread = new Thread(AddError); thread.Start(error); result.Content = JsonConvert.SerializeObject(new MethodResult(context.Exception.Message)); context.Result = result; context.ExceptionHandled = true; context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; }
(2) 異常寫入數據庫中
/// <summary> /// 異步保存異常信息 /// </summary> /// <param name="obj"></param> public void AddError(object obj) { var error = obj as ErrorEntity; if (error == null) return; var service = new ErrorService(); service.AddError(error); }
(3) 在Startup=》ConfigureServices方法中全局注冊異常過濾器ErrorFilterAttribute
services.AddMvc(opt => { opt.Filters.Add<ErrorFilterAttribute>(); });