如何为大型数据集允许POST到MVC5控制器。

时间:2014-01-28 07:47:26

标签: rest post asp.net-mvc-5

我已经看到几个帖子解决了这个问题,或类似于此问题的请求或GET。我没有遇到这个问题从服务器获取数据,它只在POST上。

我得到的错误是

JSON请求太大而无法反序列化。

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

我无法一致地确定哪些操作导致哪个错误,但主要是后者。

为了获取MaxJsonSize值的值,在控制器的Index方法中,我获取此数据并将其转储到viewbag中以写入客户端的控制台。每次以10k(102400)回复。

如果我减少了数据包大小,并且仍然像以前一样序列化,那么我没有错误。

在fiddler中,我可以检查包,并且所有JSON都可以在fiddler中反序列化,所以我在JSON中没有看到问题。另外,如果我console.log(数据)chrome也没有遇到任何问题。

控制器中的VM对于POST和GET都是相同的。除了例外,POST的数据多于GET。为了测试这个,我从服务器获得了一个庞大的数据集;
所有50个州的GeoJSON数据。以下是结果。 获取内容长度:3229309返回200 POST内容长度:2975244返回500

在此方案中POST失败并返回先前列出的第二个错误。

我只是最低限度地改变了数据(一个字符串)并且不知道为什么当它被发送回它的较小时,但是GET和POST的JSON几乎相同。

我尝试过更改web.config文件:

  <system.web.extensions>
     <scripting>
        <webServices>
           <jsonSerialization maxJsonLength="2147483644"/>
        </webServices>
     </scripting>
  </system.web.extensions>

我刚刚在

之前将其添加到配置文件的末尾

我还在Settings.config中添加了一个参数

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

我还验证了此参数作为IIS中应用程序设置的一部分加载。

我还可以尝试更改其他内容以允许在POST中发送这些大型数据集。

作为最后的手段,我打算从POST中提取所有GeoJSON数据。然而,当用户导航回来并且他们没有改变他们映射的内容时,我们必须再次找到所有GeoJSON数据,导致服务器上的过度工作等。我想如果我只需要获取它一次那将是从效率的角度来看最好。

1 个答案:

答案 0 :(得分:1)

我也在努力解决这个问题,我在web.config中没有改变任何帮助,尽管有几个SO答案看起来很相关。他们帮助返回大型JSON数据,但是大型JSON帖子仍然失败。最后我发现了这个: increase maxJsonLength for JSON POST并在那里使用了解决方案,它对我有用。

从那里引用:

  

MVC json序列化程序不会查看webconfig以获取最大长度(对于asp.net Web服务而言)。你需要使用自己的序列化器。你重写ExecuteResult并提供自己的json序列化程序。要覆盖输入,创建一个新的JsonValueProviderFactory,然后覆盖控制器中的ValueProvider,以便在json请求时返回新的json工厂。