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

ASP.NET Core 3.1服务端接收大尺寸数组Ajax POST时返回400错误的问题求助

解决大数组POST请求返回400错误的问题

这种大数组提交失败的情况我之前碰到过好几次,结合你的场景(小数据正常、大数据400,本地没问题),大概率是ASP.NET Core的默认配置限制了请求的表单值数量,或者提交格式的问题,咱们一步步来解决:

可能的原因分析

你提交566行数据时,每个数组元素包含3个字段(TestOrder、Answer、SendedTestId),总键值对数量是566*3=1698,而ASP.NET Core默认的FormOptions.ValueCountLimit是1024——超过这个数量就会直接返回400错误,这就是核心问题。本地环境可能因为开发配置宽松没触发这个限制,但生产/测试服务端是默认配置。

解决方案一:调整表单值数量限制(适合保留原提交格式)

如果想继续使用application/x-www-form-urlencoded格式提交,需要修改服务端的FormOptions配置,调大允许的表单值数量:

在你的Program.cs(.NET 6+)或者Startup.cs(.NET 5及更早)中添加以下配置:

builder.Services.Configure<FormOptions>(options =>
{
    // 根据你的实际需求设置足够大的值,比如5000
    options.ValueCountLimit = 5000;
    // 可选:如果单个字段值可能很长,也可以调整这个限制
    options.ValueLengthLimit = int.MaxValue;
});

解决方案二:改用JSON格式提交(更推荐的方案)

application/x-www-form-urlencoded并不适合传输大量复杂数据,改用JSON格式可以彻底避免表单值数量的限制,同时模型绑定更高效:

1. 修改前端Ajax代码

把data改为JSON序列化后的字符串,同时更新contentType:

$.ajax({
    url: '/StartTest/SubmitTest',
    type: 'post',
    data: JSON.stringify(Data), // 序列化数据为JSON字符串
    dataType: 'json',
    contentType: 'application/json; charset=UTF-8', // 修改为JSON类型
    beforeSend: function (xhr) {
        xhr.setRequestHeader("XSRF-TOKEN", $('input:hidden[name="__RequestVerificationToken"]').val());
    },
    success: function (data) {
        // 原有成功逻辑不变
        Swal.fire({
            icon: 'success',
            text: data.responseText,
            showConfirmButton: false,
        })
        setTimeout(function () {
            window.location.href = "StartTest/Completed"
        }, 2000)
    }
});

2. 修改后端Action代码

给参数添加[FromBody]特性,告诉框架从请求体的JSON中绑定模型:

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> SubmitTest([FromBody] List<TestAnswer> testAnswer) { 
    // 原有业务逻辑不变
    try { 
        if (testAnswer != null) { 
            var UrlModel = _context.UrlModels.Where(x => x.SendedTestId == testAnswer[0].SendedTestId).FirstOrDefault(); 
            UrlModel.CompletedDate = DateTime.Now; 
            _context.UrlModels.Attach(UrlModel); 
            _context.SaveChanges(); 
            _context.TestAnswers.AddRange(testAnswer); 
            _context.SaveChanges(); 
            return Json(new { success = true, responseText = "Sonuçlar kaydedildi!", id=UrlModel.SendedTestId }); 
        } else { 
            return Json(new { success = false, responseText = "Bir Hata Oluştu." }); 
        } 
    } catch (Exception) { 
        return Json(new { success = false, responseText = "Bir Hata Oluştu." }); 
    } 
}

额外注意事项

如果你的数据量未来还会增大,可以顺便检查全局请求体大小限制,确保不会触发413(请求过大)错误,在Program.cs中添加:

builder.Services.AddControllers(options =>
{
    // 设置最大请求体大小,这里设为无限制,根据需求调整
    options.MaxRequestBodySize = long.MaxValue;
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:53:14