aspnet request was too large to be deserialized

目前Web应用前端和后端通信最流行的方式,就是通过Http请求的方式。有时候前端消息体上传的内容很多,对于Asp .net 应用,可能会收到异常System.InvalidOperationException: The JSON request was too large to be deserialized.

原因:
(1)MaxJsonDeserializerMembers超长,在asp .net 这个长度默认是1000.它的计算方式是每个字段计数为1,常量数组按数组长度计算。例如一个Json对象数组长度为10,这个对象有8个字段,其他有个字段是整形数组,长度为2,那么它的Members=(8-1+12)10.所以当Post一个对象数组时,需要考虑是否会超长

(2)消息体超长,asp.net 默认最大为2M

解决方案
(1)在配置文件Web.config的 <appSettings>节点下配置<add key="aspnet:MaxJsonDeserializerMembers" value="5000" />。
最大值按需求设置

(2)在配置文件Web.config根节点下设置Json最大长度
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>

如果此方案不生效,可以考虑自定义ValueProviderFactory替换默认的实现
ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory().FirstOrDefault());
ValueProviderFactories.Factories.Add(new MyJsonDotNetValueProviderFactory());

后记:
为什么要设置这些默认的大小。反向考虑一下,如果不设置最大限制,Http请求可能会传入超大容量的消息,服务器压力会剧增。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,131评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,993评论 6 342
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,077评论 2 89
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,635评论 1 92
  • 这个五月,染绿鸽哨的草色 潮水般疯涨 满院石榴、蔷薇、月季 热情的火焰点燃了季节的芬芳 池中,小荷尖的蜻蜓诠释宋诗...
    甘树林阅读 699评论 2 4