using Microsoft.AspNetCore.Http; using System; using System.Threading.Tasks; using TEAMModelOS.SDK.Context.Constant.Common; using TEAMModelOS.SDK.Context.Exception; using TEAMModelOS.SDK.Extension; 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 InvokeAsync(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; } 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 400: msg = "Bad Request"; break; 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 = "金钥验证错误"; 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) { if (context.Response.StatusCode == 500) { // context.Response.StatusCode = 200; } var data = new ErrorResponse(bizCode, msg, devmsg); context.Response.ContentType = Constants.CONTENT_TYPE_JSON; //if (context.Response.HasStarted) { await context.Response.WriteAsync(data.ToJsonString()); //} } /// /// 异常信息封装 /// /// 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 int code { get; set; } = 1; public string message { get; set; } public string devmsg { get; set; } public E data { get; set; } } }