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

我正在尝试使用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!!!");得到一个错误alert("An error has occured!!!"); 现在我已经明白,当我的result数组变大时会发生这个错误。 例如:如果它包含100-150个项目>一切都很好,但是当有超过150个>错误时。

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

我的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中添加以下内容:

    

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

    

它是Ajax中的任何POST限制吗?

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

在ASP.NET MVC中,您可以尝试这样做:

       

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

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

       

来自MSDN :

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

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

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

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

如果有很多字段要serialize()那么AJAX可以在收集所有数据时挂起浏览器。 我认为浏览器确实对JavaScript整体有内存限制,因此如果达到该限制,则AJAX进程将失败。

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

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

最常见的问题出现在人们制作上传脚本时,如果用户感到困惑,他们为什么他们的3MB图片在125KB / s的上传链接上变慢,那么就会出现问题。

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

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