MVC中maxJsonLength报错:大XML字符串回传控制器失败
解决MVC中AJAX回传大XML触发maxJsonLength错误且Action未调用的问题
先别急着调各种配置,你首先得注意一个最容易忽略的基础问题:你的GetProcesedXml方法是private修饰的!MVC的控制器Action必须是public才能被路由系统访问到,这大概率是它没被调用的直接原因,先把它改成public再说:
public JsonResult GetProcesedXml(string resultXml) { // 可以先加调试断点测试是否进入方法 return Json("处理完成"); }
接下来,再针对大JSON数据传输的问题,从几个层面补全配置和代码:
1. 修正前端AJAX的序列化方式
你设置了contentType: "application/json; charset=utf-8",但直接传对象data2的话,jQuery不会自动帮你序列化成标准JSON字符串,MVC的模型绑定器可能无法正确解析大字符串。修改前端代码,手动序列化:
var processedResult = ""; // 你的处理后XML var data2 = JSON.stringify({ resultXml: processedResult }); $.ajax({ type: "POST", url: "MyController/GetProcesedXml", data: data2, // 传入序列化后的JSON字符串 contentType: "application/json; charset=utf-8", success: function (r) { alert('success'); }, error: function (data) { console.log(data.responseText); // 用控制台查看更详细的错误信息 } });
2. 完善web.config的大请求限制配置
你已经加了部分配置,但需要确保所有相关节点都正确设置,避免请求被IIS或ASP.NET拦截:
- 在
<system.web>节点下,调整请求长度和超时:<httpRuntime maxRequestLength="102400" executionTimeout="3600" /> <!-- 100MB,超时时间设为1小时 --> - 在
<system.webServer>的<security><requestFiltering>节点下(如果没有就创建):<security> <requestFiltering> <requestLimits maxAllowedContentLength="104857600" /> <!-- 100MB,单位是字节 --> </requestFiltering> </security> - 在
<appSettings>里添加JSON反序列化的全局限制:<add key="aspnet:MaxJsonDeserializerMembers" value="2147483647" /> <add key="JsonValueProviderFactory.MaxJsonLength" value="104857600" />
3. 手动控制后端的JSON反序列化(可选)
如果全局配置还是不生效,可以在Action里手动读取请求流并反序列化,直接指定最大长度:
public JsonResult GetProcesedXml() { // 重置请求流位置,确保读取完整内容 Request.InputStream.Position = 0; string jsonContent = new StreamReader(Request.InputStream).ReadToEnd(); // 手动反序列化,设置最大长度 var serializer = new JavaScriptSerializer(); serializer.MaxJsonLength = int.MaxValue; var requestData = serializer.Deserialize<dynamic>(jsonContent); string resultXml = requestData.resultXml; // 你的处理逻辑 return Json("处理成功"); }
4. 长期优化方案:压缩或分块传输
如果XML的尺寸持续增大,建议采用GZIP压缩后再传输:前端用pako等库压缩XML字符串,后端解压处理;或者把XML存储到服务器临时文件,只传输文件ID,从根本上避免大请求的各种限制问题。
内容的提问来源于stack exchange,提问作者daniell89
相关产品推荐
相关产品推荐

