遇到这个问题时候感觉挺奇怪,感觉数据并没有几十上百MB的级别,怎么就报Json请求太大了。但是无论如何,遇到了就尝试解决。
查到的最多的解决方案是:
1、修改Web.config文件配置节system.web
下httpRuntime maxRequestLength
<system.web>
<httpRuntime maxRequestLength="2147483647" ...
意料中的无效,因为我站点原本配置中的最大请求长度就是2147483647
。这个配置的单位可是千字节(KB)
(参见),也就是可以接受的最大请求长度为2TB!!!更加懵逼了,我的请求充其量也就MB的单位,怎么就超长了?!?!
接着查询到的另一个解决方案是:
2、修改appSetting配置aspnet:MaxJsonDeserializerMembers
官方说明中该配置项的默认配置是1000,感觉找到点了!修改配置项如下,果然搞定了!
<add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
还是很疑惑,为什么要在两个地方配置可接受的最大请求长度。
关于aspnet:MaxJsonDeserializerMembers的解释,参考微软官方文档 asp.NET appSettings Element,和官方关于HttpRuntimeSection.MaxRequestLength属性的解释,以及JavaScriptSerializer文档。
我的理解是:
- HttpRuntimeSection.MaxRequestLength属性对各种形式的输入流(文件流、json等)作一个统一的最大值限定;
- aspnet:MaxJsonDeserializerMembers配置在上述属性的基础上对Json形式的请求做了进一步的限制,更小的默认配置帮助开发人员简化请求数据以保证更高的响应速度
官方所述将aspnet:MaxJsonDeserializerMembers
设置为太大的数字可能会带来安全风险
(Setting this attribute to too large a number can pose a security risk.),但是并没有指明到底是什么样的安全风险。