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

ASP.NET Core 2.1 Web API Get请求仅返回前146字符JSON的问题

解决ASP.NET Core 2.1 Web API JSON返回仅前146字符的问题

嘿,我来帮你搞定这个JSON被截断的麻烦!这种情况在EF Core 2 + ASP.NET Core 2.1的组合里挺常见的,我整理了几个大概率能解决的方向,你挨个试试:


先排除调试工具的“视觉截断”

很多时候这只是个假象!浏览器调试工具(比如Chrome DevTools)的预览标签为了显示友好,会自动截断长JSON内容,但实际的响应是完整的。你赶紧切换到响应标签看看,是不是真的只有146字符——这是最容易踩的坑!

调整JSON序列化配置

ASP.NET Core 2.1默认用Newtonsoft.Json序列化,可能有默认的长度或深度限制,你可以在Startup.cs的ConfigureServices里放开限制:

services.AddMvc()
    .AddJsonOptions(options =>
    {
        // 取消循环引用导致的深度限制(导航属性嵌套容易触发)
        options.SerializerSettings.MaxDepth = null;
        // 取消字符串长度限制
        options.SerializerSettings.StringMaxLength = int.MaxValue;
        // 可选:如果有循环引用,也可以设置忽略而非报错
        options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    });

处理EF Core的导航属性问题

你的Organization类有Productions和OrganizationPeople两个导航属性,如果开启了延迟加载,序列化时很容易触发循环引用(比如Production关联Organization,Organization又关联Production),导致序列化器中途截断甚至报错。

解决方法推荐用DTO(数据传输对象),只返回你需要的字段,既避免循环引用,又更安全:

  1. 先创建对应的DTO类:
public class OrganizationDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<ProductionDto> Productions { get; set; }
}

public class ProductionDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}
  1. 在Controller里用EF急切加载数据,再映射到DTO返回:
var org = _context.Organizations
    .Include(o => o.Productions) // 急切加载关联的Productions
    .FirstOrDefault(o => o.Id == id); // 或者ToList()返回所有

var dto = new OrganizationDto
{
    Id = org.Id,
    Name = org.Name,
    Productions = org.Productions.Select(p => new ProductionDto
    {
        Id = p.Id,
        Name = p.Name,
        Description = p.Description
    }).ToList()
};

return Ok(dto);

如果不想用DTO,也可以直接关闭EF的延迟加载:在DbContext的OnConfiguring方法里添加options.UseLazyLoadingProxies(false);。

检查响应缓冲区设置

偶尔ASP.NET Core的响应缓冲区会限制输出长度,你可以临时加个中间件验证完整响应内容:

// 在Startup.cs的Configure方法里,放在UseMvc之前
app.Use(async (context, next) =>
{
    // 替换响应流为内存流,方便读取完整内容
    var originalBody = context.Response.Body;
    using var memoryStream = new MemoryStream();
    context.Response.Body = memoryStream;

    await next();

    // 读取完整响应内容,打印出来看看是不是完整的
    memoryStream.Position = 0;
    var responseContent = await new StreamReader(memoryStream).ReadToEndAsync();
    Console.WriteLine("完整响应内容:" + responseContent);

    // 把内容写回原始响应流
    memoryStream.Position = 0;
    await memoryStream.CopyToAsync(originalBody);
    context.Response.Body = originalBody;
});

排查数据本身的问题

如果上面的方法都没用,那可能是数据库里的某个字段有特殊字符(比如未转义的引号、控制字符),导致JSON序列化中途中断。你可以先返回单个实体(比如return Ok(_context.Organizations.First());),看看JSON是否完整,逐步定位是哪个实体或字段出了问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:40:17