ExceptionMiddleware.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Diagnostics;
  3. using System.Net;
  4. using System.Security.Claims;
  5. using System.Threading.Tasks;
  6. using GxPress.Common.Exceptions;
  7. using GxPress.Repository.Interface;
  8. using GxPress.Service.Interface;
  9. using Microsoft.AspNetCore.Http;
  10. using Microsoft.Extensions.Logging;
  11. using Newtonsoft.Json;
  12. namespace GxPress.Api
  13. {
  14. /// <summary>
  15. /// 自定义异常中间件
  16. /// </summary>
  17. public class ExceptionMiddleware
  18. {
  19. private readonly RequestDelegate _next;
  20. private readonly ILogger<ExceptionMiddleware> _logger;
  21. private readonly IHttpContextAccessor _contextAccessor;
  22. private readonly IApiLogService _apiLogService;
  23. public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> logger, IHttpContextAccessor contextAccessor, IApiLogService _apiLogService)
  24. {
  25. _next = next;
  26. this._apiLogService = _apiLogService;
  27. _logger = logger;
  28. _contextAccessor = contextAccessor;
  29. }
  30. public async Task Invoke(HttpContext context)
  31. {
  32. try
  33. {
  34. //
  35. var watch = new Stopwatch();
  36. watch.Start();
  37. await _next.Invoke(context);
  38. if (context.User != null)
  39. {
  40. var ty = _contextAccessor?.HttpContext?.User?.FindFirst(ClaimTypes.Role);
  41. if (!ty.Value.Equals("Admin"))
  42. {
  43. _apiLogService.DataSave(context, watch.ElapsedMilliseconds, 2);
  44. }
  45. }
  46. }
  47. catch (BusinessException be)
  48. {
  49. _logger.LogDebug(be.Message);
  50. await HandleBusinessException(context, be);
  51. }
  52. catch (System.Exception ex)
  53. {
  54. _logger.LogError(ex, ex.Message);
  55. await HandleSystemException(context, ex);
  56. }
  57. }
  58. /// <summary>
  59. /// 处理业务异常
  60. /// </summary>
  61. /// <param name="context"></param>
  62. /// <param name="be"></param>
  63. /// <returns></returns>
  64. private Task HandleBusinessException(HttpContext context, BusinessException be)
  65. {
  66. context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
  67. context.Response.ContentType = "application/json;charset=utf-8";
  68. return context.Response.WriteAsync(JsonConvert.SerializeObject(new
  69. {
  70. be.Message,
  71. be.StackTrace
  72. }));
  73. }
  74. /// <summary>
  75. /// 处理系统异常
  76. /// </summary>
  77. /// <param name="context"></param>
  78. /// <param name="ex"></param>
  79. /// <returns></returns>
  80. private Task HandleSystemException(HttpContext context, Exception ex)
  81. {
  82. context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
  83. context.Response.ContentType = "application/json;charset=utf-8";
  84. return context.Response.WriteAsync(JsonConvert.SerializeObject(ex));
  85. }
  86. }
  87. }