Максимальный размер объекта javascript
Я пытаюсь передать переменную 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 + ']}';
Здесь, когда длина символа var jsonObj равна 10000, следующие значения не добавляются.
Похоже, что есть некоторый предел.
Ответы
Ответ 1
Нет такого предела для длины строки. Чтобы быть уверенным, я просто тестировал создание строки, содержащей 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(',') + ']}';
Ответ 2
Шаг 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-адресе, и могут быть очень и очень большими.
Ответ 3
вы должны поместить это в web.config:
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="50000000" />
</webServices>
</scripting>
</system.web.extensions>