ASP.NET Core接口响应体积达95MB加载过慢问题排查
API响应体积过大问题解决方案
核心原因
- 你直接将EF Core查询到的数据库实体返回给前端,实体间存在循环导航属性,序列化JSON时会出现递归嵌套,导致体积指数级膨胀。比如
SensorRecognitionSpecEoi关联了SensorRecognitionSpec,而后者大概率也有反向关联SensorRecognitionSpecEoi的集合属性,序列化时会无限套娃生成冗余内容。 - 未做字段裁剪,所有数据库实体的字段、你通过
Include/ThenInclude加载的全部关联数据都被序列化返回,包含大量前端不需要的冗余信息。
修复方案
1. 使用DTO裁剪返回字段(最优先)
不要直接返回数据库实体,创建专用的传输对象,仅保留前端需要的字段,示例如下:
// 定义专用DTO public class SensorSpecDto { // 只加你需要返回的字段,比如图片URL、规格名称、ID等 public int Id { get; set; } public string ImageUrl { get; set; } public string SpecName { get; set; } // 其他需要的字段... } public class MonTypeDto { public int Id { get; set; } public string TypeName { get; set; } // 其他需要的字段... } public class SensorSpecResultDto { public List<SensorSpecDto> SensorSpecificationsDetails { get; set; } public List<MonTypeDto> MonitoringTypes { get; set; } }
查询完成后手动映射或者用AutoMapper映射到DTO再返回,不要直接返回原始实体。
2. 移除不必要的关联加载
如果DTO不需要Device、EoiTypeCategory这类关联数据,直接删除对应的Include/ThenInclude语句,减少数据库查询的数据量,也避免序列化冗余关联内容:
// 调整后的查询,不需要的关联直接去掉 var getSensorsSpecifications = await _context.SensorRecognitionSpecEoi .Where(x => x.IsDeleted == 0 && x.SensorRecognitionSpec.DeviceId == deviceId && x.SensorRecognitionSpec.IsDeleted == 0 && x.SensorRecognitionSpec.Device.IsDeleted == 0) .ToListAsync();
3. 配置序列化优化(临时兼容方案)
如果暂时无法修改DTO,可以先配置序列化忽略循环引用和空值,减少冗余体积,Program.cs中添加如下配置:
// 针对System.Text.Json builder.Services.AddControllers() .AddJsonOptions(options => { // 忽略循环引用,避免递归序列化 options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles; // 忽略null值字段不序列化 options.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull; });
4. 开启响应压缩
开启gzip/Brotli响应压缩可以进一步降低传输体积,配置如下:
// Program.cs 服务注册 builder.Services.AddResponseCompression(options => { options.EnableForHttps = true; options.Providers.Add<GzipCompressionProvider>(); options.Providers.Add<BrotliCompressionProvider>(); }); // 中间件配置,放在UseRouting之后,UseAuthorization之前 app.UseResponseCompression();
问题排查参考截图

内容的提问来源于stack exchange,提问作者Kamran Khan
相关产品推荐
相关产品推荐

