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

