fix(sac): 修复预览页序列化 SacInfo 时 TypeId 触发 IsGenericParameter 异常
- SacDescriptionAttribute 增加 ShouldSerializeTypeId() 返回 false, 跳过 Attribute.TypeId(System.Type)的序列化,避免 Newtonsoft 抛 "Method may only be called on a Type for which Type.IsGenericParameter is true." (13.0.1 安全版对 Type 成员序列化行为变更后暴露) - ExceptionMiddleware 改用 exception.ToString() 记录完整异常(类型+ 内层 message+堆栈),替代仅取最内层 message,便于定位此类反射异常根因; 该信息仅写入日志,不返回前端
This commit is contained in:
@@ -117,6 +117,12 @@ 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<SacInfo> 时崩溃,故显式跳过该成员。
|
||||
// (13.0.1 安全版对 Type 成员序列化行为变更后暴露此问题)
|
||||
public bool ShouldSerializeTypeId() => false;
|
||||
|
||||
/// <summary>
|
||||
/// 字段名
|
||||
/// </summary>
|
||||
|
||||
@@ -37,13 +37,15 @@ namespace YLErp.Web.App
|
||||
|
||||
try
|
||||
{
|
||||
message = GetInnerExceptionMessage(exception);
|
||||
// 暴露完整异常(类型 + 所有内层 message + 堆栈),不再只取最内层 message,
|
||||
// 便于定位根因(如 SacInfo 序列化 TypeId 触发的 IsGenericParameter 反射异常)。
|
||||
message = exception.ToString();
|
||||
|
||||
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}");
|
||||
LogFactory.GetLogger(context.Request.Path.Value).Error(serviceExpcetion ?? exception, $"[query]:{request.QueryString.Value};[body]:{reqBody}\r\n{message}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -77,16 +79,5 @@ namespace YLErp.Web.App
|
||||
ReadOnlySpan<byte> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user