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

AspNet Core MVC返回FileInfo报500错误的原因及解决咨询

错误原因与解决方法

错误含义解析

你遇到的System.Text.Json.JsonException本质是序列化FileInfo对象时触发了循环引用+嵌套层级超限问题:

  • FileInfo对象包含Directory属性,指向文件所在的目录对象;目录对象的Parent属性又指向上级目录,层层向上追溯到根目录(Root)后,根目录的Root属性会循环引用自身,形成闭环。
  • 同时,整个嵌套链的深度远超System.Text.Json默认允许的32层序列化深度,触发了序列化保护机制,直接抛出异常,导致控制器返回500状态码。

正确解决方式

不要直接返回FileInfo对象(它包含大量系统级属性和循环引用链),而是定义一个仅包含业务所需字段的DTO(数据传输对象),只序列化需要的信息:

1. 定义DTO类

public class FileInfoDto
{
    // 按需添加你需要的字段
    public string FileName { get; set; }
    public string FullPath { get; set; }
    public long FileSize { get; set; }
    public DateTime LastModifiedTime { get; set; }
}

2. 控制器中映射并返回DTO

[HttpGet("get-file-info/{fileName}")]
public IActionResult GetFileInfo(string fileName)
{
    var targetPath = Path.Combine("你的文件存储路径", fileName);
    var fileInfo = new FileInfo(targetPath);

    if (!fileInfo.Exists)
    {
        return NotFound("文件不存在");
    }

    var fileDto = new FileInfoDto
    {
        FileName = fileInfo.Name,
        FullPath = fileInfo.FullName,
        FileSize = fileInfo.Length,
        LastModifiedTime = fileInfo.LastWriteTime
    };

    return Ok(fileDto);
}

不推荐的方案(仅作了解)

如果一定要序列化FileInfo对象,可以修改Startup/Program.cs中的Json序列化配置,开启循环引用支持并调整深度限制,但这样会返回大量冗余数据,还可能暴露系统敏感信息:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
        options.JsonSerializerOptions.MaxDepth = 64; // 调整深度限制
    });

内容的提问来源于stack exchange,提问作者EM_Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:12:31