.NET Core通过异常过滤器(ExceptionFilterAttribute)实现全局异常捕获和日志记录

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>();
            });