Il codice che segue non è testato ed è fornito senza alcuna garanzia rispetto a possibili danni causati da esso al vostro software od ai vostri dati

In questo breve “articolo” espongo uno dei modi possibili di monitorare il cambiamento di una risorsa remota in modo automatico,

questo può essere utile per essere aggiornati sul cambiamento di siti che non espongano un feed rss rispetto alle informazioni pubblicate o sapere quando una generica risorsa raggiungibile tramite un uri (come un file in una intranet) è stata modificata anche se in questo caso potrebbe essere una soluzione alternativa l’uso di un FileSystemWatcher (vedi classe FileSystemWatcher su MSDN),

una risorsa remota ,un file in intranet ,una pagina web hanno una caratteristica che generalmente permette di monitorarne il cambiamento senza conoscere il tipo di file o memorizzarne il contenuto per successive comparazioni ,generalmente,non sempre, al cambiamento di una risorsa remota si ha un cambiamento delle sua grandezza in bytes,difficilmente a seguito di modifiche un file ha la stessa grandezza posseduta prima del cambiamento ma ovviamente non è possibile escluderlo ,

il metodo qui esposto NON porta ad un monitoraggio sicuro ma probabile rispetto alla risorsa remota che si vuole controllare senza salvarla o copiarla in alcun modo:

,  .net contiene una classe molto potente per eseguire operazioni da e verso indirizzi remoti,  si tratta delle classe WebClient ,questa classe permette di ricevere o spedire dati verso un uri,

serve inoltre un timer che permetta di eseguire un metodo della classe sopra ad ogni scadere di un determinato intervallo per questo userò il Timer sotto il namespace System.Timers,questo timer è indicato per applicazioni server e qui http://msdn.microsoft.com/en-us/magazine/cc164015.aspx potrete trovare una comparazione tra i diversi tipi di Timer offerti dal framework .net

la classe mytimer incorpora il funzionamento del timer e contiene la “logica” dell’applicazione:

class MyTimer
{
private string path=null;
private int timesCall = 0;
ArrayList results = new ArrayList();
public MyTimer()
{

}
public MyTimer(string pathUrl)
{
path = pathUrl;
System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new ElapsedEventHandler(t_Elapsed);
t.AutoReset = true;
t.Interval = 72000000;
t.Enabled = true;
}

void t_Elapsed(object sender, ElapsedEventArgs e)
{
timesCall=timesCall + 1;
WebClient client = new WebClient();
byte[] page = client.DownloadData(path);
int numBytes=page.GetLength(0);

results.Add(numBytes.ToString());
if (timesCall > 1)
{
int preValue = System.Convert.ToInt32(results[results.Count-2]);
int currValue = System.Convert.ToInt32(results[results.Count-1]);
int diff = Math.Abs(currValue – preValue);
if (diff > 150)
{
Process p = new Process();
p.StartInfo.FileName = path;
p.Start();
}
}
}
}

al primo “scadere” dell’intervallo di 10 minuti (i 7200000 millisecondi passati come valore alla proprietà Interval del timer non succede nulla e viene semplicemente letto il primo valore in bytes,

se diff che rappresenta la differenza in bytes tra una chiamata e la precedente è superiore ad una grandezza da noi ritenuta significativa per considerare la risorsa cambiata viene aperto il file con l’applicazione associata sulla macchina,ad es. se si tratta di un file html questo verrà aperto con il browser di default sulla vostra macchina,chiaramente potete monitorare solo risorse alle quali siete esplicitamente autorizzati ad accedere con la vostra applicazione ,

nel caso vogliate utilizzare un codice simile allo snippet sopra in un applicazione con un interfaccia grafica o comunque con piu’ istanze della classe (nel caso di piu’ risorse da monitorare) è necessario utilizzare i metodi asincroni di webclient che evitano di bloccare l’interfaccia grafica del programma in cui sono contenuti in attesa della risposta del server remoto.

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay
  • MSN Reporter
  • MyShare
  • MySpace
  • Segnalo
  • StumbleUpon
  • Technorati
  • Twitter
  • Yahoo! Bookmarks
  • Yahoo! Buzz