2009-06-25 4 views
15

Ho una grande quantità di dati che sto inviando al client usando la funzione $ .ajax() di jQuery. Sto chiamando un metodo in un servizio Web ASP.NET che restituisce i dati JSON. Tutto è perfetto per la maggior parte delle ricerche, ma quando ho un grande set di dati da restituire mi imbatto in un problema con la proprietà MaxJsonLength di JavaScriptSerializer. Qual è la migliore pratica per gestirlo? Non voglio solo impostare arbitrariamente una lunghezza massima. Posso impostare MaxJsonLength nel servizio Web se i dati che vengono restituiti sono maggiori del massimo corrente o dovrei riscrivere e inviare mandrini di dati al client?JavaScriptSerializer.MaxJsonLength superato. Qual è la migliore pratica per gestirlo?

Ecco il frammento di rilevante dal servizio web:

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

risposta

32

L'unico modo per impostare la lunghezza massima per i metodi web che sono chiamato da script client è attraverso il file web.config (qui di seguito). Qual è il problema con l'impostazione di questo? Lo farei ogni volta su più chiamate xhr per lo streaming di parti dei dati.

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

UPDATE: la dimensione predefinita è 2097152 che equivale a 4 MB di dati di stringa Unicode. Invierai davvero tanti dati al cliente? Se è così e hai bisogno di guardare il design dell'app perché l'esperienza utente sarà lenta e ingombrante.

+1

Non ho problemi a impostare una lunghezza massima in web.config. Mi stavo chiedendo se questa è la migliore pratica. Voglio proteggermi dai casi in cui potrebbero esserci più dati della lunghezza massima specificata. –

+0

ah la tua domanda ha dichiarato "Non voglio impostare solo arbitrariamente una lunghezza massima" che presumo tu intendessi nel web.config. – redsquare

+0

Ci scusiamo per la confusione. Non conosco la dimensione massima che potrebbero essere i miei dati. Penso che cercherò di non usare l'oggetto JavascriptSerializer. –

5

Il valore massimo per questa proprietà è 2147483647 secondo this forum post.

Non ho speso alcun tempo per ottimizzare i dati che restituisco, tuttavia (lo farò prima che qualcuno lo veda) - ma con questo valore impostato, IE ha iniziato a darmi lo "script che sta prendendo una pagina" messaggio "troppo a lungo vuoi ucciderlo".

Una soluzione sarebbe quella di dividere i dati - qualcuno sa di un bel modo per farlo (in jQuery idealmente)? Potrei semplicemente fare un'altra chiamata ajax nel gestore del successo, ovviamente.

10

2147483647 è il valore corretto da utilizzare. Proprio per evitare confusione nel codice è possibile usare qualcosa come

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

La lunghezza massima consentita è il valore massimo di un intero può contenere che risulta essere - 2147483647

0

aggiungere questo frammento di web.config:

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

e nel vostro codice C#:

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