【问题标题】:javascript object max size limitjavascript对象最大大小限制
【发布时间】:2011-05-08 07:40:44
【问题描述】:

我正在尝试使用 jquery.ajax 方法将 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 时,不附加后面的值。

这似乎有一些限制。

【问题讨论】:

    标签: javascript variable-length


    【解决方案1】:

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

    问题可能是您在 GET 请求中发送数据,所以它是在 URL 中发送的。不同的浏览器对 URL 有不同的限制,其中 IE 的最低限制约为 2 kB。为安全起见,您在 GET 请求中发送的数据绝不应超过 1 KB。

    要发送这么多数据,您必须改为在 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(',') + ']}';
    

    【讨论】:

    • 谢谢@Guffa!这不仅对解决问题有很大帮助..也获得了一些有用的见解..
    • +1 - 没有意识到 += 的性能不如数组 .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);
    };
    

    Live copy

    反复单击相关按钮会使字符串变长。使用 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 参数已放入查询中细绳。 Details here.

    您需要改用POST。在POST 请求中,数据在请求的正文中而不是在 URL 中,并且确实可以非常非常大。

    【讨论】:

      【解决方案3】:

      你必须把它放在 web.config 中:

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

      【讨论】:

      • 因为大家都用IIS?
      • 就此而言,IIS 上的默认最大大小无论如何都是 4MB。而不是大于 9,000 字节和变化。
      • 默认为 2097152 个字符,因此在这种情况下不能成为限制因素。 msdn.microsoft.com/en-us/library/…
      猜你喜欢
      • 1970-01-01
      • 2016-09-17
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多