.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默认无单字符串长度上限):
- 安装NuGet包:
Microsoft.AspNetCore.Mvc.NewtonsoftJson - 在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
相关产品推荐
相关产品推荐

