2009-05-27 7 views
78

Je suis après une référence définitive à quel code ASP.NET est requis pour désactiver les navigateurs de la mise en cache de la page. Il y a plusieurs façons d'affecter les en-têtes HTTP et les métabalises et j'ai l'impression que différents paramètres sont nécessaires pour que les différents navigateurs se comportent correctement. Ce serait vraiment génial d'avoir un bit de code de référence commenté qui indique ce qui fonctionne pour tous les navigateurs et qui est requis pour un navigateur particulier, y compris les versions.Désactiver la mise en cache du navigateur pour tous les navigateurs d'ASP.NET

Il y a énormément d'informations sur ce problème, mais je n'ai pas encore trouvé une bonne référence qui décrive les avantages de chaque méthode et si une technique particulière a été remplacée par une API de plus haut niveau.

Je suis particulièrement intéressé par ASP.NET 3.5 SP1 mais il serait bon d'obtenir également des réponses pour les versions antérieures.

Cette entrée de blog Two Important Differences between Firefox and IE Caching décrit certaines différences de comportement du protocole HTTP.

Le code exemple suivant illustre le genre de chose que je suis intéressé par

public abstract class NoCacheBasePage : System.Web.UI.Page 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 

     DisableClientCaching(); 
    } 

    private void DisableClientCaching() 
    { 
     // Do any of these result in META tags e.g. <META HTTP-EQUIV="Expire" CONTENT="-1"> 
     // HTTP Headers or both? 

     // Does this only work for IE? 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 

     // Is this required for FireFox? Would be good to do this without magic strings. 
     // Won't it overwrite the previous setting 
     Response.Headers.Add("Cache-Control", "no-cache, no-store"); 

     // Why is it necessary to explicitly call SetExpires. Presume it is still better than calling 
     // Response.Headers.Add(directly 
     Response.Cache.SetExpires(DateTime.UtcNow.AddYears(-1)); 
    } 
} 
+5

Je voudrais essayer de répondre si je ne savais pas à quel point votre tâche est horriblement impossible. Contrôler le cache du client, c'est comme essayer d'utiliser des baguettes de 10 pieds de long pour réorganiser les meubles. –

+0

Beaucoup de réponses qui couvrent juste une partie du problème seraient encore très précieuses. S'il vous plaît jeter votre 2 cents. –

Répondre

91

C'est ce que nous utilisons dans ASP.NET:

// Stop Caching in IE 
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); 

// Stop Caching in Firefox 
Response.Cache.SetNoStore(); 

Il arrête la mise en cache dans Firefox et IE, mais nous n'avons pas essayé d'autres navigateurs. Les en-têtes de réponse suivants sont ajoutés par ces déclarations:

Cache-Control: no-cache, no-store 
Pragma: no-cache 
+0

+1 .. Merci pour votre suggestion –

+5

+1 Cela fonctionne pour moi dans Chrome, merci beaucoup. J'utilise également Response.Cache.SetAllowResponseInBrowserHistory (true); pour éviter l'historique de stocker une entrée pour chaque demande de la même page. – daniloquio

+12

Apparemment, quelqu'un a découvert que l'utilisation de SetCacheability avec NoCache désactive également le cache de sortie ASP.NET (cache côté serveur). Ils suggèrent d'utiliser l'option ServerAndNoCache à la place. http://codeclimber.net.nz/archive/2007/04/01/Beware-the-ASP.NET-SetCacheability-method.aspx – md1337

1

Il existe deux approches que je connais. Le premier consiste à dire au navigateur de ne pas mettre en cache la page. Définir la réponse à aucun cache prend soin de cela, cependant, comme vous pensez que le navigateur ignore souvent cette directive. L'autre approche consiste à définir l'heure de la date de votre réponse sur un point dans le futur. Je crois que tous les navigateurs vont corriger cela à l'heure actuelle quand ils ajoutent la page au cache, mais il montrera la page comme plus récente lorsque la comparaison est faite. Je crois qu'il peut y avoir des cas où aucune comparaison n'est faite. Je ne suis pas sûr des détails et ils changent avec chaque nouvelle version du navigateur. Note finale J'ai eu plus de chance avec les pages qui se "rafraîchissent" (une autre directive de réponse). L'actualisation semble moins susceptible de provenir du cache.

Espérons que ça aide.

37

Pour ce que ça vaut, je viens d'avoir à gérer cela dans mon application ASP.NET MVC 3. Voici le bloc de code que j'ai utilisé dans le fichier Global.asax pour gérer cela pour toutes les demandes.

protected void Application_BeginRequest() 
    { 
     //NOTE: Stopping IE from being a caching whore 
     HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false); 
     HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     HttpContext.Current.Response.Cache.SetNoStore(); 
     Response.Cache.SetExpires(DateTime.Now); 
     Response.Cache.SetValidUntilExpires(true); 
    } 
+0

Le 'HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory (false)' fait la différence pour empêcher la mise en cache dans Avec IE et FireFox –

+0

cette réponse n'a pas fonctionné pour moi –

+2

-1, la définition dans ces Application_BeginRequest() provoque l'envoi des en-têtes no-cache pour les éléments que vous voudrez probablement mettre en cache (fichiers JavaScript, images, etc.). Je ne l'ai pas encore essayé, mais l'emplacement de l'OP (définissant les en-têtes dans la page ASP elle-même) est probablement meilleur. –

2

J'ai essayé différentes combinaisons et j'ai eu des échecs dans FireFox. Il a été un moment si la réponse ci-dessus peut fonctionner correctement ou j'ai peut-être raté quelque chose.

Ce qui a toujours fonctionné pour moi est d'ajouter ce qui suit à la tête de chaque page, ou le modèle (page principale dans .net).

<script language="javascript" type="text/javascript"> 
    window.onbeforeunload = function() { 
     // This function does nothing. It won't spawn a confirmation dialog 
     // But it will ensure that the page is not cached by the browser. 
    } 
</script> 

Cela a désactivé toute la mise en cache dans tous les navigateurs pour moi sans échec.

+7

Je ne suis pas sûr ce que cela est censé faire, mais il ressemble à un gros hack qui est voué à l'échec dans la prochaine mise à jour de l'un de ces navigateurs. – md1337

+0

Il est expliqué par ex. https://web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript - en résumé, l'événement onbeforeunload a été implémenté pour être utilisé par les banques et empêche la mise en cache de la page. – ChrisW

0

Je vais tester l'ajout de la balise no-store sur notre site pour voir si cela fait une différence dans la mise en cache du navigateur (Chrome a parfois mis en cache les pages).J'ai aussi trouvé cet article très utile sur la documentation sur comment et pourquoi les travaux de mise en cache et examinerai ETag est la prochaine étape si le no-store n'est pas fiable:

http://www.mnot.net/cache_docs/

http://en.wikipedia.org/wiki/HTTP_ETag

Questions connexes