using Microsoft.AspNetCore.Http; using System; using System.Threading.Tasks; using TEAMModelOS.SDK.Context.Constant.Common; using TEAMModelOS.SDK.Context.Exception; using TEAMModelOS.SDK.Helper.Common.JsonHelper; namespace TEAMModelOS.SDK.Context.Filter { public class HttpGlobalExceptionInvoke { private readonly RequestDelegate _next; /// /// /// /// public HttpGlobalExceptionInvoke(RequestDelegate next) { _next = next; } /// /// /// /// /// public async Task Invoke(HttpContext context) { int bizCode = 0; System.Exception exs = null; bool isCatched = false; try { await _next(context); } catch (System.Exception ex) //发生异常 { exs = ex; //自定义业务异常 if (ex is BizException) { bizCode = ((BizException)ex).code; if (bizCode == 401 || bizCode == 404 || bizCode == 502 || bizCode == 403) { context.Response.StatusCode = bizCode; } else { context.Response.StatusCode = 200; } // context.Response.StatusCode = ((BizException)ex).code; } //未知异常 else { context.Response.StatusCode = 500; //LogHelper.SetLog(LogLevel.Error, ex); } await HandleExceptionAsync(context, bizCode, ex.Message, ex.StackTrace); isCatched = true; } finally { if (!isCatched && context.Response.StatusCode != 200)//未捕捉过并且状态码不为200 { string msg = ""; switch (context.Response.StatusCode) { case 401: msg = "Unauthorized"; break; case 404: msg = "Service Not Found"; break; case 502: msg = "Request Erro"; break; case 500: msg = exs.Message; break; case 403: msg = exs.Message; break; default: msg = "Unknown Error"; break; } await HandleExceptionAsync(context, bizCode, msg, exs == null ? "" : exs.StackTrace); } } } /// /// /// /// /// /// /// /// /// private static async Task HandleExceptionAsync(HttpContext context, int bizCode, string msg, string devmsg) { var data = new ErrorResponse(bizCode, msg, devmsg); context.Response.ContentType = Constants.CONTENT_TYPE_JSON; await context.Response.WriteAsync(JsonNetHelper.ToJson(data)); } /// /// 异常信息封装 /// /// public class ErrorResponse { public ErrorResponse() { error = new ErrorModel(); } public ErrorResponse(string message) { error = new ErrorModel { message = message, devmsg = message }; } public ErrorResponse(int code, string message) { error = new ErrorModel { message = message, devmsg = message, code = code }; } public ErrorResponse(int code, string message, string devMessage) { error = new ErrorModel { message = message, devmsg = message, code = code }; error.devmsg = devMessage; } public string jsonrpc { get; set; } = "2.0"; public double id { get; set; } = 1; private object result { get; set; } = null; public ErrorModel error { get; set; } = null; } } public class ErrorModel { public long responseTime = DateTime.Now.Ticks; public float code { get; set; } = 1; public string message { get; set; } public string devmsg { get; set; } public E data { get; set; } } }