Ajax per una pagina di monitoring

Dopo l'interessante articolo di Andrea su Ajax mi sono posto la domanda su come questo approccio poteva aiutarmi nella creazione di una pagina web che deve visualizzare lo stato di alcuni job e che deve aggiornarsi periodicamente per mostrare la situazione corrente.

 

Il refresh della pagina web ogni x secondi è ovviamente facile, ma questo comporta un round-trip con il server che volevo evitare.

 

La soluzione è tanto semplice quanto efficiente.

 

Ho creato una classe che si occupa di verificare l'eventuale cambiamento di status di un job e di segnalare la necessità di ricaricare la pagina e l'ho decorata con l'AjaxMethodAttribute (ovviamente per brevità qui ho riportato solo una classe che legge il contenuto di un file di testo):

 

public sealed class VerifyStatus

{

      public VerifyStatus()

      {}

 

      [AjaxMethod()]

      public string IsNeedRefresh()

      {

            string esito;

 

            using (System.IO.StreamReader sr = new System.IO.StreamReader(HttpContext.Current.Server.MapPath("TextFile1.txt")) )

            {

                  string line = sr.ReadLine();

                  if (line == "1")

                        esito = "si";

                  else

                        esito = "no";

            }

     

            return esito;

                 

      }

}

 

Ho poi creato il proxy per Ajax nell'evento load della pagina:

 

private void Page_Load(object sender, System.EventArgs e)

{

      // Solo per verificare i reload della pagina

      Response.Write(System.DateTime.Now.ToString());

      // Crea il proxy Ajax

      Utility.RegisterTypeForAjax(typeof(VerifyStatus));

}

 

 

Ho creato una funzione jscript nella pagina web che si occupa di interrogare la classe che effettua la verifica degli stati:

 

function EvaluateRefresh()

{

      var esito = VerifyStatus.IsNeedRefresh();

      if (esito.value == "si")

      {

            window.location.href = window.location.href;

      }

      else

      {

            // Se non è necessario ricaricare la pagina inizializza un nuovo TimeOut per il prossimo controllo

            window.setTimeout("EvaluateRefresh()", 5000);

      }

}

 

 

Ed infine ho impostato il TimeOut nell'evento onload della window:

 

function window_onload() {

      window.setTimeout("EvaluateRefresh()", 5000);

}

 

Il risultato in termini di performance è notevole e la quantità di lavoro necessaria è veramente poca. Penso proprio che dedicherò diverso tempo ad approfondire questo approccio.

 

Technorati Tags:

posted @ martedì 30 agosto 2005 15:33

Print

Comments on this entry:

# re: Ajax per una pagina di monitoring

Left by Roberto Messora at 30/08/2005 16:11
Gravatar
Personalmente trovo questo approccio ad Ajax molto pericoloso in quanto apre una possibile voragine all'abuso di round-trip sul server.
In uno scenario in cui sia necessario monitorare lo stato di un job in real time, propenderei per uno smart-client o magari per una soluzione ibrida tipo quella di CruiseControl.Net: la GUI principale web, il monitoraggio dello stato dei job, invece, tramite una piccola applicazione che se ne sta nella tray bar (con main form che si apre cliccando sull'icona) e polla sul server.
Al massimo una soluzione come quella che proponi solo strattamente in ambito intranet, ma cmq ci penserei molto bene prima, soprattutto sul numero di utenti contemporanei.
saluti

# re: Ajax per una pagina di monitoring

Left by Daniele Proietti at 31/08/2005 12:22
Gravatar
Non pretendo di descrivere in poche righe quella che è l’architettura del sistema a cui mi riferisco, comunque per rispondere a Roberto volevo precisare che l’applicazione gira effettivamente su una intranet (anche se non farebbe nessuna differenza se venisse utilizzata su internet visto che l’accesso è consentito solo tramite autenticazione), ma che i client non hanno nessun modo di verificare lo stato dei job, per cui anche utilizzando un’architettura smart-client il carico di lavoro si riverserebbe sul server e causerebbe round-trip fra client e server.
La differenza con l’applicazione web è che la necessità di ricaricare tutta una pagina causa maggior traffico di rete ed appesantisce il sistema, l’utilizzo di Ajax sopperisce proprio a questo: la diminuzione delle informazioni che viaggiano sulla rete con un conseguente alleggerimento del sistema.
Sono comunque d’accordo con il post di Roberto relativo ai pericoli sull’abuso dell’approccio Ajax; come ogni altro approccio va valutato attentamente sulla base del sistema che si sta sviluppando, non è la soluzione di tutti i problemi ma senz’altro può essere un grande aiuto in molte soluzioni.
Comments have been closed on this topic.
«gennaio»
domlunmarmergiovensab
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456