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

异常信息: 异常类型:InvalidOperationException 异常消息:使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过maxJsonLength属性设置的值。

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


当前回答

我使用这个,它为剑道网格读取请求工作。

{ 
  //something
   var result = XResult.ToList().ToDataSourceResult(request);
   var rs = Json(result, JsonRequestBehavior.AllowGet);
   rs.MaxJsonLength = int.MaxValue;
   return rs;
}

其他回答

您可以在web中配置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

我在ASP中遇到了这个问题。NET Web表单。它完全忽略了网络。配置文件设置,所以我这样做:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

当然,总的来说,这是一种糟糕的做法。如果您要在web服务调用中发送这么多数据,您应该考虑另一种方法。

修复ASP。NET MVC如果你想只修复导致问题的特定操作,请更改以下代码:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return Json(someBigObject);
}

:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return new JsonResult()
    {
        Data = someBigObject,
        JsonRequestBehavior = JsonRequestBehavior.DenyGet,
        MaxJsonLength = int.MaxValue
    };
}

功能应该是一样的,你可以返回更大的JSON作为响应。


基于ASP的解释。NET MVC源代码:你可以检查什么控制器。Json方法在ASP。NET MVC源代码

protected internal JsonResult Json(object data)
{
    return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}

它正在调用其他控制器。Json方法:

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}

其中传递的contentType和contentEncoding对象为空。所以基本上在控制器中调用return Json(object)相当于调用return new JsonResult {Data = object, JsonRequestBehavior = sonRequestBehavior。DenyGet}。您可以使用第二种形式并参数化JsonResult。

那么当你设置MaxJsonLength属性(默认为null)时会发生什么? 它传递给JavaScriptSerializer。MaxJsonLength属性,然后是JavaScriptSerializer。Serialize方法被调用:

JavaScriptSerializer serializer = new JavaScriptSerializer();
if (MaxJsonLength.HasValue)
{
    serializer.MaxJsonLength = MaxJsonLength.Value;
}

if (RecursionLimit.HasValue)
{
    serializer.RecursionLimit = RecursionLimit.Value;
}

response.Write(serializer.Serialize(Data));

当你不设置serializer的maxjsonlengt属性时,它会取默认值,也就是2MB。

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

正如已经观察到的,在浏览器中很难很好地使用17000条记录。如果您正在呈现一个聚合视图,那么在服务器上进行聚合并在浏览器中只传输摘要可能会更有效。例如,考虑一个文件系统浏览器,我们只看到树的顶部,然后在向下钻取时发出进一步的请求。每个请求中返回的记录数量相对较少。树视图表示可以很好地用于大型结果集。

 JsonResult result = Json(r);
 result.MaxJsonLength = Int32.MaxValue;
 result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 return result;