Evitare la cache dei file XAP in Silverlight 2.0

di Alessio Leoncini, in Silverlight 2.0,

Il modello di deploy di un'applicazione Silverlight 2.0 prevede che un progetto siano compilato nelle rispettive dll e che esse siano compresse in un file XAP. Questo file dovrà essere referenziato con le note modalità in modo che l'applicazione possa essere eseguita all'interno di una pagina web. I file XAP vengono scaricati sui client degli utenti e subiscono le stesse modalità di gestione delle altre risorse incluse nelle pagine HTML, in particolare sono suscettibili delle stesse regole di caching da parte dei browser.

Dopo il primo download, in linea di principio, al secondo accesso al progetto è il browser stesso che decide se ri-scaricare o meno il file XAP corrispondente, rispettando le regole di invalidazione e quelle definite dall'utente.

Sia durante la fase di sviluppo che in quella di revisione del progetto, può capitare di dover aggiornare il file XAP in seguito a modifiche dell'applicazione. In tal caso possiamo forzare il browser a scaricare nuovamente il file ed evitare l'uso di quello presente nei file temporanei.

Una delle soluzioni più efficaci è sicuramente l'inserimento di un parametro in querystring al path del file XAP:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2">
    <param name="source" value="ClientBin/SilverlightApplication1.xap?v=1.0" />
</object>

In questo modo potremo variare questo parametro ogni volta che sarà distribuita una nuova versione dell'applicazione.

Se pubblichiamo il progetto su un web server IIS, con le estensioni di ASP.NET attive, possiamo eseguire automaticamente l'invalidazione della cache, intercettando la richiesta del file XAP attraverso un HttpHandler opportunamente programmato:

public class XAPHandler : IHttpHandler
{
   public bool IsReusable
   {
      get { return false; }
   }

   public void ProcessRequest(HttpContext context)
   {
      context.Response.Clear();
      context.Response.Cache.SetCacheability(HttpCacheability.NoCache);

      string xapName = context.Request.QueryString["xap"];

      if (!String.IsNullOrEmpty(xapName))
      {
         string xapFile = String.Format("clientbin/{0}", xapName);
         string attachment = string.Format("attachment; filename={0}", xapFile);
         context.Response.ContentType = "application/x-silverlight-app";
         context.Response.AddHeader("Content-disposition", attachment);
         context.Response.TransmitFile(xapFile);
      }
   }
}

La chiave del codice consiste nello specificare HttpCacheability.NoCache come parametro del metodo Response.Cache.SetCacheability. Con tale impostazione vengono aggiunti quegli elementi agli Headers della Response che invalidano la cache della richiesta. Con questo metodo non viene gestita la scadenza dell'oggetto e ad ogni richiesta viene sempre scaricato il file XAP.

Per la registrazione dell'HttpHandler è possibile fare riferimento allo script #26 (https://www.silverlightitalia.com/script/26/HttpHandler-XAP-Registrato-IIS.aspx).

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi