Ajax中POST数据大小有限制吗?

23

我正试图使用jQuery Ajax将数据数组从我的页面发送到MVC Action。以下是我的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断点来查看您真正的问题是什么。 - Shyju
您需要从调试警告/开发工具中获得返回代码,至少这一点是必需的。 - mschr
1
各位,请帮帮忙!我还需要帮助! - Bryuk
我找到了问题所在!如果这篇文章能帮助到某人,任何赞都将不胜感激!=) - Bryuk
@Bryuk 你可以回答自己的帖子。 - Aycan Yaşıt
显示剩余2条评论
7个回答

32

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

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

已经在我的Web配置文件中了,但是当我将JSON数据传递给控制器时仍然出现长度超过的错误。我正在传递超过600个列表长度。 - SPnL
已经有一个更大的值了。它是 _2147483647_,但仍然出现错误。 - SPnL

5

在Ajax中有任何POST限制吗?

不,HTTP规范没有为POST请求强制设定特定的大小限制。但是,这取决于您使用的Web服务器或处理表单提交的编程技术。

在ASP.NET MVC中,您可以尝试以下操作:

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

那么问题的原因可能是什么? - Bryuk
@Bryuk:实际上很难确定原因,可能有很多原因。我建议您使用任何调试器来检查实际问题,但根据您的标题行,Ajax中没有这样的POST限制。 - Rahul Tripathi
@Bryuk:我不知道那对你是否有效,但是我曾经收到过相同的POST 500内部服务器错误,将其从POST更改为GET对我有用。你可以尝试一下,在你写的type:'POST'处改成type:'GET'。 - Rahul Tripathi
我刚尝试将POST更改为GET,结果我的Action = null中获取了所有数据... - Bryuk
我花了很多时间和精力进行研究,发现即使在 web config 设置之后,如果问题仍然存在,那么这个错误可能并不是 JSON 的实际长度,而是一般性的覆盖了 JSON 嵌套对象长度达到最大限制的错误。 - Casey ScriptFu Pharr

4
HTTP规范没有定义POST数据大小的限制。但是,在使用ASP.NET MVC时,可能存在POST数据限制,请尝试在Web.Config文件中增加它:
<system.webServer>
<security>
    <requestFiltering>
        <requestLimits maxAllowedContentLength="1000000" />
    </requestFiltering>
</security>

来自MSDN

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


无论如何,我遇到了一个错误,甚至没有进入操作,所以这是100%的ajax... - Bryuk

3
这个解决了我的问题:
<system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647" />
        </webServices>
    </scripting>
</system.web.extensions>

1
如果存在客户端限制,那么它将取决于浏览器,但HTTP规范并未定义POST数据大小的限制。请记住,POST只是网络上传输的字节数,因此您发布的字段越多,上传数据所需的时间就越长。如果使用传统表单提交方式,1MB的POST会让用户感觉表单已经损坏且无响应。如果要对大量字段进行序列化,则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 最大大小。你需要我帮忙吗?我真的很需要这个... - Bryuk
很遗憾,我是一名PHP开发人员,所以Yair Nevet或Rahul Tripathi的帖子可能是您最好的选择。老实说,我怀疑POST大小不是您的问题。您的AJAX调用可能存在许多错误或格式不正确的问题。如果可能的话,我建议您发布包含在“/Home/SaveQBMatter”页面上的代码,因为500错误指的是服务器出现问题。 - MonkeyZeus
如果您想查看一个超级基本和详尽的带有PHP的AJAX示例,请访问我在这里的答案:http://stackoverflow.com/questions/20150130/ajax-and-php-to-enter-multiple-forms-input-to-database/20150474#20150474 - MonkeyZeus

0
在我的情况下,我要发布的类别上的属性有“内部设置”。
更改:
public EnabledDataBundle EnabledDataBundle { get; internal set; }

to:

public EnabledDataBundle EnabledDataBundle { get; set; }

0

限制是通过服务器的'max_post_size'或类似命名来设置的。典型的默认服务器设置为一个帖子2-8 MB。

在客户端方面,只有GET有最大限制,通常被认为是1500字节(减去请求头中的30-150),原因是更低级别的网络硬件中的MTU。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接