ASP.NET Core Ajax发送大列表时触发net::ERR_HTTP2_PROTOCOL_ERROR
解决方案建议
1. 改用POST请求(推荐)
问题根源是GET请求的URL长度有限制,当列表条目过多时,序列化后的JSON字符串会超出浏览器或服务器允许的最大URL长度,导致协议错误。POST请求将数据放在请求体中,不受此限制。
修改视图Ajax代码:
// 循环构建shippingArray逻辑不变 var url = '@Url.Action("XXXX","XXXXX")'; $.ajax({ url: url, type: "POST", // 改为POST请求 contentType: "application/json", // 指定请求内容为JSON datatype: "JSON", async: true, data: JSON.stringify(shippingArray), // 直接传递序列化后的数组 success: function () { // 成功回调逻辑 }, error: function(xhr, status, error) { // 可添加错误处理 console.error(error); } });
修改控制器代码:
首先定义对应的数据模型类(替代直接接收字符串,更规范易维护):
public class ShippingItem { public string ProductId { get; set; } public string ColorId { get; set; } public string ShippingId { get; set; } // 注意修正原代码中的拼写错误ShippigId public int Count { get; set; } }
然后更新控制器方法,添加[HttpPost]特性并通过[FromBody]绑定列表:
[HttpPost] public async Task<bool> ShippingFinishDeleteItem([FromBody] List<ShippingItem> items) { // 处理传入的items列表逻辑 return await Task.FromResult(true); }
2. 调整GET请求的URL长度限制(不推荐)
如果必须使用GET请求,可以修改服务器端的最大URL长度配置,但浏览器自身也有URL长度限制(如Chrome约8KB),因此仅适用于数据量不是特别大的场景。
Kestrel服务器配置(Program.cs):
builder.WebHost.ConfigureKestrel(options => { // 调整最大请求行大小,单位为字节,根据需求设置 options.Limits.MaxRequestLineSize = 65536; });
HttpSys服务器配置(Program.cs):
builder.Services.Configure<HttpSysOptions>(options => { options.MaxRequestLineSize = 65536; });
3. 修正拼写错误
原代码中ShippigId存在拼写错误,建议修正为ShippingId,避免后续模型绑定或业务逻辑中出现异常。
内容的提问来源于stack exchange,提问作者Kocagozz
相关产品推荐
相关产品推荐

