using System;
using System.Diagnostics;
using System.Net;
using System.Security.Claims;
using System.Threading.Tasks;
using GxPress.Common.Exceptions;
using GxPress.Repository.Interface;
using GxPress.Service.Interface;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace GxPress.Api
{
///
/// 自定义异常中间件
///
public class ExceptionMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
private readonly IHttpContextAccessor _contextAccessor;
private readonly IApiLogService _apiLogService;
public ExceptionMiddleware(RequestDelegate next, ILogger logger, IHttpContextAccessor contextAccessor, IApiLogService _apiLogService)
{
_next = next;
this._apiLogService = _apiLogService;
_logger = logger;
_contextAccessor = contextAccessor;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
// var watch = new Stopwatch();
// watch.Start();
if (context.User != null)
{
var ty = _contextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.Role);
if (ty != null && !ty.Value.Equals("Admin"))
{
var userId = _contextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.NameIdentifier);
if (int.TryParse(userId?.Value, out var accountId))
{
await _apiLogService.DataSave(context, 1, accountId);
}
}
// watch.Stop();
}
}
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));
}
}
}