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
{
///
/// 自定义异常中间件
///
public class ExceptionMiddlewareDto
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
private readonly IHttpContextAccessor _contextAccessor;
//private readonly IUserService userService;
public ExceptionMiddlewareDto(RequestDelegate next, ILogger 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);
}
}
///
/// 处理业务异常
///
///
///
///
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
}));
}
///
/// 处理系统异常
///
///
///
///
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));
}
}
}