web-dev-qa-db-fra.com

Est-ce une limite pour POST taille des données en Ajax?

J'essaie d'envoyer un tableau de données de ma page à l'action MVC à l'aide de jQuery Ajax. Voici mon code 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!!!");
      }
    });
});

Laissez-moi vous expliquer un peu. J'ai un tableau HTML qui a été construit de manière dynamique et j'ai besoin de stocker ces données dans une base de données. Dans jQuery, une boucle traverse la table et je stocke les données de chaque ligne du tableau result. Ensuite, je passe ces données en utilisant Ajax dans Action MVC.

Et voici où mon problème commence ... J'ai réalisé que parfois cela fonctionne comme il se doit, mais parfois je reçois une erreur d'Ajax alert("An error has occured!!!"); Maintenant, j'ai compris que cette erreur se produit lorsque mon tableau result devient grand . Par exemple: s'il contient 100 à 150 éléments> tout va bien, mais lorsqu'il y a plus de ~ 150> Erreur.

Existe-t-il une limite POST dans Ajax? Comment puis-je le configurer pour toutes les tailles? J'ai vraiment besoin de cette fonctionnalité! Toute aide s'il vous plaît!

Mon code 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" });
}

MISE À JOUR: Solution trouvée

JSON a une longueur maximale! J'ai besoin d'augmenter cette valeur. Dans web.config, ajoutez ce qui suit:

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

JSON a une longueur maximale! J'ai besoin d'augmenter cette valeur. Dans web.config, ajoutez ce qui suit:

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

Est-ce une limite POST dans Ajax?

Non, la spécification HTTP n'impose pas de limite de taille spécifique pour les publications. Toutefois, cela dépend du serveur Web que vous utilisez ou de la technologie de programmation utilisée pour traiter la soumission du formulaire.

Dans ASP.NET MVC, vous pouvez essayer ceci:

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

La spécification HTTP ne définit pas une limitation de la taille des données POST.

Mais en utilisant ASP.NET MVC, il y a pourrait une limitation de données POST, essayez de l'augmenter dans votre fichier Web.Config:

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

De MSDN :

Spécifie la longueur maximale du contenu dans une demande, en octets. Le La valeur par défaut est 30000000.

3
Yair Nevet

SIil existe une limite côté client, celle-ci sera spécifique au navigateur, mais la spécification HTTP ne définit pas une limitation de la taille des données POST.

N'oubliez pas qu'un POST] est simplement un octet sur le réseau. Par conséquent, plus le nombre de champs que vous publiez est long, plus le chargement de ces données peut être long.

Un POST de 1 Mo donnera à l'utilisateur l'impression que le formulaire est cassé et ne répond pas s'il utilise un formulaire traditionnel de soumission.

S'il y a beaucoup de champs pour serialize(), alors AJAX peut raccrocher le navigateur pendant qu'il collecte toutes les données. Je pense que les navigateurs ont une limite de mémoire générale pour JavaScript. Par conséquent, si vous atteignez cette limite, le processus AJAX échouera.

// wanna have some fun?
var html = '<div></div>';

for(var i = 0; i < 1000000; i++){
    html += html;
}

La meilleure solution consiste à augmenter la taille maximale autorisée POST sur le serveur pour éviter les problèmes.

Le plus souvent, des problèmes surviennent lorsque les utilisateurs créent un script de téléchargement qui semble simplement s’arrêter, alors que l’utilisateur ne comprend pas pourquoi leurs images de 3 Mo ralentissent sur un lien de téléchargement de 125 Ko/s.

1
MonkeyZeus

La limite est définie via un serveur 'max_post_size' ou une dénomination similaire. Les paramètres de serveur par défaut typiques sont 2 à 8 Mo dans une publication.

Côté client, seul GET a une limite maximale, généralement considérée comme 1 500 octets (moins 30 à 150 à partir des en-têtes de requête) et la raison en est le MTU dans le matériel réseau de niveau inférieur

0
mschr

Cela a résolu mon problème:

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