【问题标题】:Is it any limit for POST data size in Ajax?Ajax 中的 POST 数据大小是否有限制?
【发布时间】:2013-12-13 12:21:42
【问题描述】:

我正在尝试使用 jQuery Ajax 将一组数据从我的页面发送到 MVC 操作。这是我的 jQuery 代码:

$('#btnSave').click(
  function () {
    result = [];
    $('#tblMatters tbody tr.mattersRow').each(function () {
      if (!($(this).hasClass('warning'))) {
        var item = {};
        if ($(this).find('td.qbmatter > div.dropdown').length > 0) {
          item.QBDescription = $(this).find('td.qbmatter > div.dropdown > a').text();
        } else {
          item.QBDescription = $(this).find('td.qbmatter').text();
        }
        var id = $(this).find("td:first > a").text();
        item.Narrative = $("#collapse" + id).find("div.scrollCell").text();
        item.WorkDate = $(this).find('td.workDate').text();
        item.Hours = $(this).find('td.hours').text();
        item.Person = $(this).find('td.person').text();
        if ($(this).find('td.rate > div.dropdown').length > 0) {
          item.Rate = $(this).find('td.rate > div.dropdown > a').text();
        } else {
          item.Rate = $(this).find('td.rate').text();
        }
        item.Amount = $(this).find('td.amount').text();
        result.push(item);
      }
    });
    var originalRecords = $("#tblSummary tr.summaryTotalRow td.summaryOriginalRecords").text();
    var originalHours = $("#tblSummary tr.summaryTotalRow td.summaryOriginalHours").text();
    var excludedHours = $("#tblSummary tr.summaryTotalRow td.summaryExcludedHours").text();
    var totalHours = $("#tblSummary tr.summaryTotalRow td.summaryTotalHours").text();
    $.ajax({
      url: "/Home/SaveQBMatter",
      type: "POST",
      data: JSON.stringify({ 'Matters': result, 'originalRecords': originalRecords, 'originalHours': originalHours, 'excludedHours': excludedHours, 'totalHours': totalHours }),
      dataType: "json",
      traditional: true,
      contentType: "application/json; charset=utf-8",
      success: function (data) {
        if (data.status == "Success") {
          alert("Success!");
          var url = '@Url.Action("Index", "Home")';
          window.location.href = url;
        } else {
          alert("Error On the DB Level!");
        }
      },
      error: function () {
        alert("An error has occured!!!");
      }
    });
});

让我稍微解释一下。我有一个动态构建的 HTML 表,我需要将这些数据存储到数据库中。在 jQuery 中,我有一个循环遍历表,并将每一行的数据存储在 result 数组中。然后我使用 Ajax 将这些数据传递给 MVC Action。

这就是我的问题开始的地方......我意识到有时它应该是这样,但有时我从 Ajax alert("An error has occured!!!"); 收到错误现在我已经明白这个错误发生在我的result 数组越来越大。例如:如果它包含 100-150 项 > 一切都很好,但是当超过 ~150 项时 > 错误。

Ajax 中是否有任何 POST 限制?如何为任何尺寸设置它?我真的需要这个功能!请帮忙!

我的 ActionResult 代码:

public ActionResult SaveQBMatter(QBMatter[] Matters, string originalRecords, string originalHours, string excludedHours, string totalHours) {
  DBAccess dba = new DBAccess();
  int QBMatterID = 0;
  int exportedFileID = 0;
  foreach (QBMatter qb in Matters) {
    dba.InsertQBMatter(qb.QBDescription, qb.Narrative, qb.WorkDate, qb.Person, qb.Hours, qb.Rate, qb.Amount, ref QBMatterID);
  }
  ExcelTranslator translator = new ExcelTranslator();
  translator.CreateExcelFile("", Matters, originalRecords, originalHours, excludedHours, totalHours);
  return Json(new { status = "Success", message = "Passed" });
}

更新:找到解决方案

JSON 有一个最大长度!我需要增加这个值。在 web.config 中添加以下内容:

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

【问题讨论】:

  • 错误的原因是别的。使用 firebug / 使用 Visual Studio 断点来查看您的真正问题是什么
  • 您至少需要来自调试警报/开发工具的返回码
  • 伙计们..拜托。我仍然需要帮助!
  • 我发现了问题!如果这篇文章对某人有帮助,任何赞成票都将不胜感激! =)
  • @Bryuk 你可以回答你自己的帖子。

标签: javascript jquery ajax asp.net-mvc


【解决方案1】:

JSON 有一个最大长度!我需要增加这个值。在 web.config 中添加以下内容:

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

【讨论】:

  • 它已经在我的网络配置中,但是当我将 json 数据传递给控制器​​时,仍然出现超出长度的错误。我正在传递超过 600 个长度的列表。
  • 已经有更大的价值了。它是 2147483647 但仍然出现错误。
【解决方案2】:

Ajax 中有 POST 限制吗?

不,HTTP 规范没有对帖子施加特定的大小限制。但是,这取决于您使用的 Web 服务器或用于处理表单提交的编程技术。

在 ASP.NET MVC 中你可以试试这个:

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

【讨论】:

  • 那么问题的原因是什么?
  • @Bryuk:- 真的很难说出原因,因为可能有很多原因。我建议您使用任何调试器来检查实际问题,但是按照您的标题行,Ajax 中的 POST 没有这样的限制
  • @Bryuk:- 我不知道这是否对你有用,但一旦我收到相同的 POST 500 内部服务器错误并从 POST 更改为 GET 对我有用。你能在你写的地方试试 type:'POST'
  • 我刚刚尝试将 POST 更改为 GET,在这种情况下,我在 Action = null 中获取了所有数据...
  • 我花了很多时间在这和研究上,发现即使在 web config 设置之后,如果存在问题,它可能不是 json 的实际长度,但这个错误是一般的,也涵盖了已达到 JSON 嵌套对象长度的最大限制。
【解决方案3】:

HTTP 规范没有定义 POST 数据大小的限制。

但是使用 ASP.NET MVC,可能会有 POST 数据限制,请尝试在您的 Web.Config 文件中增加它:

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

来自MSDN

指定请求中内容的最大长度,以字节为单位。这 默认值为 30000000。

【讨论】:

  • 反正我得到一个错误,我什至没有进入动作,所以它是 100% ajax...
【解决方案4】:

这解决了我的问题:

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

【讨论】:

    【解决方案5】:

    如果存在客户端限制,那么它将是特定于浏览器的,但 HTTP 规范没有定义 POST 数据大小的限制。

    请记住,POST 只是网络上的字节,因此您发布的字段越多,上传该数据所需的时间就越长。

    如果使用传统的表单提交,1MB 的 POST 会让用户感觉表单损坏且无响应。

    如果serialize() 有很多字段,那么 AJAX 可能会在收集所有数据时挂起浏览器。我认为浏览器确实对 JavaScript 有内存限制,所以如果你达到这个限制,那么 AJAX 进程就会失败。

    // wanna have some fun?
    var html = '<div></div>';
    
    for(var i = 0; i < 1000000; i++){
        html += html;
    }
    

    最好的办法是增加服务器端允许的最大 POST 大小以避免出现问题。

    当人们制作的上传脚本似乎只是挂起时,最常见的问题会出现,而用户却很困惑为什么他们的 3MB 图片在 125KB/s 的上传链接上变慢了。

    【讨论】:

    • “你最好的办法是增加服务器端允许的最大 POST 大小” - 你能帮忙吗=)我真的需要这个......
    • 不幸的是,我是一名 PHP 开发人员,所以 Yair Nevet 或 Rahul Tripathi 的帖子是您最好的选择。老实说,我怀疑 POST 的大小是你的问题。您的 AJAX 调用可能存在许多错误或格式错误。如果可能,我建议发布包含在您的 /Home/SaveQBMatter 页面上的代码,因为 500 错误表示服务器存在问题。
    • 如果您想看一个使用 PHP 的超级基本和彻底的 AJAX 示例,请在此处访问我的答案:stackoverflow.com/questions/20150130/…
    【解决方案6】:

    限制是通过服务器“max_post_size”或类似命名设置的。一篇文章中典型的默认服务器设置为 2-8 MB。

    在客户端,只有GET有最大限制,一般认为是1500字节(从请求头减去30-150),原因是更底层网络硬件中的MTU

    【讨论】:

      【解决方案7】:

      在我的情况下,我发布的课程在属性上有“内部设置”。

      改变:

      public EnabledDataBundle EnabledDataBundle { get; internal set; }
      

      到:

      public EnabledDataBundle EnabledDataBundle { get; set; }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 2010-12-27
        • 2013-01-18
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多