System.Reflection.MethodBase序列化不支持异常:ResponseBody赋值Error报错
异常原因解析:Serialization and deserialization of 'System.Reflection.MethodBase' instances is not supported
核心原因
你遇到的NotSupportedException,本质是JSON序列化器无法处理System.Reflection.MethodBase类型的实例,这个类型藏在你赋值的Exception对象里:
- 你创建
ErrorResponseBody时,直接把异常对象e赋值给了InnerError属性:InnerError = e - .NET的
Exception类自带TargetSite属性,该属性的类型正是System.Reflection.MethodBase,用于记录异常发生的方法信息 - 当ASP.NET Core返回
OkObjectResult时,会自动序列化整个响应对象到JSON。此时序列化器会遍历ErrorResponseBody的所有属性,包括InnerError对应的Exception实例,进而尝试序列化TargetSite属性,触发不支持序列化的异常。
为什么赋值errorResponse才报错?
- 当你把
errorResponse赋值给ResponseBody.Error后,响应对象包含了完整的ErrorResponseBody实例,其中的InnerError是Exception对象,序列化时会触发上述问题 - 如果
Error属性设为null,序列化器会跳过该属性,自然不会触发异常。
解决建议
不要直接将Exception实例赋值给InnerError,而是创建一个仅包含需要暴露字段的DTO类,手动映射Exception的关键信息:
// 自定义内部错误DTO,只包含需要序列化的字段 public class InnerErrorDto { public string Message { get; set; } public string StackTrace { get; set; } // 按需添加其他字段,比如InnerException的Message等 } // 创建errorResponse时替换为映射后的DTO ErrorResponseBody errorResponse = new ErrorResponseBody { Timestamp = DateUtils.CreateTimeStamp(), Status = 422, Code = "Can't process entity", Message = e.Message, LogId = logId, InnerError = new InnerErrorDto { Message = e.InnerException?.Message ?? e.Message, StackTrace = e.StackTrace } };
内容的提问来源于stack exchange,提问作者zhrgci
相关产品推荐
相关产品推荐

