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
相关产品推荐
相关产品推荐

