“字符串的长度超过maxJsonLength属性上设置的值”不符合web.config值?

时间:2016-10-12 19:43:20

标签: ajax asp.net-mvc asp.net-mvc-4

我前几天问了这个问题,但未能提出解决方案:

What happens between clicking a button and the Javascript method actually executing?

使用更好的信息发布一个新问题,包括ajax请求的屏幕截图,请求/响应的详细信息,以及我自己对昨天发生的事情的理解更清楚,以便我可以更好地调试它。

我的jQuery将以下请求发送到我的服务器:

enter image description here

RtfErrorList中的data超过400万个字符,包含RTF编码。

尽管在我的web.config中添加了各种XML节点以增加maxJsonLength,但我仍然遇到此异常。

如果我查看Chrome开发工具中的网络选项卡,我会收到以下信息(我删除了一些不重要的内容,例如origin:locahost和其他类似的东西)

请求方法:POST

  

状态代码:500内部服务器错误

响应标题:

  

HTTP / 1.1 500内部服务器错误

     

Content-Type:text / html;字符集= UTF-8

     

服务器:Microsoft-IIS / 7.5

     

X-AspNet-Version:4.0.30319

     

X-UA兼容:IE = Edge

请求标题:

  

内容长度:3799356

     

Content-Type:application / json;

     

接受:text / html, / ; Q = 0.01

     

X-Requested-With:XMLHttpRequest

请求有效负载:

  

FileName:“someFileName”

     

RtfErrorList:“some4MillionCharacterStringIncludingRtfEncoding”

堆栈跟踪中的最后几个条目:

[ArgumentException:使用JSON JavaScriptSerializer进行序列化或反序列化时出错。字符串的长度超过maxJsonLength属性上设置的值。 参数名称:输入]

  

System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer,String input,Type type,Int32 depthLimit)

     

System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext)   System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext)

我已尝试将以下密钥添加到我的web.config:

<add key="JSONMAXJSONLENGTH" value="2147483644" />
<add key="aspnet:MaxJsonDeserializerMembers" value="2147483644" />

我实际上不确定第一个节点来自哪个节点;它就在我面前。

以及代码段found here

根据this SO answer,我理解这些web.config值仅由内部JavaScriptSerializer 使用,而不是我可能在控制器中编写的任何“自定义”代码我。在这种情况下,应该可以正常,因为System.web.SCript.Serialization.javaScriptSerializer.Deserialize会抛出异常。这应该使用web.config值,对吗?

我无法弄清楚可能导致这种情况的原因......

1 个答案:

答案 0 :(得分:0)

您是否希望在Ajax中设置dataType:'html'时收到html格式?

您是否在Ajax中尝试过此操作?

data: JSON.stringify(data),
contentType: 'application/json; charset=utf-8',
dataType: 'json',

此外,根据documentation,MaxJsonLength属性的值仅适用于内部JavaScriptSerializer实例,异步通信层使用该实例来调用Web服务方法。

在这种情况下,您可能需要在控制器中手动进行序列化。例如:

public ActionResult FOO()
{
    var serializer = new JavaScriptSerializer { MaxJsonLength = Int32.MaxValue };


    // You could also read MaxJsonLength from your config 
    //serializer.MaxJsonLength = Int32.MaxValue;

    var myLargeData = new {
        ID = "5",
        Foo = "Bar",
        Value = "foo"
    };
    var result = new ContentResult
    {
        Content = serializer.Serialize(myLargeData),
        ContentType = "application/json"
    };
    return result;
}