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

.NET Core 3.1返回大字节数组时JSON过大异常求助

.NET Core 3.1 大JSON响应超出限制问题解决方案及排查思路

一、服务端(第二个Web API应用)配置调整

如果异常是服务端序列化大对象返回时抛出,调整以下配置:

  1. 全局配置System.Text.Json序列化参数
    在Startup.cs的ConfigureServices方法中,修改AddControllers的Json选项,提升序列化限制:
services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 提升JSON序列化的最大深度(默认64,按需调大)
        options.JsonSerializerOptions.MaxDepth = 256;
        // 允许跳过JSON注释(避免额外解析报错)
        options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip;
    });
  1. 调整Kestrel服务器的响应缓冲限制
    Kestrel默认限制响应缓冲区大小,在Program.cs中配置:
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            webBuilder.ConfigureKestrel(options =>
            {
                // 设置最大响应/请求缓冲为1GB(1073741824字节)
                options.Limits.MaxResponseBufferSize = 1073741824;
                options.Limits.MaxRequestBufferSize = 1073741824;
            });
        });
  1. 针对单个Action设置限制
    如果仅特定接口返回大数据,在Action上添加特性:
[HttpPost]
[RequestSizeLimit(1073741824)] // 设置1GB限制
public IActionResult GetLargeData()
{
    var largeByteArray = GetYourLargeByteArray();
    return Ok(largeByteArray);
}

二、客户端(第一个发送请求的应用)配置调整

如果异常是客户端解析响应JSON时抛出,调整以下配置:

  1. 自定义JSON解析选项
    避免使用默认的ReadFromJsonAsync,手动指定解析参数:
var httpClient = new HttpClient();
var response = await httpClient.PostAsync("https://your-second-app/api/endpoint", content);
response.EnsureSuccessStatusCode();

var jsonString = await response.Content.ReadAsStringAsync();
var options = new JsonSerializerOptions
{
    MaxDepth = 256,
    // 按需添加其他配置
};
var result = JsonSerializer.Deserialize<YourModel>(jsonString, options);
  1. 调整HttpClient的响应缓冲大小
    确认客户端的响应缓冲限制足够:
var httpClient = new HttpClient
{
    MaxResponseContentBufferSize = 1073741824 // 设置1GB缓冲
};

三、排查思路

  • 定位异常抛出位置:查看服务端/客户端日志,确认是序列化还是解析环节出错。
  • 避免字节数组转JSON:字节数组序列化为Base64会导致体积翻倍,服务端可直接返回文件流替代JSON序列化:
    [HttpPost]
    public IActionResult GetLargeData()
    {
        var largeByteArray = GetYourLargeByteArray();
        return File(largeByteArray, "application/octet-stream");
    }
    
  • 检查配置文件有效性:.NET Core 3.1优先读取appsettings.json而非App.config,确认Kestrel配置是否正确写入:
    {
      "Kestrel": {
        "Limits": {
          "MaxResponseBufferSize": 1073741824,
          "MaxRequestBufferSize": 1073741824
        }
      }
    }
    
  • 小体积测试验证:先返回小数据确认流程正常,再逐步增大体积,确认是否为大小限制导致问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:54:25