ограничение максимального размера объекта javascript - PullRequest
34 голосов
/ 08 мая 2011

Я пытаюсь передать переменную JavaScript на серверную сторону, используя метод jquery.ajax.

Я пытаюсь создать строку json, но когда длина переменной достигает 10000, к строке больше не добавляются данные.

var jsonObj = '{"code":"' + code + '","defaultfile":"' + defaultfile + '","filename":"' + currentFile + '","lstResDef":[';
        $.each(keys, function(i, item) {
            i = i + 1;
            var value = $("#value" + i).val();
            var value = value.replace(/"/g, "\\\"");
            jsonObj = jsonObj + '{';
            jsonObj = jsonObj + '"Key":' + '"' + Encoder.htmlEncode($(this).html()) + '"' + "," + '"Value"' + ':' + '"' + Encoder.htmlEncode(value) + '"';
            jsonObj = jsonObj + '},';
            alert(jsonObj);             
        });          

        jsonObj = jsonObj + ']}';

Здесь, когда длина символа переменной jsonObj равна 10000, следующие значения не добавляются.

Похоже, в этом есть какой-то предел.

Ответы [ 3 ]

65 голосов
/ 08 мая 2011

Нет такого ограничения на длину строки. Чтобы быть уверенным, я только что протестировал, чтобы создать строку, содержащую 60 мегабайт.

Возможно, проблема в том, что вы отправляете данные в запросе GET, поэтому они отправляются в URL. Разные браузеры имеют разные ограничения для URL, где IE имеет самый низкий предел около 2 КБ. В целях безопасности никогда не следует отправлять в запросе GET больше данных, чем около килобайта.

Чтобы отправить столько данных, вы должны отправить их в виде запроса POST. В браузере нет жесткого ограничения на размер сообщения, но на сервере есть ограничение на размер запроса. Например, IIS имеет ограничение по умолчанию 4 МБ, но можно настроить ограничение, если вам когда-нибудь потребуется отправить больше данных, чем это.

Кроме того, вы не должны использовать + = для объединения длинных строк. Для каждой итерации необходимо перемещать все больше и больше данных, поэтому чем больше элементов у вас, тем медленнее и медленнее. Поместите строки в массив и объедините все элементы сразу:

var items = $.map(keys, function(item, i) {
  var value = $("#value" + (i+1)).val().replace(/"/g, "\\\"");
  return
    '{"Key":' + '"' + Encoder.htmlEncode($(this).html()) + '"' + ",'+
    '" + '"Value"' + ':' + '"' + Encoder.htmlEncode(value) + '"}';
});
var jsonObj =
  '{"code":"' + code + '",'+
  '"defaultfile":"' + defaultfile + '",'+
  '"filename":"' + currentFile + '",'+
  '"lstResDef":[' + items.join(',') + ']}';
8 голосов
/ 08 мая 2011

Шаг 1 - сначала определить, в чем проблема. Ваш заголовок и большая часть вашего вопроса, кажется, указывают на то, что вы сталкиваетесь с довольно небольшим ограничением длины строки в JavaScript / в браузерах, невероятно низким. Вы не. Рассмотрим:

var str;

document.getElementById('theButton').onclick = function() {
  var build, counter;

  if (!str) {
    str = "0123456789";
    build = [];
    for (counter = 0; counter < 900; ++counter) {
      build.push(str);
    }
    str = build.join("");
  }
  else {
    str += str;
  }
  display("str.length = " + str.length);
};

Живая копия

Повторное нажатие на соответствующую кнопку увеличивает длину строки. С Chrome, Firefox, Opera, Safari и IE у меня не было проблем со строками длиной более миллиона символов:

str.length = 9000
str.length = 18000
str.length = 36000
str.length = 72000
str.length = 144000
str.length = 288000
str.length = 576000
str.length = 1152000
str.length = 2304000
str.length = 4608000
str.length = 9216000
str.length = 18432000

... и я вполне уверен, что смогу получить лот выше этого.

Так что это никак не связано с ограничением длины в JavaScript. Вы не указали свой код для отправки данных на сервер, но, скорее всего, вы используете GET, что означает, что вы работаете в пределе длины GET-запроса, потому что в запрос вводятся параметры GET строка. Подробности здесь .

Вам нужно переключиться на использование POST. В запросе POST данные находятся в теле запроса, а не в URL, и могут быть очень и очень большими.

0 голосов
/ 08 мая 2011

Вы должны поместить это в web.config:

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