HttpGlobalExceptionInvoke.cs 4.8 KB

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