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
相关产品推荐
相关产品推荐

