Faire expirer le fichier Silverlight XAP de la cache du navigateur par programmation

Comment puis-je empêcher un fichier Silverlight XAP d'être mis en cache par le navigateur web?

la raison pour laquelle je veux faire cela est que pendant le développement Je ne veux pas vider manuellement le cache du navigateur, je suis à la recherche d'une approche programmatique côté serveur.

24
demandé sur AwkwardCoder 2010-02-17 18:28:12
la source

7 ответов

Utilisation de la gestion IIS ajouter un en-tête personnalisé Cache-Control avec la valeur no-cache. Cela va amener le navigateur à vérifier que n'importe quelle version mise en cache du XAP est la dernière avant de l'utiliser.

26
répondu AnthonyWJones 2010-02-17 19:06:47
la source

Ajouter un paramètre de requête à L'URL pour le XAP dans l'élément de la Page HTML:

  • clientBin / MyApp.xap?rev=1
  • clientBin / MyApp.xap?rev=2

il sera ignoré et cassera le cache. Dans IE8, il y a quelques outils de gestion de cache: Ouvrir les outils de développement:

  • Essayez Cache...Toujours rafraîchir à partir du serveur
  • Essayez Cache...Clear Browser Cache pour ce domaine...
8
répondu Michael S. Scherotter 2010-02-17 18:41:08
la source

La solution présentée ici est un peu similaire à celui de Michael mais est automatique et garantit que le client obtiendra toujours une nouvelle version. Ce être inefficace selon votre situation.

puisque Lars dit dans son les commentaires qu'il n'est pas sur Stack Overflow, je copie la réponse ici.

<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>
6
répondu Jedidja 2011-05-25 23:31:43
la source

créer un gestionnaire http personnalisé pour gérer *.XAP File puis définissez vos options de cache à l'intérieur du gestionnaire.

quelque Chose comme ça...

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;
    }
}
5
répondu David Cooper 2011-04-08 01:53:14
la source

j'ai ajouté un parm de requête au chemin du fichier xap, de sorte que je puisse le gérer par le biais du Versioning.

par Défaut.aspx code:

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

par Défaut.aspx.cs code:

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()
    }
}
5
répondu Big Chicken 2013-01-29 21:18:00
la source

Eh bien, tous les exemples ci-dessus dépendent du navigateur qui ne cache pas le HTML qui contient le nouveau nom XAP.... donc vous déplacez le problème sur autre chose. Et ils sont aussi extrêmement compliqué....

Cependant pour le cas de débogage, au moins, il est facile d'écrire les balises < object> et en javascript de sorte que le nom change à chaque fois que la page html est utilisée, qu'elle soit mise en cache par le navigateur ou non!

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

cela évite tout tracas vous pouvez avoir le contrôle des paramètres du serveur et fonctionne tout aussi bien indépendamment de la technologie de serveur en usage.

Note: vous devez écrire l'ensemble du groupe d'objets avec la même méthode car mettre une balise script à l'intérieur de la balise object signifie "Ne faites ceci que si le navigateur ne supporte pas l'objet.

2
répondu Chris Harlow 2011-06-26 12:15:11
la source

il n'est pas très rare de tomber sur .XAP cache, ce qui signifie que chaque fois que vous déployez une nouvelle version de L'application Silverlight, le navigateur ne télécharge pas la mise à jour .Fichier XAP.

une solution pourrait être de changer les propriétés de L'IIS. Vous pouvez activer l'option" en-tête HTTP activer L'Expiration du contenu " pour votre .Fichier XAP en suivant ces étapes:

  1. Ouvrir le Gestionnaire des services IIS
  2. aller à "site Web par défaut" et trouver le site Web pour votre Silverlight projet.
  3. Trouver le .Fichier XAP sous ClientBin.
  4. allez à la page des propriétés du .Fichier XAP, sous L'onglet en-têtes HTTP, activez "activer L'Expiration du contenu", cliquez sur le bouton radio" expirer immédiatement".
  5. Enregistrer les modifications.

de Cette façon, la dernière .XAP (seulement si il y a un plus tard .XAP file) sera téléchargé lorsque vous Rafraîchissez votre page sans avoir à fermer le navigateur.

Espérons que cette aide!

2
répondu Haidar Abbas 2013-08-19 10:55:39
la source

Autres questions sur