others - 在web.config中是否可以不受限制的长度设置maxJsonLength?

我正在使用jQuery的自动完成功能,当尝试检索超过17000条记录的列表(每条记录的长度不超过10个字符)时,它长度超出并引发了错误:

异常信息:
Exception type : InvalidOperationException
Exception message : Error during serialization or deserialization using the JSON JavaScriptSerializer . the length of the string exceeds the value set on the maxJsonLength property .

可不可以在web.config中为maxJsonLength设置无限长的长度? 如果不能,可以设置的最大长度是多少?

时间:

注意:此答案仅适用于Web服务,如果从控制器方法返回JSON,请确保读取以下内容: http://stackoverflow.com/a/7207539/1246870


maxJsonLength属性不是无限的,它是默认为102400 (100k )的整数。

你可以在你的Web.Config上设置MaxJsonLength属性:


<configuration> 
 <system.web.extensions>
 <scripting>
 <webServices>
 <jsonSerialization maxJsonLength="50000000"/>
 </webServices>
 </scripting>
 </system.web.extensions>
</configuration> 


如果你仍在接收该错误:

  • maxJsonLength属性设置为web.config中的最大值之后
  • 你知道数据长度小于这个值
  • 没有为JavaScript序列化使用web服务的方法

你的问题很可能是:

MaxJsonLength属性的值仅适用于内部JavaScriptSerializer实例,异步通信层使用该实例来调用Web服务方法,(MSDN :ScriptingJsonSerializationSection.MaxJsonLength Property )

systemWebExtensions.scripting.webServices.jsonSerializationWeb.Config部分。

作为解决方法,你可以在控制器(或者地方)中执行以下操作:


var serializer = new JavaScriptSerializer();

// For simplicity just use Int32's max value.
// You could always read the value from the config section mentioned above.
serializer.MaxJsonLength = Int32.MaxValue;

var resultData = new { Value ="foo", Text ="var" };
var result = new ContentResult{
 Content = serializer.Serialize(resultData),
 ContentType ="application/json"
};
return result;


在MVC 4中,你可以执行以下操作:


protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
 return new JsonResult()
 {
 Data = data,
 ContentType = contentType,
 ContentEncoding = contentEncoding,
 JsonRequestBehavior = behavior,
 MaxJsonLength = Int32.MaxValue
 };
}

在你的控制器中。

你可以在web.config文件中配置json请求的最大长度:


<configuration>
 <system.web.extensions>
 <scripting>
 <webServices>
 <jsonSerialization maxJsonLength="....">
 </jsonSerialization>
 </webServices>
 </scripting>
 </system.web.extensions>
</configuration>

maxJsonLength的默认值为102400 ,有关详细信息,请参阅此MSDN页: http://msdn.microsoft.com/en-us/library/bb763183.aspx

如果在Web.Config中添加了,获得"Unrecognized configuration section system.web.extensions."错误,可以添加:


 <sectionGroup name="system.web.extensions" type="System.Web.Extensions">
 <sectionGroup name="scripting" type="System.Web.Extensions">
 <sectionGroup name="webServices" type="System.Web.Extensions">
 <section name="jsonSerialization" type="System.Web.Extensions"/>
 </sectionGroup>
 </sectionGroup>
 </sectionGroup>

我修复了。


//your Json data here
string json_object="........";
JavaScriptSerializer jsJson = new JavaScriptSerializer();
jsJson.MaxJsonLength = 2147483644;
MyClass obj = jsJson.Deserialize<MyClass>(json_object);

它工作得很好。

如果你从miniProfiler中的中得到这个错误,那么通过设置属性来增加这个值,MiniProfiler.Settings.MaxJsonResponseSize默认情况下,此工具将忽略配置中设置的值。


MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

Courtesy mvc-mini-profiler

我在ASP.NET网站上遇到这个问题,它完全忽略了web.config文件设置,所以我这样做:


 JavaScriptSerializer serializer = new JavaScriptSerializer();

 serializer.MaxJsonLength = Int32.MaxValue; 

 return serializer.Serialize(response);

当然,这是一个糟糕的实践,如果在web服务调用中发送大量数据,应该看看不同的方法。

问题是你真的需要返回 17 k 记录? 你打算如何处理浏览器中的所有数据? 用户不会在 17000行中滚动。

更好的方法是只检索一个"顶端数"记录并根据需要加载更多。

似乎没有"无限"值。 默认为 2097152个字符,相当于 4 MB的Unicode字符串数据。

就像已经观察到的,17,000记录在浏览器中很难使用。 如果你正在演示聚合视图,那么在服务器上执行聚合并只在浏览器中传输摘要可能会更加高效。 例如考虑文件系统浏览器,我们只看到树的顶部,然后在向下钻取时发出更多的requestes 。 每个请求中返回的记录数相对较小。 树视图演示文稿对于大型结果集可以很好地工作。

...