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

时间:2013-11-27 17:51:11

标签: javascript jquery ajax asp.net-mvc

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

6 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分:3)

  

是Ajax中的任何POST限制吗?

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

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

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

答案 2 :(得分:3)

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

但是使用ASP.NET MVC,可以成为POST数据限制,尝试在Web.Config文件中增加它:

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

来自MSDN

  

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

答案 3 :(得分:1)

IF 存在客户端限制,然后是浏览器特定的,但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的上传链接上运行速度很慢。

答案 4 :(得分:1)

这解决了我的问题:

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

答案 5 :(得分:0)

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

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