HttpGlobalExceptionInvoke.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using Microsoft.AspNetCore.Http;
  2. using System;
  3. using System.Threading.Tasks;
  4. using TEAMModelOS.SDK.Context.Constant.Common;
  5. using TEAMModelOS.SDK.Context.Exception;
  6. using TEAMModelOS.SDK.Helper.Common.JsonHelper;
  7. namespace TEAMModelOS.SDK.Context.Filter
  8. {
  9. public class HttpGlobalExceptionInvoke
  10. {
  11. private readonly RequestDelegate _next;
  12. /// <summary>
  13. ///
  14. /// </summary>
  15. /// <param name="next"></param>
  16. public HttpGlobalExceptionInvoke(RequestDelegate next)
  17. {
  18. _next = next;
  19. }
  20. /// <summary>
  21. ///
  22. /// </summary>
  23. /// <param name="context"></param>
  24. /// <returns></returns>
  25. public async Task Invoke(HttpContext context)
  26. {
  27. System.Exception exs = null;
  28. bool isCatched = false;
  29. try
  30. {
  31. await _next(context);
  32. }
  33. catch (System.Exception ex) //发生异常
  34. {
  35. exs = ex;
  36. //自定义业务异常
  37. if (ex is BizException)
  38. {
  39. context.Response.StatusCode = ((BizException)ex).code;
  40. }
  41. //未知异常
  42. else
  43. {
  44. context.Response.StatusCode = 500;
  45. //LogHelper.SetLog(LogLevel.Error, ex);
  46. }
  47. await HandleExceptionAsync(context, context.Response.StatusCode, ex.Message, ex.StackTrace);
  48. isCatched = true;
  49. }
  50. finally
  51. {
  52. if (!isCatched && context.Response.StatusCode != 200)//未捕捉过并且状态码不为200
  53. {
  54. string msg;
  55. msg = context.Response.StatusCode switch
  56. {
  57. 401 => "Unauthorized",
  58. 404 => "Service Not Found",
  59. 502 => "Request Erro",
  60. 500 => exs.Message,
  61. 403 => exs.Message,
  62. _ => "Unknown Error",
  63. };
  64. await HandleExceptionAsync(context, context.Response.StatusCode, msg, exs == null ? "" : exs.StackTrace);
  65. }
  66. }
  67. }
  68. /// <summary>
  69. ///
  70. /// </summary>
  71. /// <param name="context"></param>
  72. ///
  73. ///
  74. /// <param name="statusCode"></param>
  75. /// <param name="msg"></param>
  76. /// <returns></returns>
  77. private static async Task HandleExceptionAsync(HttpContext context, int statusCode, string msg, string devmsg)
  78. {
  79. var data = new ErrorResponse<string>(statusCode, msg, devmsg);
  80. context.Response.ContentType = Constants.CONTENT_TYPE_JSON;
  81. await context.Response.WriteAsync(data.ToJson());
  82. }
  83. /// <summary>
  84. /// 异常信息封装
  85. /// </summary>
  86. ///
  87. public class ErrorResponse<T>
  88. {
  89. public ErrorResponse()
  90. {
  91. error = new ErrorModel<T>();
  92. }
  93. public ErrorResponse(string message)
  94. {
  95. error = new ErrorModel<T>
  96. {
  97. message = message,
  98. devmsg = message
  99. };
  100. }
  101. public ErrorResponse(int code, string message)
  102. {
  103. error = new ErrorModel<T>
  104. {
  105. message = message,
  106. devmsg = message,
  107. code = code
  108. };
  109. }
  110. public ErrorResponse(int code, string message, string devMessage)
  111. {
  112. error = new ErrorModel<T>
  113. {
  114. message = message,
  115. devmsg = message,
  116. code = code
  117. };
  118. error.devmsg = devMessage;
  119. }
  120. public string jsonrpc { get; set; } = "2.0";
  121. public double id { get; set; } = 1;
  122. private object result { get; set; } = null;
  123. public ErrorModel<T> error { get; set; } = null;
  124. }
  125. }
  126. public class ErrorModel<E>
  127. {
  128. public long responseTime = DateTime.Now.Ticks;
  129. public float code { get; set; } = 1;
  130. public string message { get; set; }
  131. public string devmsg { get; set; }
  132. public E data { get; set; }
  133. }
  134. }