我前几天问了这个问题,但未能提出解决方案:
What happens between clicking a button and the Javascript method actually executing?
使用更好的信息发布一个新问题,包括ajax请求的屏幕截图,请求/响应的详细信息,以及我自己对昨天发生的事情的理解更清楚,以便我可以更好地调试它。
我的jQuery将以下请求发送到我的服务器:
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值,对吗?
我无法弄清楚可能导致这种情况的原因......
答案 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;
}