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:
ASP.NET