2009-06-25 16 views
15

Tengo una gran cantidad de datos que estoy enviando al cliente usando la función $ .ajax() de jQuery. Estoy llamando a un método en un servicio web ASP.NET que devuelve los datos JSON. Todo es genial para la mayoría de las búsquedas, pero cuando tengo un gran conjunto de datos que devolver, me topa con un problema con la propiedad JavaScriptSerializer MaxJsonLength. ¿Cuál es la mejor práctica para manejar esto? No quiero simplemente establecer arbitrariamente una longitud máxima. ¿Puedo configurar MaxJsonLength en el servicio web si los datos que se devuelven son más grandes que el máximo actual o debo volver a escribir y enviar tiradas de datos al cliente?JavaScriptSerializer.MaxJsonLength excedido. ¿Cuál es la mejor práctica para manejar esto?

He aquí el fragmento relevante del servicio web:

Dictionary<string, object> jsonValuePairs = new Dictionary<string, object>(); 
//add some data to the dictionary... 
return System.Web.Script.Serialization.JavaScriptSerializer.Serialize(jsonValuePairs); 

Respuesta

32

La única forma de establecer la longitud máxima de los métodos web que se llama desde el script de cliente es a través del archivo web.config (abajo). ¿Cuál es su problema al configurar esto? Haría esto cada vez por múltiples llamadas xhr para transmitir partes de los datos.

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

ACTUALIZACIÓN: El tamaño predeterminado es de 2.097.152, lo que equivale a 4 MB de datos de cadena Unicode. ¿De verdad vas a enviar esa cantidad de datos al cliente? Si es así y probablemente deba mirar el diseño de la aplicación, la experiencia del usuario será lenta y engorrosa.

+1

No tengo problemas para establecer una longitud máxima en web.config. Me preguntaba si esta es la mejor práctica. Quiero protegerme de los casos en los que puede haber más datos que la longitud máxima que especifico. –

+0

ah su pregunta indicó "No quiero establecer arbitrariamente una longitud máxima", que supuse que quería decir en el web.config. – redsquare

+0

Perdón por la confusión. No sé el tamaño máximo de mis datos. Creo que investigaré el uso del objeto JavascriptSerializer. –

5

El valor máximo de esta propiedad es 2147483647 según this forum post.

No he perdido tiempo optimizando los datos que devuelvo, sin embargo (lo haré antes de que nadie lo vea) - pero con este valor establecido, IE ha comenzado dándome el 'un guión en la página está tomando demasiado tiempo quieres matarlo 'mensaje.

Una solución sería dividir los datos: ¿alguien sabe de una buena manera de hacerlo (en jQuery idealmente)? Podría hacer otra llamada ajax en el controlador de éxito, por supuesto.

10

2147483647 es el valor correcto para usar. Sólo para evitar confusiones en el código se puede usar algo como

var JsonSerializer = new JavaScriptSerializer(); 
JsonSerializer.MaxJsonLength = Int32.MaxValue; 
3

La longitud máxima permitida es el valor máximo de un entero puede sostener que pasa a ser - 2147483647

0

añadir este fragmento de web.config:

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

y en su código C#:

JavaScriptSerializer jss = new JavaScriptSerializer(); 
jss.MaxJsonLength = Int32.MaxValue; 
... 
... 
Cuestiones relacionadas