web-dev-qa-db-ja.com

ASP.NETのすべてのブラウザーのブラウザーキャッシュを無効にする

ブラウザを無効にしてページをキャッシュするために必要なASP.NETコードについては、確実に参照した後です。 HTTPヘッダーとメタタグに影響を与える方法はたくさんありますが、さまざまなブラウザを正しく動作させるにはさまざまな設定が必要だという印象を受けます。すべてのブラウザで機能するものと、バージョンを含む特定のブラウザに必要なものを示すために、コードのリファレンスビットをコメント化することは本当に素晴らしいことです。

そこにはこの問題に関する膨大な情報がありますが、各メソッドの利点と、特定の手法がより高いレベルのAPIに取って代わられたかどうかを説明する良いリファレンスをまだ見つけていません。

私は特にASP.NET 3.5 SP1に興味がありますが、以前のバージョンについても同様の回答を得ることは良いことです。

このブログエントリ FirefoxとIE Caching の2つの重要な違い]では、HTTPプロトコルの動作の違いについて説明しています。

次のサンプルコードは、私が興味を持っている種類を示しています

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

これは、ASP.NETで使用するものです。

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

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

FirefoxおよびIEでのキャッシュは停止しますが、他のブラウザーは試していません。これらのステートメントにより、次の応答ヘッダーが追加されます。

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

価値のあることは、ASP.NET MVC 3アプリケーションでこれを処理するだけでした。これは、すべてのリクエストでこれを処理するためにGlobal.asaxファイルで使用したコードブロックです。

    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);
    }
39
Adam Carr

さまざまな組み合わせを試してみましたが、FireFoxで失敗しました。しばらく経ちましたので、上記の答えはうまくいくかもしれませんし、何かを見落としているかもしれません。

私にとって常に機能しているのは、各ページの先頭、またはテンプレート(.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>

これにより、すべてのブラウザですべてのキャッシュが必ず無効になりました。

2
Steve

私が知っている2つのアプローチがあります。最初の方法は、ページをキャッシュしないようにブラウザに指示することです。 Responseをno cacheに設定することで対処できますが、ブラウザはこのディレクティブを無視することが多いと思われるためです。もう1つの方法は、応答の日時を将来のある時点に設定することです。すべてのブラウザは、ページをキャッシュに追加するときにこれを現在の時刻に修正すると考えていますが、比較が行われるとページが新しいものとして表示されます。比較が行われない場合もあると思います。詳細はわかりませんが、新しいブラウザがリリースされるたびに変更されます。最後に、自分自身を「更新」するページ(別の応答ディレクティブ)で運が良かった。リフレッシュはキャッシュから行われる可能性が低いようです。

お役に立てば幸いです。

1
Pat O

参照: Google chromeが入力をキャッシュしないようにする方法、特にユーザーが戻るをクリックしたときに非表示のものを入力するには? なしChromeはリロードするかもしれませんが、<input>要素の以前のコンテンツを保持します-言い換えると、autocomplete="off"を使用します。

0
ChrisW

サイトにno-storeタグを追加して、これがブラウザのキャッシュに影響を与えるかどうかをテストします(Chromeはページをキャッシュすることがあります)。また、この記事は、キャッシュがどのように、なぜ機能するかについてのドキュメントで非常に役立ち、no-storeが信頼できない場合はETagの次を調べます。

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

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

0
The Coder