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

Posted

技术标签:

【中文标题】将大型 JSON 对象发布到 ASP.NET MVC【英文标题】:Posting a large JSON object to ASP.NET MVC 【发布时间】:2013-09-08 10:45:48 【问题描述】:

我正在使用 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>

这没有帮助。

还有什么我应该做的吗?

【问题讨论】:

【参考方案1】:

我猜我的对象超出了 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 的内部网络服务器。

环境:Windows 8、Visual Studio 2012 Update 3

【讨论】:

【参考方案2】:

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

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

这对我很有效.....

【讨论】:

【参考方案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>

【讨论】:

我正在使用 IIS Express。谢谢,我都试过了,但仍然无法访问服务器。【参考方案4】:

我在将大型模型对象数据 (JSON) 从客户端发布到服务器控制器操作时遇到了同样的问题。将以下设置添加到配置中效果很好。谢谢。

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

【讨论】:

以上是关于将大型 JSON 对象发布到 ASP.NET MVC的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 将 JSON 对象成功发送到 ASP.NET WebMethod

如何将带有 JSON、jQuery 的复杂对象数组发布到 ASP.NET MVC 控制器?

将 JSON 发布到 ASP.NET MVC 可空短属性

如何将文件和 json 对象从邮递员传递到 asp.net 核心 webapi

ASP.Net WEB API 无法 POST 来自移动设备的大型 JSON 数据

将 jQuery JSON 对象保存到 SQL 表中,而无需在 MVC ASP.NET Core 中创建视图模型类