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


87

無効にしたブラウザーがページをキャッシュできないようにするために必要なASP.NETコードを明確に参照したいと思います。HTTPヘッダーとメタタグに影響を与える方法はたくさんありますが、さまざまなブラウザを正しく動作させるには、さまざまな設定が必要であるという印象を受けます。すべてのブラウザで機能し、バージョンを含む特定のブラウザに必要なコードを示すために、コードの参照ビットをコメント化しておくと非常に便利です。

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

私は特にASP.NET3.5 SP1に興味がありますが、以前のバージョンの回答も得られるとよいでしょう。

このブログエントリFirefoxとIECachingの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));
    }
}

5
あなたの仕事がどれほど恐ろしく不可能かわからなかったら、私は答えようとします。クライアントのキャッシュを制御することは、10フィートの長さの箸を使用して家具を再配置しようとするようなものです。
ジェフミートボールヤン

問題のほんの一部をカバーするたくさんの答えは、それでも非常に価値があります。2セント相当を投入してください。
マーティンホリングスワース

回答:


96

これは、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

5
+1これはChromeで機能しています。ありがとうございます。Response.Cache.SetAllowResponseInBrowserHistory(true);も使用します。同じページの各リクエストのエントリを保存する履歴を回避するため。
daniloquio 2012年

12
どうやら誰かが、NoCacheでSetCacheabilityを使用すると、ASP.NET出力キャッシュ(サーバー側キャッシュ)も無効になることを発見しました。代わりにServerAndNoCacheオプションを使用することをお勧めします。codeclimber.net.nz/archive/2007/04/01/…– md1337 2012
21:22

1
コードスニペットのコメントを明確にするために、mainメソッドはSetCacheabilityです。SetNoStoreIE6の回避策です。HTTP応答でno-cacheとno-storeの両方を使用する必要がある理由を参照してください
エドワードブレイ2013年

3
FWIW ... IE10用のSetNoStoreを追加する必要がありました
felickz

https経由で動的PDFを出力し、このようにキャッシュヘッダーを設定するこのページを読んでいる人は、次のIE8以下のバグに注意してください:stackoverflow.com/questions/1038707/…–
Paddy

41

価値があるので、ASP.NET MVC3アプリケーションでこれを処理する必要がありました。これは、すべてのリクエストに対してこれを処理するために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);
    }

HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)IEとFirefox bithにキャッシュを防ぐために作られた違い
マイケルKniskern

2
-1、これらのApplication_BeginRequest()で設定すると、キャッシュが必要になる可能性のあるアイテム(JavaScriptファイル、画像など)に対してキャッシュなしヘッダーが送信されます。まだ試していませんが、OPの場所(ASPページ自体にヘッダーを設定する)の方がおそらく良いでしょう。
Evan Haas

glabal.asaxに設定するのに最も近い方法であるため、この回答が機能することを期待していましたが、まだ喜びはありません
lawphotog 2013

5
@ Evan、Application_BeginRequestは、IISからASP.NETに送信される要求に対してのみ呼び出されます。多くの場合、CSS、JS、画像、フォントなどの静的ファイルは、IISからの静的ファイルと見なされ、ASP.NETランタイムに送信されない拡張子です。IISがすべての要求をASP.NETランタイムに送信するように設定されている場合、はい、ファイルが静的でキャッシュされている必要がある場合でも、これはすべての要求に適用されます。
Adam Carr

@アダム、理にかなっています。私は-1を元に戻しますが、SOは私の投票がロックされていると言います:-(
Evan Haas

2

さまざまな組み合わせを試しましたが、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>

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


7
これが何をするのかはわかりませんが、これらのブラウザの次のアップデートで失敗するはずの大きなファットハックのように見えます。
md1337 2012年

たとえば、web.archive.org / web / 20160112095216 / http://www.hunlock.com/blogs/…で説明されています。要約すると、onbeforeunloadイベントは銀行が使用するように実装され、ページがキャッシュされないようになっています。
ChrisW 2016年

1

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

お役に立てば幸いです。


0

no-storeタグをサイトに追加して、これがブラウザのキャッシュに違いをもたらすかどうかをテストします(Chromeがページをキャッシュしている場合があります)。また、この記事は、キャッシュが機能する方法と理由に関するドキュメントで非常に役立つことがわかりました。no-storeが信頼できない場合は、ETagの次の記事を見ていきます。

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.