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

.NET 5中使用jQuery Ajax Post传输大型JSON数据的问题求解

根因说明

该问题由ASP.NET Core默认的请求限制触发:

  • 表单单个字段默认最大长度为4MB,表单整体提交大小默认限制为30MB
  • 你将序列化后的JSON字符串作为单个表单字段传输,数据量超过阈值后会被ASP.NET Core截断,导致参数绑定失败为null
  • 额外注意你原有后端代码存在类型不匹配问题:前端提交的是模型数组,但反序列化目标是单个MyModel对象,会引发反序列化报错。

解决方案

方案1:调整默认限制配置(适配现有提交逻辑,无需修改前端代码)

方式A:仅针对目标Action配置(推荐,不影响全局安全规则)

在PostData方法上添加请求限制特性:

[HttpPost]
[RequestFormLimits(ValueLengthLimit = int.MaxValue, MultipartBodyLengthLimit = int.MaxValue)]
[RequestSizeLimit(100_000_000)] // 示例为最大100MB请求,可按需调整数值
public JsonResult PostData(string LogDto)
{
    // 修正反序列化类型为模型集合
    var _list = JsonConvert.DeserializeObject<List<MyModel>>(LogDto);
    var _res = restHelper.Post($"data-entry", _list, _token);
    return Json(JsonConvert.DeserializeObject<ServiceResult>(_res.JsonContent));
}

方式B:全局配置(多接口需要传输大容量数据时使用)

在.NET 5的Startup.cs的ConfigureServices方法中添加如下配置:

// 调整表单提交限制
services.Configure<FormOptions>(options =>
{
    options.ValueLengthLimit = int.MaxValue;
    options.MultipartBodyLengthLimit = int.MaxValue;
});
// IIS托管场景配置
services.Configure<IISServerOptions>(options =>
{
    options.MaxRequestBodySize = 100_000_000;
});
// Kestrel托管场景配置
services.Configure<KestrelServerOptions>(options =>
{
    options.Limits.MaxRequestBodySize = 100_000_000;
});

方案2:优化传输方式(更推荐,从根源避免表单字段限制)

直接将JSON数组放在请求体中传输,不走表单参数,同时省去手动序列化/反序列化步骤:

前端jQuery代码修改

$("#SaveData").click(function (e) {
    e.preventDefault();
    var _models = new Array();
    $(".loadingArea").show();
    var _val = $("#maxID").val();
    for (var i = 0; i < _val; i++) {
        var model = {
            ID: $("#ID_" + i).val(),
            Data1: $("#Data1").val(),
            Data2: $("#Data2").val(),
            Data3: $("#Data3").val(),
            Data4: $("#Data4").val(),
            Data5: $("#Data5").val(),
            Data6: $("#Data6_" + i).val(),
            Data7: $("#Data7_" + i).val(),
            Data8: $("#Data8_" + i).val(),
            Data9: $("#Data9_" + i).val(),
            Data10: $("#Data10_" + i).val(),
            Data11: $("#Data11_" + i).val(),
            Data12: $("#Data12_" + i).val(),
            Data13: $("#Data13_" + i).val(),
            Data14: $("#Data14_" + i).val(),
            Data15: $("#Data15_" + i).val(),
            Data16: $("#Data16_" + i).val(),
            Data17: $("#Data17_" + i).val(),
            Data18: $("#Data18_" + i).val(),
            Data19: $("#Data19_" + i).val(),
            Data20: $("#Data20_" + i).val(),
            Data21: $("#Data21_" + i).val()
        };
        _models[i] = model;
    }
    $.ajax({
        url: "Data/PostData",
        data: JSON.stringify(_models),
        contentType: "application/json; charset=utf-8", // 指定请求体为JSON格式
        dataType: "json",
        type: 'post',
        success: function (data) {
            // 原有业务逻辑
        },
        complete: () => {
            $(".loadingArea").hide();
        }
    });
});

后端Action代码修改

[HttpPost]
[RequestSizeLimit(100_000_000)] // 按需调整最大请求大小
public JsonResult PostData([FromBody] List<MyModel> LogDto)
{
    // 无需手动反序列化,直接使用绑定完成的LogDto即可
    var _res = restHelper.Post($"data-entry", LogDto, _token);
    return Json(JsonConvert.DeserializeObject<ServiceResult>(_res.JsonContent));
}

IIS部署补充配置

如果站点部署在IIS上,还需要在web.config中添加请求大小限制:

<system.webServer>
  <security>
    <requestFiltering>
      <!-- 单位为字节,示例为100MB,按需调整 -->
      <requestLimits maxAllowedContentLength="104857600" />
    </requestFiltering>
  </security>
</system.webServer>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:45:04