2011-05-08 18 views
33

Estoy tratando de pasar una variable de JavaScript a la parte del servidor utilizando el método jquery.ajax.javascript object límite de tamaño máximo

Estoy tratando de crear una cadena json, pero cuando la longitud de la variable llega a 10000, no se añaden más datos a la cadena.

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 + ']}'; 

Aquí, cuando la longitud de caracteres de la var jsonObj es 10000, los siguientes valores que no se adjunta.

Parece que hay un límite al respecto.

Respuesta

59

No existe tal límite en la longitud de la cadena. Para estar seguro, acabo de probar para crear una cadena que contenga 60 megabytes.

Es probable que esté enviando los datos en una solicitud GET, por lo que se envía en la URL. Los diferentes navegadores tienen diferentes límites para la URL, donde IE tiene la limitación más baja de alrededor de 2 kB. Para estar seguro, nunca debe enviar más datos de aproximadamente un kilobyte en una solicitud GET.

Para enviar esa cantidad de datos, debe enviarlos en una solicitud POST. El navegador no tiene un límite estricto en el tamaño de una publicación, pero el servidor tiene un límite en la cantidad de solicitudes. IIS, por ejemplo, tiene un límite predeterminado de 4 MB, pero es posible ajustar el límite si alguna vez necesita enviar más datos que eso.

Además, no debe usar + = para concatenar cadenas largas. Para cada iteración hay más y más datos para mover, por lo que cada vez se vuelven más y más lentos. Coloque las cadenas en una matriz y concatene todos los elementos a la vez:

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

Gracias @Guffa! eso ayudó mucho no solo con el problema ... también obtuvo algunas ideas útiles. – Paras

+6

+1 - no se dio cuenta de que '+ =' era menos eficiente que una matriz '.join()' –

-9

usted tiene que poner esto en web.config:

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

¿Porque todos usan IIS? –

+1

Y para el caso, el tamaño máximo predeterminado en IIS es algo así como 4 MB de todos modos. Bastante más grande que 9,000 bytes y cambio. –

+0

El valor predeterminado es 2097152 caracteres, por lo que no puede ser el factor limitante en este caso. http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.maxjsonlength.aspx – Guffa

7

Paso 1 siempre es primero determinar dónde reside el problema. Su título y la mayor parte de su pregunta parecen sugerir que se encuentra con un límite de longitud bastante bajo en la longitud de una cadena en JavaScript/en navegadores, un límite increíblemente bajo. Tu no eres. Consideremos:

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

repetidamente clic en el botón correspondiente sigue haciendo la cadena más larga. Con Chrome, Firefox, Opera, Safari e IE, he tenido ningún problema con las cadenas de más de un millón de caracteres:

 
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

... y estoy bastante seguro de que podría ahora mucho más alto que eso.

No tiene nada que ver con un límite de longitud en JavaScript. No ha mostrado su código para enviar los datos al servidor, pero lo más probable es que esté usando GET, lo que significa que se está ejecutando dentro del límite de longitud de una solicitud GET, porque los parámetros GET se ponen en la cadena de consulta. Details here.

Necesita cambiar a usar POST en su lugar. En una solicitud POST, los datos están en el cuerpo de la solicitud en lugar de en la URL, y pueden ser muy, muy grandes.

Cuestiones relacionadas