HttpGlobalExceptionFilter.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using Microsoft.AspNetCore.Hosting;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.AspNetCore.Mvc.Filters;
  5. using Microsoft.Extensions.Logging;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Net;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using TEAMModelOS.SDK.Context.Exception;
  12. using TEAMModelOS.SDK.Extension;
  13. using TEAMModelOS.SDK.Helper.Common.JsonHelper;
  14. using static TEAMModelOS.SDK.Context.Filter.HttpGlobalExceptionInvoke;
  15. namespace TEAMModelOS.SDK.Context.Filters
  16. {
  17. /// <summary>
  18. /// 全局异常处理
  19. /// </summary>
  20. public class HttpGlobalExceptionFilter : IExceptionFilter
  21. {
  22. readonly ILoggerFactory _loggerFactory;
  23. readonly IWebHostEnvironment _env;
  24. public HttpGlobalExceptionFilter(ILoggerFactory loggerFactory, IWebHostEnvironment env)
  25. {
  26. _loggerFactory = loggerFactory;
  27. _env = env;
  28. }
  29. /// <summary>
  30. /// 异常拦截
  31. /// </summary>
  32. /// <param name="context"></param>
  33. public async void OnException(ExceptionContext context)
  34. {
  35. int code = context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
  36. if (context.Exception is BizException)
  37. {
  38. context.HttpContext.Response.StatusCode = 200;
  39. }
  40. var errorResponse = new ErrorResponse<string>(1, context.Exception.Message);
  41. // errorResponse.devMessage = context.Exception.StackTrace;
  42. context.Result = new ApplicationErrorResult(errorResponse, code);
  43. context.ExceptionHandled = true;
  44. if (context.HttpContext.Response.StatusCode != 200)//未捕捉过并且状态码不为200
  45. {
  46. string msg = "";
  47. switch (context.HttpContext.Response.StatusCode)
  48. {
  49. case 401:
  50. msg = "Unauthorized";
  51. break;
  52. case 404:
  53. msg = "Service Not Found";
  54. break;
  55. case 502:
  56. msg = "Request Erro";
  57. break;
  58. case 500:
  59. msg = context.Exception.Message;
  60. break;
  61. case 403:
  62. msg = context.Exception.Message;
  63. break;
  64. default:
  65. msg = "Unknown Error";
  66. break;
  67. }
  68. await HandleExceptionAsync(context.HttpContext, context.HttpContext.Response.StatusCode, msg, context.Exception == null ? "" : context.Exception.StackTrace);
  69. }
  70. }
  71. private static async Task HandleExceptionAsync(HttpContext context, int statusCode, string msg, string devmsg)
  72. {
  73. var data = new ErrorResponse<string>(statusCode, msg, devmsg);
  74. context.Response.ContentType = "application/json;charset=utf-8";
  75. await context.Response.WriteAsync(data.ToJsonString());
  76. }
  77. }
  78. public class ApplicationErrorResult : ObjectResult
  79. {
  80. public ApplicationErrorResult(object value, int code) : base(value)
  81. {
  82. StatusCode = code;
  83. }
  84. }
  85. }