HttpGlobalExceptionFilter.cs 3.2 KB

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