我正在使用 jQuery 的自动完成功能。当我尝试检索超过 17000 条记录的列表(每条记录的长度不超过 10 个字符)时,它超过了长度,并引发错误:
异常信息:
异常类型:InvalidOperationException
异常消息:使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过在 maxJsonLength 属性上设置的值。
我可以在web.config
maxJsonLength
设置无限长度吗?如果没有,我可以设置的最大长度是多少?
注意:此答案仅适用于 Web 服务,如果要从 Controller 方法返回 JSON,请确保还阅读以下 SO 答案: https://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>
如果您使用的是 MVC 4 ,请确保也检查出此答案。
如果您仍然收到错误:
maxJsonLength
属性设置为其最大值之后您的问题可能是:
MaxJsonLength 属性的值仅适用于内部 JavaScriptSerializer 实例,异步通信层使用该实例来调用 Web 服务方法。 ( MSDN:ScriptingJsonSerializationSection.MaxJsonLength 属性)
基本上,从网络方法调用时,“内部” JavaScriptSerializer
maxJsonLength
的值;直接使用的JavaScriptSerializer
(或使用通过 MVC 行动的方法 / 控制器)不尊重maxJsonLength
属性,至少没有从systemWebExtensions.scripting.webServices.jsonSerialization
web.config 中的部分。特别是, Controller.Json()
方法不遵守配置设置!
解决方法是,您可以在 Controller 内(或实际上在任何地方)执行以下操作:
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;
这个答案是我对这个 asp.net 论坛答案的解释。
在 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
};
}
在您的控制器中。
添加:
对于那些对您需要指定的参数感到困惑的人,呼叫可能看起来像这样:
Json(
new {
field1 = true,
field2 = "value"
},
"application/json",
Encoding.UTF8,
JsonRequestBehavior.AllowGet
);