web-dev-qa-db-fra.com

Désactivation de la mise en cache du navigateur pour tous les navigateurs à partir d'ASP.NET

Je suis après une référence définitive à ce que le code ASP.NET est nécessaire pour désactiver les navigateurs de la mise en cache de la page. Il existe de nombreuses manières d’affecter les en-têtes HTTP et les balises méta et j’ai l’impression que différents paramètres sont nécessaires pour que différents navigateurs se comportent correctement. Ce serait vraiment bien d’obtenir un code de référence commenté pour indiquer lequel fonctionne pour tous les navigateurs et qui est requis pour un navigateur particulier, y compris ses 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.

ASP.NET 3.5 SP1 m'intéresse particulièrement, mais il serait également utile d'obtenir des réponses pour les versions antérieures.

Cette entrée de blog Deux différences importantes entre Firefox et la mise en cache IE décrit certaines différences de comportement de 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 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));
    }
}
81

Voici 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
93
HttpWatchSupport

Pour ce que cela vaut, il me suffisait de 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);
    }
38
Adam Carr

J'ai essayé diverses combinaisons et les ai échouées dans FireFox. Cela fait un moment que la réponse ci-dessus fonctionne peut-être bien ou j'ai peut-être manqué quelque chose.

Ce qui a toujours fonctionné pour moi, c’est d’ajouter ce qui suit à la tête de chaque page, ou au modèle (Master Page in .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é pour moi toute la mise en cache dans tous les navigateurs.

2
Steve

Je connais deux approches. La première consiste à indiquer au navigateur de ne pas mettre la page en cache. Définir la réponse sur no cache s’occupe de cela, mais comme vous le supposez, le navigateur ignorera souvent cette directive. L’autre approche consiste à définir la date et l’heure de votre réponse sur une date ultérieure. Je pense que tous les navigateurs corrigent cela à l’heure actuelle lorsqu’ils ajoutent la page au cache, mais il affichera la page comme 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 plus de chance avec les pages qui se "rafraîchissent" (autre directive de réponse). L'actualisation semble moins susceptible de provenir de la mémoire cache. 

J'espère que cela pourra aider.

1
Pat O

Voir aussi Comment empêcher Google Chrome de mettre en cache mes entrées, surtout celles qui sont cachées lorsque l'utilisateur clique en arrière? sans lequel Chrome pourrait recharger mais conserver le contenu précédent d'éléments <input> - en d'autres termes, utilisez autocomplete="off".

0
ChrisW

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

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

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

0
The Coder