using System; using System.Net; using System.Security.Claims; using System.Threading.Tasks; using GxPress.Common.Exceptions; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace GxPress.Common.Middleware { /// <summary> /// 自定义异常中间件 /// </summary> public class ExceptionMiddlewareDto { private readonly RequestDelegate _next; private readonly ILogger<ExceptionMiddlewareDto> _logger; private readonly IHttpContextAccessor _contextAccessor; //private readonly IUserService userService; public ExceptionMiddlewareDto(RequestDelegate next, ILogger<ExceptionMiddlewareDto> logger, IHttpContextAccessor contextAccessor) { _next = next; _logger = logger; _contextAccessor = contextAccessor; } public async Task Invoke(HttpContext context) { try { // await _next.Invoke(context); if (context.User != null) { var ty = _contextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.Role); if (!ty.Value.Equals("Admin")) { } } } catch (BusinessException be) { _logger.LogDebug(be.Message); await HandleBusinessException(context, be); } catch (System.Exception ex) { _logger.LogError(ex, ex.Message); await HandleSystemException(context, ex); } } /// <summary> /// 处理业务异常 /// </summary> /// <param name="context"></param> /// <param name="be"></param> /// <returns></returns> private Task HandleBusinessException(HttpContext context, BusinessException be) { context.Response.StatusCode = (int)HttpStatusCode.BadRequest; context.Response.ContentType = "application/json;charset=utf-8"; return context.Response.WriteAsync(JsonConvert.SerializeObject(new { be.Message, be.StackTrace })); } /// <summary> /// 处理系统异常 /// </summary> /// <param name="context"></param> /// <param name="ex"></param> /// <returns></returns> private Task HandleSystemException(HttpContext context, Exception ex) { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.ContentType = "application/json;charset=utf-8"; return context.Response.WriteAsync(JsonConvert.SerializeObject(ex)); } } }