Ajax 中的 POST 数据大小是否有任何限制?

IT技术 javascript jquery ajax asp.net-mvc
2021-02-27 16:24:51

我正在尝试使用 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>
6个回答

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

<appSettings>
  <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>
它已经在我的网络配置中,但是当我将 json 数据传递给控制器​​时仍然出现超出长度的错误。我正在传递 600 多个长度的列表。
2021-04-19 16:24:51
已经有更大的value了。它是2147483647但仍然出现错误。
2021-05-03 16:24:51

Ajax 中是否有任何 POST 限制?

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

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

<system.webServer>
<security>
    <requestFiltering>
        <requestLimits maxAllowedContentLength="1000000" />
    </requestFiltering>
</security>
@Bryuk:- 我不知道这是否适合您,但是一旦我收到相同的 POST 500 内部服务器错误并且从 POST 更改为 GET 对我有用。你能试试你写的地方 type:'POST'
2021-04-27 16:24:51
@Bryuk:-实际上很难说出原因,因为可能有很多原因。我建议您使用任何调试器来检查实际问题,但是按照您的标题行,Ajax 中的 POST 没有这样的限制
2021-04-29 16:24:51
我只是尝试将 POST 更改为 GET,在这种情况下,我在 Action = null 中获取了所有数据...
2021-05-06 16:24:51
那么问题的原因可能是什么?
2021-05-12 16:24:51
我花了很多时间在这个和研究上,发现即使在 web 配置设置之后,如果存在问题,它可能不是 json 的实际长度,但是这个错误是普遍的,也涵盖了 JSON 嵌套对象长度达到的最大限制.
2021-05-13 16:24:51

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

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

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

MSDN

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

无论如何,我遇到了一个错误,我什至没有采取行动,所以它是 100% ajax ...
2021-05-05 16:24:51

这解决了我的问题:

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

如果有客户端限制,那么它将是特定于浏览器的,但 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 大小” - 你能帮忙吗=)我真的需要这个......
2021-04-29 16:24:51
如果你想看到一个超级基本和彻底的 PHP AJAX 示例,请访问我的答案:stackoverflow.com/questions/20150130/...
2021-05-06 16:24:51
不幸的是,我是一名 PHP 开发人员,所以 Yair Nevet 或 Rahul Tripathi 的帖子是您最好的选择。老实说,我怀疑 POST 大小是您的问题。您的 AJAX 调用可能存在许多错误或格式错误的问题。如果可能,我建议发布包含在您/Home/SaveQBMatter页面上的代码,因为 500 错误是指服务器出现问题。
2021-05-11 16:24:51