.Net Core Kestrel配置4MB请求限制后GET传2.1MB JSON仍触发限制问题
Kestrel GET请求大体积JSON触发限制问题解决
低于4MB阈值仍触发限制的原因
- 你设置的
MaxRequestLineSize限制的是整个请求行的总长度,除了Query String中的JSON内容,还包含HTTP方法、请求路径、HTTP版本标识,额外占用了部分额度。 - GET请求携带的JSON会做URL编码,特殊字符、非ASCII字符会被转义为
%XX格式,单字符会从1字节膨胀到3字节,2.1MB的原始JSON编码后体积很容易超过4MB阈值。 - 若你的服务前置了IIS、Nginx等反向代理,代理服务本身默认也有请求行、Query String长度限制,会先于Kestrel拦截请求。
- 你配置的是Kestrel层面的限制,ASP.NET Core本身还有Query String解析、模型绑定层面的默认限制。
是否存在JSON属性数量限制
存在两类和属性数量相关的限制:
- 若你将JSON拆分为多个Query参数绑定到模型,ASP.NET Core MVC默认的最大模型绑定集合大小为1024,属性数量超过该值会触发绑定失败。
- 若你将整个JSON作为单个Query参数取值后反序列化,
System.Text.Json默认有64层的嵌套深度限制,.NET 7+版本可显式配置MaxPropertyCount限制属性总数,若你之前调整过该配置也可能触发拦截。
调整方案
1. 调高Kestrel相关阈值,预留编码冗余
将请求行相关限制适当调大,规避URL编码和请求行固有内容的额度占用:
builder.UseKestrel(options => { int oneMB = 1048576; // 调整到6MB预留冗余 options.Limits.MaxRequestLineSize = 6 * oneMB; options.Limits.MaxRequestBufferSize = 6 * oneMB; options.Limits.MaxResponseBufferSize = 4 * oneMB; options.Limits.MaxRequestBodySize = 10 * oneMB; });
2. 调整ASP.NET Core层面限制
如果涉及模型绑定和JSON反序列化,同步调整对应配置:
// 调整MVC模型绑定限制 builder.Services.AddMvc(options => { // 按需调整集合绑定最大数量,避免属性过多触发限制 options.MaxModelBindingCollectionSize = 10000; // 按需调整JSON嵌套深度上限 options.MaxModelBindingRecursionDepth = 128; }); // 调整System.Text.Json序列化配置 builder.Services.Configure<Microsoft.AspNetCore.Mvc.JsonOptions>(options => { options.JsonSerializerOptions.MaxDepth = 128; // .NET 7+ 版本可显式放开属性数量限制 // options.JsonSerializerOptions.MaxPropertyCount = int.MaxValue; });
3. 调整前置代理限制(若存在)
- 若使用IIS托管,需在
web.config中添加配置:<system.webServer> <security> <requestFiltering> <requestLimits maxUrl="6291456" maxQueryString="6291456" /> </requestFiltering> </security> </system.webServer> - 若使用Nginx反向代理,需在配置中添加:
http { large_client_header_buffers 4 64k; }
注意:GET请求携带大体积载荷不符合HTTP规范设计,部分代理、CDN、客户端会主动截断过长的请求行,兼容性较差,非特殊场景建议改用POST请求将JSON放入请求体传输。
内容的提问来源于stack exchange,提问作者TheLovelySausage
相关产品推荐
相关产品推荐

