using System; using System.IO; using System.Linq; using System.Threading.Tasks; using Hncore.Infrastructure.Common; using Hncore.Infrastructure.Data; using Hncore.Infrastructure.Extension; using Hncore.Infrastructure.OpenApi; using Hncore.Infrastructure.Serializer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Hncore.Infrastructure.Core.Web; namespace Hncore.Infrastructure.WebApi { /// /// 统一错误异常处理中间件类 /// /// public class ErrorHandlingMiddleware { private readonly RequestDelegate next; public ErrorHandlingMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { try { await next(context); } catch (Exception ex) { string requestMsg = "请求URL:" + context.Request.GetAbsoluteUri() + ""; requestMsg += "\nMethod:" + context.Request.Method + "\n"; if (context.Request.Method.ToLower() != "get") { var requestBody = await context.Request.ReadBodyAsStringAsync(); requestMsg += "Body:\n" + requestBody + "\n------------------------\n"; } else { requestMsg += "\n------------------------\n"; } await HandleExceptionAsync(context, ex, requestMsg); } } private static Task HandleExceptionAsync(HttpContext context, Exception ex, string requestMsg) { ResultCode code = ResultCode.C_UNKNOWN_ERROR; string msg = ""; if (ex is BusinessException bex) { code = bex.Code; msg = bex.Message; LogHelper.Error($"业务异常,{msg}", requestMsg + ex); } else { if (EnvironmentVariableHelper.IsAspNetCoreProduction) { msg = "系统繁忙,请稍后再试"; } else { msg = ex.Message; } LogHelper.Error($"未知异常,{ex.Message}", requestMsg + ex); } var data = new ApiResult(code, msg); var result = data.ToJson(); context.Response.ContentType = "application/json;charset=utf-8"; return context.Response.WriteAsync(result); } } public static class ErrorHandlingExtensions { public static IApplicationBuilder UseErrorHandling(this IApplicationBuilder builder) { return builder.UseMiddleware(); } } }