我正在使用jQuery的自动完成功能 . 当我尝试检索超过17000个记录的列表(每个记录的长度不超过10个)时,它超出了长度并抛出错误:
异常信息:异常类型:InvalidOperationException异常消息:使用JSON JavaScriptSerializer进行序列化或反序列化时出错 . 字符串的长度超过maxJsonLength属性上设置的值 .
我可以在 web.config
中为 maxJsonLength
设置无限长度吗?如果没有,我可以设置的最大长度是多少?
27 回答
我遵循了vestigal的回答并得到了这个解决方案:
当我需要将大型json发布到控制器中的动作时,我会在使用JSON JavaScriptSerializer进行反序列化时获得着名的“错误 . ”字符串的长度超过了maxJsonLength属性上设置的值 . \ r \ nParameter name:input Value 提供者“ .
我所做的是创建一个新的ValueProviderFactory,LargeJsonValueProviderFactory,并在GetDeserializedObject方法中设置MaxJsonLength = Int32.MaxValue
}
然后,在Global.asax.cs的Application_Start方法中,将ValueProviderFactory替换为新的:
我们不需要任何服务器端更改 . you can fix this only modify by web.config file 这对我有帮助 . 试试这个
对于那些在MVC3中遇到问题的人来说,JSON会自动被反序列化为模型 Binders 并且太大,这是一个解决方案 .
将JsonValueProviderFactory类的代码从MVC3源代码复制到新类中 .
添加一行以在反序列化对象之前更改最大JSON长度 .
用新的修改后的类替换JsonValueProviderFactory类 .
感谢http://blog.naver.com/techshare/100145191355和https://gist.github.com/DalSoft/1588818为我指明了如何做到这一点的正确方向 . 第一个站点上的最后一个链接包含解决方案的完整源代码 .
使用
lib\Newtonsoft.Json.dll
WebForms UpdatePanel的解决方案:
将设置添加到Web.config:
https://support.microsoft.com/en-us/kb/981884
ScriptRegistrationManager
类包含以下代码:如果这个maxJsonLength值是一个int那么它的int 32bit / 64bit / 16bit有多大....我只想确定我可以设置的最大值是什么maxJsonLength
NOTE: 此答案仅适用于Web服务,如果您从Controller方法返回JSON,请确保您也阅读以下SO答案:https://stackoverflow.com/a/7207539/1246870
MaxJsonLength属性不能无限制,是一个默认为102400(100k)的整数属性 .
您可以在web.config上设置MaxJsonLength属性:
如果您使用的是MVC 4 ,请务必查看this answer .
如果您仍然收到错误:
将
maxJsonLength
属性设置为web.config中的最大值后并且您知道数据的长度小于此值
并且您没有使用Web服务方法进行JavaScript序列化
你的问题很可能是:
基本上,"internal"
JavaScriptSerializer
在从Web方法调用时尊重maxJsonLength
的值;直接使用JavaScriptSerializer
(或通过MVC操作方法/控制器使用)确实 not 尊重maxJsonLength
属性,至少不是来自web.config的systemWebExtensions.scripting.webServices.jsonSerialization
部分 .作为解决方法,您可以在Controller(或任何地方)中执行以下操作:
这个答案是我对this asp.net forum answer的解释 .
刚碰到这个 . 我收到了6000多条记录 . 刚决定我只做一些分页 . 在中,我接受我的MVC JsonResult endpoints 中的页码,默认为0,所以没有必要,如下所示:
然后而不是说:
我说:
这很简单 . 然后,在JavaScript中,而不是这样:
我改为说:
并将您的记录附加到您最初使用它们的任何内容中 . 或者等到所有通话完成并将结果拼凑在一起 .
如果您在View中遇到此类问题,可以使用以下方法来解决此问题 . 这里我使用 Newtonsoft 包 .
只需在MVC的Action方法中设置MaxJsonLength proprty即可
似乎没有“无限”的 Value . 默认值为2097152个字符,相当于4 MB的Unicode字符串数据 .
正如已经观察到的那样,17,000条记录在浏览器中很难使用 . 如果要呈现聚合视图,则在服务器上执行聚合并在浏览器中仅传输摘要可能更有效 . 例如,考虑一个文件系统浏览器,我们只看到顶部树,然后在我们向下钻取时发出更多请求 . 每个请求中返回的记录数相对较少 . 树视图演示文稿可以很好地适用于大型结果集 .
如果从MVC中的MiniProfiler收到此错误,则可以通过将属性
MiniProfiler.Settings.MaxJsonResponseSize
设置为所需的值来增加该值 . 默认情况下,此工具似乎忽略config中设置的值 .礼貌mvc-mini-profiler .
我建议将其设置为Int32.MaxValue .
问题是你是否真的需要返回17k记录?您打算如何处理浏览器中的所有数据?无论如何,用户不会滚动17000行 .
更好的方法是仅检索“前几个”记录并根据需要加载更多 .
我修好了它 .
它工作得很好 .
您可以像其他人所说的那样在配置中设置它,或者您可以设置序列化器的单个实例,如:
一些属性魔法怎么样?
然后,您可以使用全局筛选器配置或控制器/操作方式全局应用它 .
如果在您的web.config中实现上述添加后,您会收到“无法识别的配置部分system.web.extensions . ”错误,然后尝试将其添加到
<ConfigSections>
部分中的web.config:在MVC 4中,您可以:
在你的控制器中 .
加成:
对于任何对您需要指定的参数感到困惑的人来说,调用可能如下所示:
您可以在web.config文件中配置json请求的最大长度:
maxJsonLength的默认值是 102400 . 有关更多详细信息,请参阅此MSDN页面:http://msdn.microsoft.com/en-us/library/bb763183.aspx
如果在web.config设置之后仍然出现错误,如下所示:
我解决了以下问题:
我希望这应该有所帮助 .
你可以把这一行写入Controller
你也可以把这一行写成
web.config
`
为了安全起见,请同时使用两者 .
Alternative ASP.NET MVC 5 Fix:
(我的类似于MFCs上面的回答,只有一些小改动)
我还没准备好改用Json.NET,在我的情况下,错误发生在请求期间 . 我方案中的最佳方法是修改实际的
JsonValueProviderFactory
,它将修复程序应用于全局项目,可以通过编辑global.cs
文件来完成 .添加web.config条目:
然后创建以下两个类
这基本上是
System.Web.Mvc
中的默认实现的精确副本,但添加了可配置的web.config appsetting值aspnet:MaxJsonLength
.您不需要使用web.config您可以在传递列表的catch值期间使用short属性例如声明一个类似的模型
在这里我使用短比例,如BC =条形码BE =书籍版本等
我解决了添加此代码的问题:
我在ASP.NET Web窗体中遇到了这个问题 . 它完全忽略了web.config文件设置所以我这样做了:
当然总的来说这是一种可怕的做法 . 如果要在Web服务调用中发送这么多数据,您应该看一下不同的方法 .