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:
«agosto»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910