2011-05-08 93 views
33

我想通过使用jquery.ajax方法将JavaScript变量传递给服务器端。JavaScript对象最大大小限制

我想创建一个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,以下,该值不追加。

看起来似乎有一些限制。

回答

59

字符串长度没有这样的限制。为了确定,我只是测试创建一个包含60兆字节的字符串。

问题很可能是您正在发送GET请求中的数据,因此它是通过URL发送的。不同的浏览器对URL的限制不同,其中IE的最低限度约为2 kB。为了安全起见,您绝对不应该在GET请求中发送比千字节更多的数据。

要发送那么多的数据,您必须将其发送到POST请求中。浏览器对帖子大小没有硬性限制,但服务器对请求的大小有限制。例如,IIS的默认限制为4 MB,但如果您需要发送更多数据,则可以调整限制。

此外,您不应该使用+ =连接长字符串。对于每次迭代,都有越来越多的数据要移动,所以越多越容易越慢。将字符串放在一个数组中,并一次串接所有项目:

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(',') + ']}'; 
+0

谢谢@Guffa!这不仅仅帮助解决了这个问题..也提供了一些有用的见解。 – Paras 2011-05-08 11:19:48

+6

+1 - 没有意识到'+ ='的性能低于数组'.join()' – 2012-08-25 09:34:14

-9

你必须把这个在web.config中:

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

因为每个人都使用IIS? – 2011-05-08 08:03:32

+1

对于这个问题,无论如何,IIS上的默认最大大小大约是4MB。大于9,000字节并且改变。 – 2011-05-08 08:18:17

+0

默认值为2097152个字符,所以在这种情况下它不能成为限制因素。 http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.maxjsonlength.aspx – Guffa 2011-05-08 08:37:43

7

第一步永远是先确定问题所在。你的标题和你的大部分问题似乎都表明,你在JavaScript /浏览器中的字符串长度上受到的长度限制很低,这是一个不可思议的下限。你不是。试想一下:

var str; 

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

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

Live copy

反复点击相关按钮保持使串长。超过一百万有了Chrome,火狐,歌剧,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参数被放入查询字符串中。 Details here。您需要改用POST代替。在POST请求中,数据位于请求的正文中,而不是URL中,确实可能非常非常大。