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

je suis après une référence définitive à ce que ASP.NET le code 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. Il serait vraiment génial d'obtenir un bit de référence de code commenté pour indiquer ce qui fonctionne pour tous les navigateurs et qui est nécessaire pour un navigateur particulier, 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 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 bon d'obtenir des réponses pour une version antérieure.

cette entrée de blog deux différences importantes entre Firefox et IE Caching décrit certains HTTP protocole des différences de comportement.

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));
    }
}
80
demandé sur Martin Hollingsworth 2009-05-27 09:03:08

6 réponses

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 énoncés:

Cache-Control: no-cache, no-store
Pragma: no-cache
92
répondu HttpWatchSupport 2009-05-27 22:39:30

pour ce que ça vaut, j'ai juste eu à gérer cela dans mon ASP.NET MVC 3 application. Voici le bloc de code que j'ai utilisé dans le monde.fichier asax pour traiter toutes les requêtes.

    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);
    }
37
répondu Adam Carr 2011-04-14 14:06:31

j'ai essayé différentes combinaisons et je les ai fait échouer dans FireFox. Cela fait un moment que la réponse ci-dessus peut très bien fonctionner ou j'ai peut-être manqué quelque chose.

ce qui a toujours fonctionné pour moi est d'ajouter ce qui suit à la tête de chaque page, ou au 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 faute.

2
répondu Steve 2011-11-22 07:21:56

il y a deux approches que je connais. La première est de dire au navigateur de ne pas mettre la page en cache. Configurer la réponse à no cache prend soin de cela, mais comme vous le soupçonnez, le navigateur ignorera souvent cette directive. L'autre approche consiste à fixer la date de votre réponse à un point dans l'avenir. Je crois que tous les navigateurs corrigeront cela au moment où ils ajouteront la page au cache, mais il montrera la page plus récente quand la comparaison est faite. Je crois il peut y avoir certains cas où la 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" (une autre directive de réponse). Le rafraîchissement semble moins susceptible de provenir du cache.

Espère que ça aide.

1
répondu Pat O 2009-05-27 16:03:07

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 également trouvé cet article très utile sur la documentation sur comment et pourquoi la mise en cache fonctionne et regardera la prochaine ETag si le no-store n'est pas fiable:

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

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

0
répondu The Coder 2012-07-28 03:00:00

Voir aussi comment empêcher google chrome de cacher mes entrées, esp cachées lorsque l'utilisateur clique en arrière? sans lequel Chrome pourrait se recharger mais préserver le contenu précédent des éléments <input> -- en d'autres termes, utiliser autocomplete="off" .

0
répondu ChrisW 2017-05-23 10:31:11