2010-02-17 9 views

risposta

26

Utilizzando la gestione di IIS aggiungere un'intestazione personalizzata Cache-Control con il valore no-cache. Ciò farà sì che il browser verifichi che qualsiasi versione cache di XAP sia l'ultima prima di utilizzarla.

+0

Questa è una grande risposta e molto meglio di molti altri (ho visto dare questa risposta qui molte volte.) Sono nuovo allo sviluppo web, ma dopo aver letto il tutorial qui sotto ... Posso vedere questo è esattamente ciò che è necessario per la memorizzazione nella cache XAP. È davvero un'ottima soluzione. [Tutorial sulla memorizzazione nella cache] (http://www.mnot.net/cache_docs/) –

+0

Questo non impone al browser di non memorizzare mai nella cache l'XAP? O assicura che memorizzi solo le cache quando l'XAP è identico? –

+0

C'è un modo per farlo tramite Web.Config? Il mio progetto è ospitato in un server in cui non ho accesso alla gestione di IIS. – Marlon

7

aggiungere un parametro di query per l'URL del XAP nell'elemento sulla pagina HTML:??

  • ClientBin/MyApp.xap giri = 1
  • ClientBin/MyApp.xap rev = 2

Sarà ignorato e interromperà la cache. In IE8, ci sono alcuni strumenti di gestione della cache: aprire gli strumenti per sviluppatori:

  • Try cache ... Aggiorna sempre da server
  • Try cache ... Clear cache del browser per questo dominio ...
+0

I numeri di revisione su risorse statiche possono essere piuttosto efficaci quando gli URL che li fanno riferimento vengono generati dinamicamente in modo da poter aggiungere questi riferimenti. Tuttavia ci vuole un bel po 'di infrastrutture personalizzate per far sì che ciò accada in modo dinamico e senza che lo sviluppatore debba ricordarsi di aggiornare manualmente il numero di versione. Diventa peggio se la risorsa viene utilizzata in più posti. Poiché non è probabile che gli XAP siano richiesti ad alta frequenza da un singolo cliente, la risposta occasionale "non modificata" è più desiderabile. – AnthonyWJones

5

Creare un gestore HTTP personalizzato per gestire i file * .xap e quindi impostare le opzioni di memorizzazione nella cache all'interno del gestore.

qualcosa di simile ...

using System; 
using System.IO; 
using System.Web; 

public class FileCacheHandler : IHttpHandler 
{ 
    public virtual void ProcessRequest(HttpContext context) 
    { 
     if (File.Exists(context.Request.PhysicalPath)) 
     { 
      DateTime lastWriteTime = File.GetLastWriteTime(filePath); 
      DateTime? modifiedSinceHeader = GetModifiedSinceHeader(context.Request); 

      if (modifiedSinceHeader == null || lastWriteTime > modifiedSinceHeader) 
      { 
       context.Response.AddFileDependency(filePath); 
       context.Response.Cache.SetLastModifiedFromFileDependencies(); 
       context.Response.Cache.SetCacheability(HttpCacheability.Public); 
       context.Response.TransmitFile(filePath); 
       context.Response.StatusCode = 200; 
       context.Response.ContentType = "application/x-silverlight-app"; 
       context.Response.OutputStream.Flush(); 
      } 
      else 
      { 
       context.Response.StatusCode = 304; 
      } 
     } 
    } 

    public DateTime? GetModifiedSinceHeader(HttpRequest request) 
    { 
     string modifiedSinceHeader = request.Headers["If-Modified-Since"]; 
     DateTime modifiedSince; 
     if (string.IsNullOrEmpty(modifiedSinceHeader) 
      || modifiedSinceHeader.Length == 0 
      || !DateTime.TryParse(modifiedSinceHeader, out modifiedSince)) 
      return null; 

     return modifiedSince; 
    } 
} 
6

La soluzione presentata here è in qualche modo simile a quella di Michael, ma è automatico e garantisce il cliente sarà sempre ottenere una nuova versione. Questo potrebbe essere inefficiente a seconda della situazione.

Da quando Lars dice nel suo comments that he is not on Stack Overflow, sto copiando la risposta qui.

<object id="Xaml1" data="data:application/x-silverlight-2, 
    "type="application/x-silverlight-2" width="100%" height="100%"> 

    <%––<param name="source" value="ClientBin/SilverlightApp.xap"/>––%> 

    <%  
    string orgSourceValue = @"ClientBin/SilverlightApp.xap";  
    string param; 

    if (System.Diagnostics.Debugger.IsAttached)  
    { 
     param = "<param name=\"source\" value=\"" + orgSourceValue + "\" />"; 
    } 
    else  
    {  
     string xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + orgSourceValue; 

     DateTime xapCreationDate = System.IO.File.GetLastWriteTime(xappath);  

     param = "<param name=\"source\" value=\"" + orgSourceValue + "?ignore=" + 
       xapCreationDate.ToString() + "\" />";  
    } 

    Response.Write(param);  
    %> 

    .... 

</object> 
+0

Ho dato questo metodo e mentre posso eseguire il debug e vedere il 'param' compilato correttamente, Response.Write scrive nel mio esempio sopra l'inizio del tag . Qualche idea su come risolvere questo? – dougajmcdonald

+0

Huh ... è davvero strano. Forse potresti Response.Write l'intero tag dell'oggetto incluso il param? – Jedidja

+0

È strano, ho pensato di scrivere tutto il resto, cosa che ho fatto. Sembra che ci sia un framework che stiamo usando che non gestisce response.writes nella posizione in cui si trovano nel flusso di aspx/Response. Solleverò una chiamata con loro e vedrà se possono indicarmi la direzione della scrittura. Grazie per la risposta – dougajmcdonald

2

Bene tutti gli esempi di cui sopra dipendono il browser non caching il codice HTML che contiene il nome del nuovo trick XAP .... quindi basta spostare il problema a qualcos'altro. E sono anche dannatamente complicato ....

Tuttavia, per il caso di debug, almeno, è facile scrivere il <oggetto> e <param> tag javascript in modo che il nome cambia ogni volta che la pagina HTML è usato, se è memorizzato nella cache dal browser o no!

<script type="text/javascript"> 
    document.write('<object blah blah >'); 
    document.write('<param name="Source" value="myapp.xap?' 
       + new Date().getTime()+'">'); 
    document.write('</object>'); 
</script> 

Questo evita alcun problema si può avere il controllo delle impostazioni del server e funziona altrettanto bene, indipendentemente dalla tecnologia di server in uso.

. Nota: si deve scrivere il gruppo intero oggetto con lo stesso metodo, perché mettere un tag script all'interno del tag object significa "fare solo se il browser doesnt supporta l'oggetto

5

ho aggiunto un parm query il percorso del file xap, in modo che io possa gestirlo attraverso il controllo delle versioni.

Default.aspx codice:

<param 
    name="source" 
    value="ClientBin/MySilverLightApp.xap?xapid<%=XapID %>" /> 

Default.aspx.cs codice:

protected string XapID 
{ 
    get 
    { 
     Version v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 

     if (System.Diagnostics.Debugger.IsAttached) 
      Response.Write(string.Format("Build: {0}.{1}.{2}.{3}", v.Major.ToString(), v.Minor.ToString(), v.Build.ToString(), v.Revision.ToString())); 
     return string.Format("{0}.{1}.{2}.{3}", v.Major.ToString(), v.Minor.ToString(), v.Build.ToString(), v.Revision.ToString() 
    } 
} 
2

Non è molto raro imbattersi in Xap caching, il che significa che ogni volta che si distribuisce una nuova versione dell'applicazione Silverlight, il browser non scarica il file .XAP aggiornato.

Una soluzione potrebbe essere quella di modificare le proprietà di IIS. È possibile attivare l'opzione “Abilita intestazione HTTP Content scadenza”, a per il file Xap seguendo questi step:

  1. Aprire Gestione IIS
  2. Vai a “Sito Web predefinito” e trovare il sito web per il progetto Silverlight .
  3. Trova il file .XAP in ClientBin.
  4. Passare alla pagina delle proprietà del file .XAP, sulla scheda delle intestazioni HTTP, attivare "Abilita scadenza contenuto", fare clic sul pulsante di opzione "Scadenza immediata".
  5. Salvare le modifiche.

In questo modo l'ultimo .XAP (solo se è presente un file .XAP più recente) verrà scaricato quando si aggiorna la pagina senza chiudere il browser.

Spero che questo aiuti!

Problemi correlati