Menonaktifkan cache browser untuk semua browser dari ASP.NET

87

Saya mencari referensi pasti tentang kode ASP.NET apa yang diperlukan untuk menonaktifkan browser dari cache halaman. Ada banyak cara untuk mempengaruhi header HTTP dan meta tag dan saya mendapat kesan bahwa pengaturan yang berbeda diperlukan untuk membuat browser yang berbeda berperilaku dengan benar. Akan sangat bagus untuk mendapatkan sedikit referensi kode yang dikomentari untuk menunjukkan mana yang berfungsi untuk semua browser dan mana yang diperlukan untuk browser tertentu, termasuk versi.

Ada banyak sekali informasi tentang masalah ini di sana, tetapi saya belum menemukan referensi bagus yang menjelaskan manfaat dari setiap metode dan apakah teknik tertentu telah digantikan oleh API tingkat yang lebih tinggi.

Saya sangat tertarik dengan ASP.NET 3.5 SP1 tetapi akan lebih baik untuk mendapatkan jawaban untuk versi sebelumnya juga.

Entri blog ini Dua Perbedaan Penting antara Firefox dan Caching IE menjelaskan beberapa perbedaan perilaku protokol HTTP.

Kode contoh berikut menggambarkan jenis hal yang saya minati

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));
    }
}
Martin Hollingsworth
sumber
5
Saya akan mencoba menjawab jika saya tidak tahu betapa sangat mustahilnya tugas Anda. Mengontrol cache klien seperti mencoba menggunakan sumpit sepanjang 10 kaki untuk mengatur ulang furnitur.
Jeff Meatball Yang
Banyak sekali jawaban yang hanya mencakup sebagian dari masalah akan tetap sangat berharga. Silakan berikan 2 sen Anda.
Martin Hollingsworth

Jawaban:

98

Inilah yang kami gunakan di ASP.NET:

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

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

Ini menghentikan cache di Firefox dan IE, tetapi kami belum mencoba browser lain. Header respons berikut ditambahkan oleh pernyataan ini:

Cache-Control: no-cache, no-store
Pragma: no-cache
HttpWatchSupport
sumber
5
+1 Ini berfungsi untuk saya di Chrome, terima kasih banyak. Saya juga menggunakan Response.Cache.SetAllowResponseInBrowserHistory (true); untuk menghindari sejarah untuk menyimpan entri untuk setiap permintaan dari halaman yang sama.
daniloquio
12
Rupanya seseorang telah menemukan bahwa menggunakan SetCacheability dengan NoCache juga menonaktifkan cache keluaran ASP.NET (cache sisi server). Mereka menyarankan untuk menggunakan opsi ServerAndNoCache sebagai gantinya. codeclimber.net.nz/archive/2007/04/01/…
md1337
1
Untuk memperjelas komentar dalam potongan kode, metode utamanya adalah SetCacheability. SetNoStoreadalah solusi IE6. Lihat Mengapa no-cache dan no-store harus digunakan dalam respons HTTP? .
Edward Brey
3
FWIW ... Perlu menambahkan SetNoStore untuk IE10
felickz
Bagi mereka yang membaca halaman ini yang akan mengeluarkan PDF dinamis melalui https dan mengatur header cache seperti ini, harap berhati-hati terhadap IE8 berikut dan bug yang lebih rendah: stackoverflow.com/questions/1038707/…
Paddy
41

Untuk apa nilainya, saya hanya harus menangani ini di aplikasi ASP.NET MVC 3 saya. Berikut adalah blok kode yang saya gunakan di file Global.asax untuk menangani ini untuk semua permintaan.

    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);
    }
Adam Carr
sumber
The HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)membuat perbedaan untuk mencegah caching di bith IE dan FireFox
Michael Kniskern
2
-1, pengaturan di Application_BeginRequest () ini menyebabkan header no-cache dikirim untuk item yang mungkin ingin Anda cache (file JavaScript, gambar, dll). Saya belum mencobanya, tetapi lokasi OP (mengatur header di halaman ASP itu sendiri) mungkin lebih baik.
Evan Haas
Saya memang mengharapkan jawaban ini berfungsi karena ini adalah cara paling rapi untuk mengaturnya di glabal.asax tetapi belum ada kegembiraan
lawphotog
5
@ Evan, Application_BeginRequest hanya akan dipanggil untuk permintaan yang dikirim dari IIS ke ASP.NET. Sering kali, file statis seperti CSS, JS, Gambar, Font, dll. Adalah ekstensi yang dianggap file statis dari IIS dan tidak dikirim ke ASP.NET Runtime. Jika IIS diatur untuk mengirim semua permintaan ke runtime ASP.NET, maka ya, ini akan berlaku untuk semua permintaan, bahkan jika file tersebut statis dan harus di-cache.
Adam Carr
@Adam, masuk akal. Saya akan membatalkan -1 saya tetapi SO mengatakan suara saya terkunci dalam :-(
Evan Haas
2

Saya telah mencoba berbagai kombinasi dan gagal di FireFox. Sudah lama jadi jawaban di atas mungkin berfungsi dengan baik atau saya mungkin melewatkan sesuatu.

Apa yang selalu berhasil bagi saya adalah menambahkan yang berikut ini ke kepala setiap halaman, atau template (Halaman Master di .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>

Ini telah menonaktifkan semua cache di semua browser untuk saya tanpa gagal.

Steve
sumber
7
Tidak yakin apa yang seharusnya dilakukan ini, tetapi ini terlihat seperti peretasan besar yang pasti akan gagal di pembaruan berikutnya dari salah satu browser ini.
md1337
Ini dijelaskan di misalnya web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/… - secara ringkas acara onbeforeunload diimplementasikan untuk digunakan oleh bank dan mencegah halaman di-cache.
ChrisW
1

Ada dua pendekatan yang saya ketahui. Yang pertama adalah memberi tahu browser untuk tidak menyimpan halaman dalam cache. Mengatur Respons ke tidak ada cache mengurus itu, namun karena Anda curiga browser akan sering mengabaikan arahan ini. Pendekatan lainnya adalah menetapkan waktu tanggal tanggapan Anda ke suatu titik di masa mendatang. Saya yakin semua browser akan memperbaiki ini ke waktu saat ini ketika mereka menambahkan halaman ke cache, tetapi itu akan menunjukkan halaman sebagai yang lebih baru ketika perbandingan dibuat. Saya yakin mungkin ada beberapa kasus di mana perbandingan tidak dibuat. Saya tidak yakin dengan detailnya dan mereka berubah dengan setiap rilis browser baru. Catatan terakhir Saya lebih beruntung dengan halaman yang "menyegarkan" sendiri (petunjuk tanggapan lain). Penyegaran tampaknya kecil kemungkinannya berasal dari cache.

Semoga membantu.

Pat O
sumber
0

Saya akan menguji menambahkan tag no-store ke situs kami untuk melihat apakah ini membuat perbedaan pada cache browser (Chrome terkadang menyimpan halaman dalam cache). Saya juga menemukan artikel ini sangat berguna pada dokumentasi tentang bagaimana dan mengapa caching bekerja dan akan melihat ETag berikutnya jika no-store tidak dapat diandalkan:

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

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

The Coder
sumber