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

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();

问题排查参考截图

Postman测试截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:24:04