84 votes

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

Je suis après un et définitive à ce ASP.NET code est nécessaire pour handicapés navigateurs de mise en cache de la page. Il existe de nombreuses façons d'affecter les en-têtes HTTP et les balises meta et j'ai l'impression de différents paramètres sont nécessaires pour obtenir les différents navigateurs à se comporter correctement. Il serait vraiment bien pour obtenir une référence bits de code commenté pour indiquer ce qui fonctionne pour tous les navigateurs, et qui est nécessaire pour le navigateur, y compris les versions.

Il y a une énorme quantité d'informations sur cette question là, mais je n'ai pas encore trouver une bonne référence qui décrit les avantages de chaque méthode et de savoir si une technique particulière a été remplacé par un plus haut niveau de l'API.

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

Cette entrée de blog Deux Différences Importantes entre Firefox et IE Cache décrit certaines protocole HTTP différences de comportement.

L'exemple de code suivant illustre le genre de chose que je suis intéressé à

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));
    }
}

96voto

HttpWatchSupport Points 1663

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 s'arrête de mise en cache dans Firefox et IE, mais nous n'avons pas essayé d'autres navigateurs. La réponse suivante les en-têtes sont ajoutés par ces déclarations:

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

39voto

Adam Carr Points 1858

Pour ce que ça vaut, j'ai juste eu à traiter dans mon ASP.NET MVC 3 application. Voici le bloc de code que j'ai utilisé dans le monde.asax fichier pour gérer ce 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);
    }

2voto

Steve Points 41

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

Ce qui a toujours travaillé pour moi, c'est d'ajouter les éléments suivants à la tête de chaque page, ou le modèle (Page Maître .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é la mise en cache dans tous les navigateurs pour moi sans échec.

1voto

Pat O Points 587

Il existe deux approches que je connais. La première est de dire au navigateur de ne pas mettre en cache la page. Réglage de la Réponse à la no-cache qui s'en occupe, cependant, comme vous le soupçonnez, le navigateur le plus souvent ignorer la présente directive. L'autre approche consiste à définir la date et heure de votre réponse à un moment donné dans l'avenir. Je crois que tous les navigateurs corriger cela à l'heure actuelle quand ils ajoutent de la page dans le cache, mais il faudra montrer la page que de nouvelles lorsque la comparaison est faite. Je crois qu'il peut y avoir certains cas où la comparaison n'est pas faite. Je ne suis pas sûr de détail et ils changent avec chaque nouveau navigateur de presse. Dernière remarque, j'ai eu plus de chance avec les pages "actualiser" eux-mêmes (une autre réponse de la directive). L'actualisation semble moins probable à venir à partir du cache.

Espérons que cela aide.

0voto

The Coder Points 269

Je vais le tester en ajoutant le no-store tag sur notre site pour voir si cela fait une différence de mise en cache du navigateur (Chrome a parfois été mise en cache des pages). J'ai aussi trouvé cet article très utile sur de la documentation sur le comment et le pourquoi de la mise en cache fonctionne et va chercher à l'ETag prochaine si le no-store n'est pas fiable:

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X