Désactiver la mise en cache du navigateur pour tous les navigateurs à partir d’ASP.NET

Je suis une référence définitive à quel code ASP.NET est requirejs pour les navigateurs désactivés de la mise en cache de la page. Il existe de nombreuses manières d’affecter les en-têtes HTTP et les balises Meta et j’ai l’impression que différents parameters 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é pour indiquer lequel fonctionne pour tous les navigateurs et ce qui est requirejs pour un navigateur particulier, y compris les versions.

Il existe une énorme quantité d’informations sur ce problème, mais je n’ai pas encore trouvé de référence décrivant les avantages de chaque méthode et indiquant si une technique particulière a été remplacée par une API de niveau supérieur.

Je suis particulièrement intéressé par ASP.NET 3.5 SP1, mais il serait également bon d’obtenir des réponses pour les versions précédentes.

Cet article Deux différences importantes entre Firefox et IE Caching décrit certaines différences de comportement du protocole HTTP.

L’exemple de code suivant illustre le genre de chose qui m’intéresse

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 eg  // 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 ssortingngs. // 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)); } } 

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 instructions:

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

Pour ce que cela vaut, je devais simplement 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); } 

J’ai essayé différentes combinaisons et les ai fait échouer dans FireFox. Cela fait un moment que la réponse ci-dessus peut fonctionner correctement ou j’ai peut-être manqué quelque chose.

Ce qui a toujours fonctionné pour moi est d’append ce qui suit à la tête de chaque page ou au modèle (Master Page dans .net).

  

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

Il y a deux approches que je connais. La première consiste à dire au navigateur de ne pas mettre la page en cache. Définir la réponse sur aucun cache prend soin de cela, mais vous soupçonnez que le navigateur ignore souvent cette directive. L’autre approche consiste à définir l’heure de votre réponse sur un point dans le futur. Je crois que tous les navigateurs corrigeront cela à l’heure actuelle lorsqu’ils ajoutent la page au cache, mais ils afficheront la page plus récente lors de la comparaison. Je crois qu’il peut y avoir des cas où une comparaison n’est pas faite. Je ne suis pas sûr des détails et ils changent à chaque nouvelle version du navigateur. Note finale J’ai eu plus de chance avec les pages qui se “rafraîchissent” elles-mêmes (une autre directive de réponse). Le rafraîchissement semble moins susceptible de provenir du cache.

J’espère que cela pourra aider.

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 les pages en cache). J’ai également trouvé cet article très utile sur la documentation sur comment et pourquoi la mise en cache fonctionne et examinera la prochaine version d’ETag si le no-store n’est pas fiable:

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

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

Voir aussi Comment empêcher Google Chrome de mettre en cache mes entrées, en particulier celles cachées lorsque l’utilisateur clique sur le dos? sans lesquels Chrome pourrait recharger mais conserver le contenu précédent des éléments – en d’autres termes, utiliser autocomplete="off" .