.net core api 全局异常过滤器

1.使用方式

// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            //注册MemoryCache缓存中间件
            services.AddMemoryCache();

            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            //注册Mvc
            services.AddControllers(options =>
            {
                //注册全局过滤器服务
                options.Filters.Add(typeof(AppExceptionFilter));
                //options.Filters.Add(typeof(AuthorizeFilter));
                options.Filters.Add(typeof(AppResultFilter));
                options.RespectBrowserAcceptHeader = true;
            }).AddControllersAsServices()
            //使用NewtonsoftJson序列化数据
            .AddNewtonsoftJson(options =>
            {
                //取消骆驼命名法
                //options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                //设置返回datetime时间格式
                options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";
            }
            );
}

2.具体实现

/// <summary>
/// 全局异常过滤器
/// </summary>
public class AppExceptionFilter : Attribute, IAsyncExceptionFilter
{
    private readonly ILogger logger = null;
    private readonly IHostingEnvironment environment = null;
    public AppExceptionFilter(ILogger<AppExceptionFilter> logger, IHostingEnvironment environment)
    {
        this.logger = logger;
        this.environment = environment;
    }

    /// <summary>
    /// 处理异常,写入日志
    /// </summary>
    /// <param name="context"></param>
    public async Task OnExceptionAsync(ExceptionContext context)
    {
        await Task.Run(() =>
        {
            var exception = context.Exception;
            var error = string.Empty;

            void ReadException(Exception ex)
            {
                //error = string.Format("{0} | {1} | {2}", ex.Message, ex.StackTrace, ex.InnerException);
                error = ex.Message;
                if (ex.InnerException != null)
                {
                    ReadException(ex.InnerException);
                }
            }
            ReadException(context.Exception);
            logger.LogError(error);
            context.Result = new ObjectResult(new ApiResult{ HttpStatus = HttpStatusCode.InternalServerError, TimeOut = 0, Message = error }); 
       context.ExceptionHandled
= true; });
   }
}

 

posted @ 2021-12-24 10:59  棙九九  阅读(301)  评论(0)    收藏  举报