69 messaggi dal 19 febbraio 2010
Ciao a tutti,
sto sviluppando una pagina web con dei grafici in javascript utilizzando la libreria highstock e mi trovo davanti ad un problema che non riesco a risolvere.

Ho una mole di dati molto pesante, si parla di milioni di dati, da passare a js in formato stringa in questo modo:

ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(),"UpdatePanel_PreRender", test, false); 


dove test è la mia stringa costruita cosi:

 test= "<script language='javascript'>DisegnaGrafici(" + StringaGrafico + ");</script>";


e DisegnaGrafici è la mia funzione js che crea il grafico e StringaGrafico la string contenente tutte le accoppiate [data,valore].

L'errore che mi genera la pagina è il seguente:

System.InvalidOperationException: Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property. at
System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, StringBuilder output, SerializationFormat serializationFormat) at 
System.Web.UI.ScriptRegistrationManager.WriteScriptWithTags(HtmlTextWriter writer, String token, RegisteredScript activeRegistration) at 
System.Web.UI.ScriptRegistrationManager.RenderActiveScriptBlocks(List`1 updatePanels, HtmlTextWriter writer, String token, List`1 scriptRegistrations) at 
System.Web.UI.ScriptRegistrationManager.RenderActiveScripts(List`1 updatePanels, HtmlTextWriter writer) at 
System.Web.UI.PageRequestManager.ProcessScriptRegistration(HtmlTextWriter writer) at 
System.Web.UI.PageRequestManager.RenderPageCallback(HtmlTextWriter writer, Control pageControl) at
System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) at
System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) at 
System.Web.UI.Page.Render(HtmlTextWriter writer) at 
System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) at
System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) at 
System.Web.UI.Control.RenderControl(HtmlTextWriter writer) at
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


Ho provato due soluzioni trovate sul web ma nessuna delle due riesce a farmi alzare il limite di default del MaxJsonLength.

Soluzione 1: nel web.config ho inserito questo pezzo di codice

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


Soluzione 2: nella pagina .cs ho inserito questo pezzo di codice

using System.Web.Script.Serialization.JavaScriptSerializer;

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



Qualcuno riesce ad aiutarmi ad alzare questo limite max di default, che dovrebbe essere se non sbaglio 2097152.

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

Gigiot ha scritto:

Ho una mole di dati molto pesante, si parla di milioni di dati,

Cerca di fare una campionatura dei dati, non è il caso di inviare così tanti valori al client. Una risoluzione così elevata non è necessaria perché comunque l'utente non riuscirebbe a percepire la differenza nel grafico tra un'approssimazione e il tracciato esatto.

In questo modo la pagina sarà molto più leggera, responsiva e non incapperai nel limite della lunghezza del JSON.

ciao,
Moreno
Modificato da BrightSoul il 06 novembre 2013 23.42 -

Enjoy learning and just keep making
69 messaggi dal 19 febbraio 2010
Ciao Moreno,
grazie mille per la risposta.

è un idea a cui avevo pensato ma la libreria highstock è in grado di far automaticamente una campionatura dei valori, ma allo stesso tempo ti permette di zommare il grafico fino ad arrivare al dato al secondo (tutto lato client).

Questa cosa nel mio caso è molto utile perchè l'operatore vuol arrivare a vedere il valore al secondo, ma vuol vedere allo stesso tempo due mesi di valori per vedere l'andamento approssimativo del trend o dei vari trends.

Per quello mi serve aumentare questo limite del JSON, ma non so proprio che strada prendere, le due suggerite dal web sono risultate non funzionanti nel mio caso.

Grazie ancora
Gigiot
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Gigiot,

devi intendere il MaxJsonLength come una sorta di protezione che ti invita a realizzare una pagina con una migliore user experience.

Se anche riuscissi a caricare milioni di valori, la pagina risulterebbe enormemente appesantita. Highstock, che è una libreria javascript, farebbe più fatica a ridisegnare il grafico ogni volta che l'utente cambia la selezione o fa lo zoom.

Gigiot ha scritto:

l'operatore vuol arrivare a vedere il valore al secondo

Benissimo, e noi vogliamo soddisfare questa sua esigenza, ma non scaricandogli addosso tutta quella mole di dati solo perché potrebbe aver bisogno di leggere qualcuno di quei valori.

Invece, dobbiamo fare in modo che Highstock interroghi il server ogni volta che l'utente fa qualche cambiamento.La libreria comunicherà al server sia il range che il livello di zoom, e ne otterrà indietro al massimo un centinaio di valori rappresentativi di quell'intervallo.

Perdonami, purtroppo non riesco a fornirti un esempio di codice funzionante. Leggendo la documentazione penso che si debba procedere in questo modo:
  • Nella pagina non usi RegisterClientScriptBlock. I valori verranno caricati via ajax da un'altra pagina predisposta allo scopo o, meglio, da un HttpHandler che restituirà del JSON puro.
  • Invocare la funzione javascript highcharts per predisporre il grafico. Mediante le opzioni di questa funzione, gestisci l'evento redraw con una tua funzione.
  • L'evento redraw si verificherà ogni qualvolta l'utente cambia la visualizzazione del grafico, cioè quando fa lo zoom, sposta una delle maniglie o fa scorrere la barra. In questo caso usa il metodo showLoading per mettere in attesa l'utente durante la richiesta ajax che ti serve ad ottenere i nuovi dati. Il server restituirà solo un centinaio di valori e dunque questa operazione sarà abbastanza rapida.
  • Quando hai ottenuto i nuovi dati, dalli in pasto al grafico affinché li disegni e poi invoca il metodo hideLoading


Nella documentazione trovi il link ad un esempio per ogni membro di HighStock. Prova a seguire quelli, ti daranno un grosso aiuto.

ciao,
Moreno

Enjoy learning and just keep making
69 messaggi dal 19 febbraio 2010
Grazie del consiglio Moreno, proverò a fare cosi.

Appena ho sviluppato la pagina ti farò sapere.

Grazie
Gigio
11.886 messaggi dal 09 febbraio 2002
Contributi
Benone, buon lavoro! Se dovessi trovare intoppi prova a postare del codice.

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.