协慌网

登录 贡献 社区

我可以在 web.config 中为 maxJsonLength 设置无限长度吗?

我正在使用 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 ,请确保也检查出此答案


如果您仍然收到错误:

  • 在 web.config 中将maxJsonLength属性设置为其最大值之后
  • 并且您知道您的数据长度小于此值
  • 并且您没有将 Web 服务方法用于 JavaScript 序列化

您的问题可能是:

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
);