将大型JSON对象发布到ASP.NET MVC

时间:2013-09-04 19:23:54

标签: jquery asp.net-mvc json knockout.js

我正在使用KnockoutJS的映射插件将我的模型转换为Knockout对象。但是我在将大型json对象发送回服务器时遇到问题。我的ajax调用看起来像这样:

$.ajax({
    url: "/home/DoStuff",
    type: "POST",
    data: JSON.stringify({ deal: ko.toJS(myObjectViewModel) }),
    contentType: "application/json",
    dataType: "json",
    success: function (result) {
        console.log(result);
    },
    error: function (xhr, status, message) {
        console.log(xhr);
    }
});

执行此脚本永远不会命中控制器中的DoStuff操作。当我用Firebug检查时,POST就会继续旋转。在Firebug的Net选项卡中,它表示Post Body为159.9 KB,Total Sent为165.1 KB(包括标题)。如果它被发送了,为什么它没有在代码中命中我的断点?

但是当我只发送一个myObjectViewModel的属性时,它会发布很好并且一切都很成功。因此,我认为问题在于发布的数据大小。所以我尝试增加maxJsonLength。

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

这没有帮助。

我还应该做些什么吗?

4 个答案:

答案 0 :(得分:10)

我想我的对象超过了允许ASP.NET反序列化的最大成员数。我添加了以下内容以增加它并且它可以工作。

<appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>

更新:所以还有更多内容,因为在我开始工作之后,它最终会因为看似没有理由而停止工作。 Firebug会再次显示帖子刚刚旋转而没有击中后端的代码。只有在我关闭Firefox,杀死IIS Express进程并关闭Visual Studio之后,帖子才开始重新开始工作。但关闭VS似乎是关键。在我再次使用它之后,更改代码并重新运行应用程序会使问题重新出现。出现问题时,即使是硬刷新也不会加载页面。它只会坐在那里旋转。该页面仅在我终止IIS Express进程并从VS重新运行后重新加载。

所以我转储了IIS Express并在我的机器上使用了完整的IIS。看起来这样可以解决问题。即使在更改代码和重新编译之后,每次都会发布大型json数据。

IIS Express似乎可以处理少量的json,但在更大的集合上会出现窒息。我没有经过足够的测试,100%确认这一点,但我知道完整的IIS性能更可靠。尚未测试VS的内部Web服务器。

环境:Windows 8,Visual Studio 2012 Update 3

答案 1 :(得分:3)

你可能需要碰撞通用maximum request length(以千字节为单位,例如1GB)

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="1048576" />
  </system.web>
</configuration>

如果你使用的是IIS 7,可能会碰到max content length(以字节为单位,例如1GB)

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="1073741824" />
    </requestFiltering>
  </security>
</system.webServer>

答案 2 :(得分:3)

我正在将包含近1,50,00,000个字符的大型JSON数据传递给我的控制器,并在web.config中进行了以下更改:

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

这对我很有帮助......

答案 3 :(得分:0)

我遇到了同样的问题从客户端向服务器控制器操作发布大型模型对象数据(JSON)。添加以下设置配置工作正常。谢谢。

<appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>