JSON反序列化报错:找不到FileContentResult的合适构造函数
问题原因与解决方案
错误核心原因
报错的问题不在CreatePreviousInvoiceResponse类,而是**Microsoft.AspNetCore.Mvc.FileContentResult作为ASP.NET内置类,不适合直接用于JSON序列化/反序列化**:
FileContentResult没有无参构造函数,也未标记JsonConstructor特性,Json.NET无法自动实例化该类- 从返回的JSON可见,原本应为字节数组的
fileContents被序列化成了空字符串,这是框架类序列化时的异常表现
解决方案
放弃直接使用框架内置的FileContentResult,自定义专门用于传输文件信息的DTO(数据传输对象),替代原有类型。
1. 自定义文件传输DTO
public class FileDto { public byte[]? FileContents { get; set; } public string? ContentType { get; set; } public string? FileDownloadName { get; set; } }
2. 更新响应类定义
将CreatePreviousInvoiceResponse中的FileContentResult替换为自定义的FileDto:
public class CreatePreviousInvoiceResponse { public FileDto? File { get; set; } public string? Error { get; set; } public CreatePreviousInvoiceResponse() { } }
3. 调整API控制器返回逻辑
在API端,把文件数据封装到FileDto中返回,不再直接返回FileContentResult:
var fileName = string.Format("invoice_{0}.pdf", body.InvoiceNumber); var content = result.InvoiceStream.ToArray(); return new CreatePreviousInvoiceResponse { File = new FileDto { FileContents = content, ContentType = "application/pdf", FileDownloadName = fileName } };
4. 客户端代码无需修改
客户端的反序列化逻辑保持原样即可,现在JsonConvert.DeserializeObject<CreatePreviousInvoiceResponse>(content)可以正常解析返回的JSON数据。
内容的提问来源于stack exchange,提问作者nerdalert
相关产品推荐
相关产品推荐

