using EntrustSettle.Common; using EntrustSettle.Common.Helper; using EntrustSettle.Common.LogHelper; using EntrustSettle.Hubs; using EntrustSettle.Model; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.SignalR; using Newtonsoft.Json; namespace EntrustSettle.Filter { /// /// 全局异常错误日志 /// public class GlobalExceptionsFilter : IExceptionFilter { private readonly IWebHostEnvironment _env; private readonly IHubContext _hubContext; private readonly ILogger _loggerHelper; public GlobalExceptionsFilter(IWebHostEnvironment env, ILogger loggerHelper, IHubContext hubContext) { _env = env; _loggerHelper = loggerHelper; _hubContext = hubContext; } public void OnException(ExceptionContext context) { var json = new MessageModel(); json.msg = context.Exception.Message;//错误信息 json.code = 500; var errorAudit = "Unable to resolve service for"; if (!string.IsNullOrEmpty(json.msg) && json.msg.Contains(errorAudit)) { json.msg = json.msg.Replace(errorAudit, $"(若新添加服务,需要重新编译项目){errorAudit}"); } if (_env.EnvironmentName.ObjToString().Equals("Development")) { json.msgDev = context.Exception.StackTrace;//堆栈信息 } var res = new ContentResult { Content = JsonConvert.SerializeObject(json) }; //res.Content = JsonHelper.GetJSON>(json); if (context.Exception is FileNotFoundException) { res.StatusCode = StatusCodes.Status500InternalServerError; } context.Result = res; //进行错误日志记录 _loggerHelper.LogError(json.msg + WriteLog(json.msg, context.Exception)); if (AppSettings.app(new string[] { "Middleware", "SignalRSendLog", "Enabled" }).ObjToBool()) { _hubContext.Clients.All.SendAsync("ReceiveUpdate", "LogLock.GetLogData()").Wait(); } } /// /// 自定义返回格式 /// /// /// /// public string WriteLog(string throwMsg, Exception ex) { return string.Format("\r\n【自定义错误】:{0} \r\n【异常类型】:{1} \r\n【异常信息】:{2} \r\n【堆栈调用】:{3}", new object[] { throwMsg, ex.GetType().Name, ex.Message, ex.StackTrace }); } } public class InternalServerErrorObjectResult : ObjectResult { public InternalServerErrorObjectResult(object value) : base(value) { StatusCode = StatusCodes.Status500InternalServerError; } } //返回错误信息 public class JsonErrorResponse { /// /// 生产环境的消息 /// public string Message { get; set; } /// /// 开发环境的消息 /// public string DevelopmentMessage { get; set; } } }