解决.NETMVC(ajax)Json请求太大,无法反序列化(The JSON request was too large to be deserialized)问题

遇到这个问题时候感觉挺奇怪,感觉数据并没有几十上百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.),但是并没有指明到底是什么样的安全风险。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值