Saya memiliki aplikasi ASP.NET MVC 3. Aplikasi ini meminta catatan melalui jQuery. jQuery memanggil kembali ke tindakan pengontrol yang mengembalikan hasil dalam format JSON. Saya belum dapat membuktikan ini, tetapi saya khawatir data saya mungkin akan di-cache.
Saya hanya ingin caching diterapkan pada tindakan tertentu, bukan untuk semua tindakan.
Apakah ada atribut yang bisa saya lakukan untuk memastikan bahwa data tidak di-cache? Jika tidak, bagaimana saya memastikan bahwa browser mendapat set rekaman baru setiap kali, bukannya set cache?
c#
jquery
.net
asp.net-mvc
asp.net-mvc-3
Pengembang JavaScript
sumber
sumber
Jawaban:
Untuk memastikan bahwa JQuery tidak melakukan caching hasilnya, pada metode ajax Anda, tuliskan yang berikut:
Atau untuk mencegah caching di MVC, kami membuat atribut kami sendiri, Anda bisa melakukan hal yang sama. Ini kode kami:
Kemudian hiasi saja pengontrol Anda dengan
[NoCache]
. ATAU untuk melakukannya untuk semua yang Anda bisa letakkan atribut pada kelas kelas dasar tempat Anda mewarisi pengontrol Anda (jika ada) seperti yang kami miliki di sini:Anda juga dapat menghias beberapa tindakan dengan atribut ini jika Anda membutuhkannya agar tidak dapat di-cache, alih-alih mendekorasi keseluruhan pengontrol.
Jika kelas atau tindakan Anda tidak memiliki
NoCache
saat itu diberikan di browser Anda dan Anda ingin memeriksa itu berfungsi, ingat bahwa setelah mengkompilasi perubahan yang Anda butuhkan untuk melakukan "penyegaran keras" (Ctrl + F5) di browser Anda. Sampai Anda melakukannya, browser Anda akan menyimpan versi cache lama, dan tidak akan menyegarkan dengan "refresh normal" (F5).sumber
Anda dapat menggunakan atribut cache bawaan untuk mencegah caching.
Untuk .net Framework:
[OutputCache(NoStore = true, Duration = 0)]
Untuk .net Core:
[ResponseCache(NoStore = true, Duration = 0)]
Perlu diketahui bahwa tidak mungkin memaksa browser untuk menonaktifkan caching. Yang terbaik yang dapat Anda lakukan adalah memberikan saran yang sebagian besar browser akan hormati, biasanya dalam bentuk header atau meta tag. Atribut dekorator ini akan menonaktifkan caching server dan juga menambahkan header ini:
Cache-Control: public, no-store, max-age=0
. Itu tidak menambahkan tag meta. Jika diinginkan, itu dapat ditambahkan secara manual dalam tampilan.Selain itu, JQuery dan kerangka kerja klien lainnya akan berupaya mengelabui browser agar tidak menggunakan versi sumber daya yang di-cache dengan menambahkan hal-hal ke url, seperti stempel waktu atau GUID. Ini efektif dalam membuat browser meminta sumber daya lagi tetapi tidak benar-benar mencegah caching.
Pada catatan akhir. Anda harus menyadari bahwa sumber daya juga dapat di-cache di antara server dan klien. ISP, proxy, dan perangkat jaringan lain juga menyimpan sumber daya dan mereka sering menggunakan aturan internal tanpa melihat sumber daya yang sebenarnya. Tidak banyak yang dapat Anda lakukan tentang ini. Berita baiknya adalah mereka biasanya melakukan cache untuk jangka waktu yang lebih pendek, seperti detik atau menit.
sumber
Cache-Control:public, no-store, max-age=0
. Itu tidak menambahkan tag meta. Jika diinginkan, itu dapat ditambahkan secara manual dalam tampilan.NoStore = true
danDuration = 0
(yang telah saya gunakan dengan sukses, terima kasih), tetapi efek tambahan apa yang akanVaryByParam = "None"
terjadi karena dua opsi lainnya memengaruhi semua permintaan terlepas dari parameter?Yang kamu butuhkan adalah:
atau, jika Anda ingin menonaktifkannya untuk seluruh Pengontrol:
Terlepas dari perdebatan dalam komentar di sini, ini cukup untuk menonaktifkan cache browser - ini menyebabkan ASP.Net memancarkan header respons yang memberi tahu browser dokumen segera kedaluwarsa:
sumber
Cache-Control
kepublic
max-age=0
tidak pernah berarti 'cache dinonaktifkan'. Ini hanya berarti bahwa konten respons harus dianggap segera basi , tetapi cache diizinkan untuk menyimpannya. Browser harus memvalidasi kesegaran konten basi yang di-cache sebelum menggunakannya, tetapi tidak wajib kecuali direktif tambahanmust-revalidate
ditentukan.Dalam aksi controller tambahkan ke header baris berikut
sumber
Inilah
NoCache
atribut yang dikemukakan oleh mattytommo, disederhanakan dengan menggunakan informasi dari jawaban Chris Moschini:sumber
max-age=0
tidak pernah berarti 'cache dinonaktifkan'. Ini hanya berarti bahwa konten respons harus dianggap segera basi , tetapi cache diizinkan untuk menyimpannya. Browser harus memvalidasi kesegaran konten basi yang di-cache sebelum menggunakannya, tetapi tidak wajib kecuali direktif tambahanmust-revalidate
ditentukan.no-cache
, yang masih memungkinkan caching tetapi mandat untuk memvalidasi ulang di server asal sebelum digunakan. Untuk menghindari caching bahkan divalidasi ulang Anda harus menambahkanno-store
bersama denganno-cache
. (no-store
sendirian jelas-jelas salah karena cache volatil diperbolehkan untuk men-cache konten yang ditandai sebagaino-store
.)Untuk MVC6 ( DNX ), tidak ada
System.Web.OutputCacheAttribute
Catatan: ketika Anda mengatur
NoStore
parameter Durasi tidak dipertimbangkan. Dimungkinkan untuk menetapkan durasi awal untuk pendaftaran pertama dan menimpanya dengan atribut khusus.Tapi kami punya
Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter
Dimungkinkan untuk mengganti filter awal dengan atribut khusus
Berikut ini adalah use case
sumber
Output Caching dalam MVC
sumber
Nilai atribut yang benar untuk Asp.Net MVC Core untuk mencegah caching browser (termasuk Internet Explorer 11 ) adalah:
seperti yang dijelaskan dalam dokumentasi Microsoft:
Caching respons di ASP.NET Core - NoStore dan Location.None
sumber
Solusi ASP.NET MVC 5:
App_Start/FilterConfig.cs
'sRegisterGlobalFilters
metode:OutputCache
arahanController
atauView
level yang berbeda. Untuk Kontroler biasa ituatau jika itu adalah
ApiController
itusumber