我正在使用 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
);