diff --git a/YLErpDAL/Modules/SuperviseReportModule/SAC/Common/Sac_TranslateHelper.cs b/YLErpDAL/Modules/SuperviseReportModule/SAC/Common/Sac_TranslateHelper.cs index 4a2bc9a5..822f4c2e 100644 --- a/YLErpDAL/Modules/SuperviseReportModule/SAC/Common/Sac_TranslateHelper.cs +++ b/YLErpDAL/Modules/SuperviseReportModule/SAC/Common/Sac_TranslateHelper.cs @@ -117,12 +117,6 @@ namespace YLErp.Modules.SuperviseReportModule.SAC.Common [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)] public class SacDescriptionAttribute : Attribute { - // Attribute.TypeId 本质是 System.Type,Newtonsoft 序列化会触发 - // "Method may only be called on a Type for which Type.IsGenericParameter is true." - // 预览页用 ToJson() 序列化 SacInfo/List 时崩溃,故显式跳过该成员。 - // (13.0.1 安全版对 Type 成员序列化行为变更后暴露此问题) - public bool ShouldSerializeTypeId() => false; - /// /// 字段名 /// diff --git a/YLErpWeb/App/ExceptionMiddleware.cs b/YLErpWeb/App/ExceptionMiddleware.cs index 5163baaa..a0c469d2 100644 --- a/YLErpWeb/App/ExceptionMiddleware.cs +++ b/YLErpWeb/App/ExceptionMiddleware.cs @@ -37,15 +37,13 @@ namespace YLErp.Web.App try { - // 暴露完整异常(类型 + 所有内层 message + 堆栈),不再只取最内层 message, - // 便于定位根因(如 SacInfo 序列化 TypeId 触发的 IsGenericParameter 反射异常)。 - message = exception.ToString(); + message = GetInnerExceptionMessage(exception); if (serviceExpcetion == null || serviceExpcetion.IsFaultError) { var result = await request.BodyReader.ReadAsync(); var reqBody = ConvertBufferToString(result.Buffer); - LogFactory.GetLogger(context.Request.Path.Value).Error(serviceExpcetion ?? exception, $"[query]:{request.QueryString.Value};[body]:{reqBody}\r\n{message}"); + LogFactory.GetLogger(context.Request.Path.Value).Error(serviceExpcetion ?? exception, $"[query]:{request.QueryString.Value};[body]:{reqBody}"); } } catch (Exception ex) @@ -79,5 +77,16 @@ namespace YLErp.Web.App ReadOnlySpan span = readOnlySequence.IsSingleSegment ? readOnlySequence.First.Span : readOnlySequence.ToArray().AsSpan(); return System.Text.Encoding.UTF8.GetString(span); } + + private static string GetInnerExceptionMessage(Exception ex) + { + var exceptionStr = ex.Message; + while (ex.InnerException != null) + { + exceptionStr = ex.InnerException.Message; + ex = ex.InnerException; + } + return exceptionStr; + } } } \ No newline at end of file