using Estsh.Core.Model.Result;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Estsh.Core.Util
{
///
/// 全局异常处理中间件
///
public class GlobalExceptionHandler
{
#region 属性及其构造函数
private readonly RequestDelegate _next; //上下文请求
private readonly ILogger _logger;
///
/// 构造函数
///
/// 上下文请求
/// 日志对象
public GlobalExceptionHandler(RequestDelegate next, ILogger logger)
{
_next = next;
_logger = logger;
}
#endregion
#region 处理上下文请求
///
/// 处理上下文请求
///
/// http会话对象
///
public async Task InvokeAsync(HttpContext httpContext)
{
try
{
//_logger.LogInformation(httpContext.Request.Path);
await _next(httpContext); //处理上下文请求
}
catch (Exception ex)
{
await HandleExceptionAsync(httpContext, ex); //捕获异常,在HandleExceptionAsync中处理
}
}
#endregion
#region 全局统一异常处理
///
/// 全局统一异常处理
///
/// http会话对象
/// 全局异常处理
///
private async Task HandleExceptionAsync(HttpContext context, Exception exception)
{
context.Response.ContentType = "application/json"; //返回json 类型
var response = context.Response;
var errorResult = new ErrorResult { Success = false };
// 自定义的异常错误信息类型
switch (exception)
{
case ApplicationException ex:
response.StatusCode = (int)HttpStatusCode.BadRequest;
errorResult.Message = ex.Message;
break;
case Exception ex:
response.StatusCode = (int)HttpStatusCode.InternalServerError;
errorResult.Message = ex.Message;
break;
default:
response.StatusCode = (int)HttpStatusCode.InternalServerError;
errorResult.Message = "Internal Server Error";
break;
}
//错误日志控制台输出
_logger.LogError(exception.Message);
//错误日志文件输出
var errorInfo = new StringBuilder();
errorInfo.AppendLine("Time:" + DateTime.Now);
errorInfo.AppendLine("StackTrace:" + (exception.StackTrace == null ? "" : exception.StackTrace));
errorInfo.AppendLine("Source:" + (exception.Source == null ? "" : exception.Source));
errorInfo.AppendLine("Message:" + exception.Message);
errorInfo.AppendLine("InnerExceptionMessage:" + (exception.InnerException == null ? "" : exception.InnerException.Message));
LogHelper.Error(errorInfo.ToString());
//返回统一异常
await context.Response.WriteAsync(errorResult.ToJson());
}
#endregion
}
}