.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; });
}
}
浙公网安备 33010602011771号