update Yi.Abp.Net8/framework/Yi.Framework.AspNetCore/UnifyResult/Fiters/FriendlyExceptionFilter.cs.

判断是否为模型验证错误,如果是,将errors传回,并打印日志

Signed-off-by: Gary <1511313969@qq.com>
This commit is contained in:
Gary
2025-09-22 07:13:46 +00:00
committed by Gitee
parent e9e2228f6e
commit 06e77aa8fd

View File

@@ -1,4 +1,4 @@
// MIT 许可证 // MIT 许可证
// //
// 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者 // 版权 © 2020-present 百小僧, 百签科技(广东)有限公司 和所有贡献者
// //
@@ -17,25 +17,25 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.DependencyInjection; using Volo.Abp.Validation;
using Yi.Framework.Core.Extensions; using Yi.Framework.Core.Extensions;
namespace Yi.Framework.AspNetCore.UnifyResult.Fiters; namespace Yi.Framework.AspNetCore.UnifyResult.Fiters;
/// <summary> /// <summary>
/// 友好异常拦截器 /// 友好异常拦截器
/// </summary> /// </summary>
public sealed class FriendlyExceptionFilter : IAsyncExceptionFilter public sealed class FriendlyExceptionFilter : IAsyncExceptionFilter
{ {
/// <summary> /// <summary>
/// 异常拦截 /// 异常拦截
/// </summary> /// </summary>
/// <param name="context"></param> /// <param name="context"></param>
/// <returns></returns> /// <returns></returns>
public async Task OnExceptionAsync(ExceptionContext context) public async Task OnExceptionAsync(ExceptionContext context)
{ {
// 排除 WebSocket 请求处理 // 排除 WebSocket 请求处理
if (context.HttpContext.IsWebSocketRequest()) return; if (context.HttpContext.IsWebSocketRequest()) return;
@@ -44,20 +44,23 @@ public sealed class FriendlyExceptionFilter : IAsyncExceptionFilter
// 解析异常信息 // 解析异常信息
var exceptionMetadata = GetExceptionMetadata(context); var exceptionMetadata = GetExceptionMetadata(context);
var unifyResult = context.GetRequiredService<IUnifyResultProvider>();
IUnifyResultProvider unifyResult = context.GetRequiredService<IUnifyResultProvider>();
// 执行规范化异常处理 // 执行规范化异常处理
context.Result = unifyResult.OnException(context, exceptionMetadata); context.Result = unifyResult.OnException(context, exceptionMetadata);
// 创建日志记录器 // 创建日志记录器
var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<FriendlyExceptionFilter>>(); var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<FriendlyExceptionFilter>>();
var errorMsg = "";
if (exceptionMetadata.Errors != null) errorMsg = "\n" + JsonConvert.SerializeObject(exceptionMetadata.Errors);
// 记录拦截日常 // 记录拦截日常
logger.LogError(context.Exception, context.Exception.Message); logger.LogError(context.Exception, context.Exception.Message + errorMsg);
} }
/// <summary> /// <summary>
/// 获取异常元数据 /// 获取异常元数据
/// </summary> /// </summary>
/// <param name="context"></param> /// <param name="context"></param>
/// <returns></returns> /// <returns></returns>
@@ -74,22 +77,25 @@ public sealed class FriendlyExceptionFilter : IAsyncExceptionFilter
// 判断是否是 ExceptionContext 或者 ActionExecutedContext // 判断是否是 ExceptionContext 或者 ActionExecutedContext
var exception = context is ExceptionContext exContext var exception = context is ExceptionContext exContext
? exContext.Exception ? exContext.Exception
: ( : context is ActionExecutedContext edContext
context is ActionExecutedContext edContext ? edContext.Exception
? edContext.Exception : default;
: default
); if (exception is AbpValidationException validationException)
{
errors = validationException.ValidationErrors;
isValidationException = true;
}
// 判断是否是友好异常 // 判断是否是友好异常
if (exception is UserFriendlyException friendlyException) if (exception is UserFriendlyException friendlyException)
{ {
int statusCode2 = 500; var statusCode2 = 500;
int.TryParse(friendlyException.Code, out statusCode2); int.TryParse(friendlyException.Code, out statusCode2);
isFriendlyException = true; isFriendlyException = true;
errorCode = friendlyException.Code; errorCode = friendlyException.Code;
originErrorCode = friendlyException.Code; originErrorCode = friendlyException.Code;
statusCode = statusCode2==0?403:statusCode2; statusCode = statusCode2 == 0 ? 403 : statusCode2;
isValidationException = false;
errors = friendlyException.Message; errors = friendlyException.Message;
data = friendlyException.Data; data = friendlyException.Data;
} }