HttpGlobalExceptionInvoke.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. int bizCode = 0;
  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. bizCode = ((BizException)ex).code;
  41. if (bizCode == 401 || bizCode == 404 || bizCode == 502 || bizCode == 403)
  42. {
  43. //context.Response.StatusCode = bizCode;
  44. }
  45. else
  46. {
  47. // context.Response.StatusCode = 200;
  48. }
  49. // context.Response.StatusCode = ((BizException)ex).code;
  50. }
  51. //未知异常
  52. else
  53. {
  54. //context.Response.StatusCode = 500;
  55. //LogHelper.SetLog(LogLevel.Error, ex);
  56. }
  57. await HandleExceptionAsync(context, bizCode, ex.Message, ex.StackTrace);
  58. isCatched = true;
  59. }
  60. finally
  61. {
  62. if (!isCatched && context.Response.StatusCode != 200)//未捕捉过并且状态码不为200
  63. {
  64. string msg;
  65. switch (context.Response.StatusCode)
  66. {
  67. case 400:
  68. msg = "Bad Request";
  69. break;
  70. case 401:
  71. msg = "Unauthorized";
  72. break;
  73. case 404:
  74. msg = "Service Not Found";
  75. break;
  76. case 502:
  77. msg = "Request Erro";
  78. break;
  79. case 500:
  80. msg = exs.Message;
  81. break;
  82. case 403:
  83. msg = "金钥验证错误";
  84. break;
  85. default:
  86. msg = "Unknown Error";
  87. break;
  88. }
  89. await HandleExceptionAsync(context, bizCode, msg, exs == null ? "" : exs.StackTrace);
  90. }
  91. }
  92. }
  93. /// <summary>
  94. ///
  95. /// </summary>
  96. /// <param name="context"></param>
  97. ///
  98. ///
  99. /// <param name="statusCode"></param>
  100. /// <param name="msg"></param>
  101. /// <returns></returns>
  102. private static async Task HandleExceptionAsync(HttpContext context, int bizCode, string msg, string devmsg)
  103. {
  104. if (context.Response.StatusCode == 500)
  105. {
  106. // context.Response.StatusCode = 200;
  107. }
  108. var data = new ErrorResponse<string>(bizCode, msg, devmsg);
  109. context.Response.ContentType = Constants.CONTENT_TYPE_JSON;
  110. //if (context.Response.HasStarted) {
  111. await context.Response.WriteAsync(JsonNetHelper.ToJson(data));
  112. //}
  113. }
  114. /// <summary>
  115. /// 异常信息封装
  116. /// </summary>
  117. ///
  118. public class ErrorResponse<T>
  119. {
  120. public ErrorResponse()
  121. {
  122. error = new ErrorModel<T>();
  123. }
  124. public ErrorResponse(string message)
  125. {
  126. error = new ErrorModel<T>
  127. {
  128. message = message,
  129. devmsg = message
  130. };
  131. }
  132. public ErrorResponse(int code, string message)
  133. {
  134. error = new ErrorModel<T>
  135. {
  136. message = message,
  137. devmsg = message,
  138. code = code
  139. };
  140. }
  141. public ErrorResponse(int code, string message, string devMessage)
  142. {
  143. error = new ErrorModel<T>
  144. {
  145. message = message,
  146. devmsg = message,
  147. code = code
  148. };
  149. error.devmsg = devMessage;
  150. }
  151. // public string jsonrpc { get; set; } = "2.0";
  152. // public double id { get; set; } = 1;
  153. private object result { get; set; } = null;
  154. public ErrorModel<T> error { get; set; } = null;
  155. }
  156. }
  157. public class ErrorModel<E>
  158. {
  159. // public long responseTime = DateTime.Now.Ticks;
  160. public int code { get; set; } = 1;
  161. public string message { get; set; }
  162. public string devmsg { get; set; }
  163. public E data { get; set; }
  164. }
  165. }