HttpGlobalExceptionInvoke.cs 6.1 KB

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