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

.Net 5返回大对象报错:JSON值长度过大不支持如何解决

问题原因

你遇到的报错是.NET 5+ 默认JSON序列化器的限制导致,和你之前尝试的配置不兼容:

  • .NET 4.6使用的是Newtonsoft.Json或System.Web.Extensions下的序列化组件,maxJsonLength配置仅对该版本生效,.NET 5+ 默认使用System.Text.Json作为序列化器,旧配置完全不生效
  • [DisableRequestSizeLimit]是限制请求入站大小的特性,你遇到的是响应出站序列化的限制,因此不生效
  • 默认System.Text.Json对单字符串的最大长度限制为128,000,000字符,你返回的Base64格式报告已经超过该阈值,因此抛出报错
解决方案

方案1:调整System.Text.Json序列化限制(推荐适配原生组件)

在Program.cs启动文件中修改控制器的JSON配置,调整字符串最大长度限制:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 核心配置:放宽单字符串最大长度,此处设置为int最大值(约2GB),可按需调整
        options.JsonSerializerOptions.MaxStringLength = int.MaxValue;
        // 可选:同步调整序列化深度、缓冲区大小适配大对象
        options.JsonSerializerOptions.MaxDepth = 128;
        options.JsonSerializerOptions.DefaultBufferSize = 1024 * 1024; // 1MB缓冲区
    });

如果你是IIS部署,还需要在web.config中添加IIS的响应大小限制配置:

<system.web>
    <httpRuntime maxRequestLength="2097151" executionTimeout="3600" />
</system.web>
<system.webServer>
    <security>
        <requestFiltering>
            <requestLimits maxAllowedContentLength="2147483647" />
        </requestFiltering>
    </security>
</system.web>

方案2:切换回Newtonsoft.Json(兼容旧版本逻辑)

如果项目是从.NET Framework升级而来,更推荐直接切回Newtonsoft.Json序列化器,无需调整字符串长度限制(Newtonsoft默认无单字符串长度上限):

  1. 安装NuGet包:Microsoft.AspNetCore.Mvc.NewtonsoftJson
  2. 在Program.cs中修改配置:
builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // 按需配置序列化规则,无需额外设置长度限制
        options.SerializerSettings.MaxDepth = 128;
    });

方案3:优化返回逻辑(彻底规避序列化问题,长期推荐)

将byte数组转Base64塞入JSON会导致体积额外膨胀33%,大文件场景下性能极差,建议直接返回文件流,将业务字段(ID、消息等)放入响应头传递:

[Route("api/Report/PrintBatch")]
[HttpPost]
[DisableRequestSizeLimit]
public async Task<IActionResult> PrintBatch(string url)
{
    try
    {
        Byte[] report = await GetByCorrIDorBatchID(url);
        // 业务字段放入响应头
        Response.Headers.Add("X-Report-ID", "你的业务ID");
        Response.Headers.Add("X-Success-Message", "生成成功");
        // 直接返回文件流,不走JSON序列化
        return File(report, "application/pdf", "batch-report.pdf");
    }
    catch (Exception ex)
    {
        Logger.LogException("Error printing batch for batchid: " + batchID + " dbname: " + dbname, ex);
        return StatusCode(500, ex.Message);
    }
}

内容的提问来源于stack exchange,提问作者J.Cart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:57:01