You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:27:05