我正在向一个MVC控制器发送一个POST请求,其中包含大量的JSON数据,它正在抛出以下内容:
ArgumentException:使用时序列化或反序列化时出错 JSON JavaScriptSerializer。字符串的长度超过 maxJsonLength属性上设置的值。 参数名称:输入
为了解决这个问题,我尝试了许多Web.Config解决方案。即:
<system.web>
...
<httpRuntime maxRequestLength="2147483647" />
</system.web>
...
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>
现在,我正在与之通信的控制器位于自己的区域,具有自己的Web.Config。我已尝试将上述内容放在根目录或区域的Web.Config中,但两者都不起作用。当我在同一个控制器中调试另一个方法时,我得到了默认的JSON Max Length,其中包含以下内容:
Console.WriteLine(new ScriptingJsonSerializationSection().MaxJsonLength);
// 102400
以下是我想要POST的方法:
[HttpPost]
public JsonResult MyMethod (string data = "") { //... }
如何增加MVC控制器的Max JSON长度,以便我的请求能够成功到达方法?
修改:已添加<httpRuntime maxRequestLength="2147483647" />
答案 0 :(得分:9)
所以,尽管这是一个相当令人不愉快的解决方案,但我通过手动读取请求流来解决问题,而不是依赖于MVC的模型绑定器。
例如,我的方法
[HttpPost]
public JsonResult MyMethod (string data = "") { //... }
成了
[HttpPost]
public JsonResult MyMethod () {
Stream req = Request.InputStream;
req.Seek(0, System.IO.SeekOrigin.Begin);
string json = new StreamReader(req).ReadToEnd();
MyModel model = JsonConvert.DeserializeObject<MyModel>(json);
// use model...
}
这样我可以使用JSON.NET并使用MVC的默认解串器来解决JSON最大长度限制。
为了适应这个解决方案,我建议创建一个自定义的JsonResult工厂,它将替换Application_Start()
中的旧工具。
答案 1 :(得分:0)
if amount < self.amount: