Semua panggilan ajax yang dikirim dari IE di-cache oleh Angular dan saya mendapatkan 304 response
untuk semua panggilan berikutnya. Meskipun permintaannya sama, responsnya tidak akan sama dalam kasus saya. Saya ingin menonaktifkan cache ini. Saya mencoba menambahkan cache attribute
ke $ http.get tapi tetap saja tidak membantu. Bagaimana mengatasi masalah ini?
javascript
caching
angularjs
Rahul
sumber
sumber
If-Modified-Since
merek sundulan IIS + iisnode lemparan 400 Bad Request untuk setiap file html dimuat melaluingInclude
danngView
. Dua header berikut memperbaiki masalah untuk saya (saya menarik mereka dari Chrome, yang tidak memiliki masalah caching):$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
If-Modified-Since = "0"
header merusak Tomcat (Masalah dengan tanggal header parsing, karena0
bukan nilai RFC yang valid ). Tetap menggunakan nilaiMon, 26 Jul 1997 05:00:00 GMT
saja.Anda dapat menambahkan querystring unik (saya percaya ini adalah apa yang jQuery lakukan dengan cache: opsi salah) pada permintaan.
Solusi yang mungkin lebih baik adalah jika Anda memiliki akses ke server, maka Anda dapat memastikan bahwa header yang diperlukan diatur untuk mencegah caching. Jika Anda menggunakan
ASP.NET MVC
jawaban ini mungkin bisa membantu.sumber
$http.get(url+ "?"+new Date().toString())
hanyalah representasi lain, tanpa menggunakan parameter tetapi menambahkannya ke string kueri.Anda dapat menambahkan interseptor.
Anda harus menghapus baris console.log setelah memverifikasi.
sumber
$log
jika Anda lupa mengeluarkannya.Saya hanya menambahkan tiga meta tag ke index.html pada proyek sudut, dan masalah cache diselesaikan di IE.
sumber
index.html
ketika kami melihat IE11 sedang caching permintaan AJAX: / Tapi mengkonfigurasi$httpProvider
seperti yang ditunjukkan dalam jawaban lain berfungsi dengan baik.Menggandakan jawaban saya di utas lain .
Untuk Angular 2 dan yang lebih baru , cara termudah untuk menambahkan
no-cache
header dengan menimpaRequestOptions
:Dan rujuk dalam modul Anda:
sumber
If-Modified-Since
tanggal yang jauh di masa lalu menggunakan metode di atas.)headers: req.headers .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache') .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
Yang dijamin bahwa saya telah bekerja adalah sesuatu seperti ini:
Aku harus menggabungkan 2 dari solusi di atas untuk menjamin pemakaian yang benar untuk semua metode, tetapi Anda dapat mengganti
common
denganget
atau metode yaitu lainnyaput
,post
,delete
untuk membuat karya ini untuk kasus yang berbeda.sumber
if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.common = {}; }
["If-Modified-Since"] = "0"
adalah ilegal dan dengan menghasilkan Permintaan Buruk pada beberapa bagian belakang. itu harus kencan.Baris ini hanya membantu saya (Angular 1.4.8):
UPD: Masalahnya adalah IE11 melakukan caching yang agresif. Ketika saya melihat ke Fiddler saya perhatikan bahwa dalam mode F12 permintaan mengirim "Pragma = no-cache" dan titik akhir diminta setiap kali saya mengunjungi halaman. Tetapi dalam mode normal titik akhir diminta hanya sekali pada saat pertama kali ketika saya mengunjungi halaman.
sumber
Untuk menghindari caching, satu opsi adalah memberikan URL yang berbeda untuk sumber daya atau data yang sama. Untuk menghasilkan URL yang berbeda, Anda dapat menambahkan string kueri acak ke akhir URL. Teknik ini berfungsi untuk permintaan JQuery, Angular atau jenis ajax lainnya.
sumber
Saya mendapatkannya diselesaikan menambahkan datetime sebagai angka acak:
sumber
Solusi di atas akan bekerja (buat url unik dengan menambahkan querystring param baru) tetapi saya lebih suka solusi yang diajukan [di sini]: Cara yang Lebih Baik untuk Mencegah Cache IE di AngularJS? , yang menangani ini di tingkat server karena tidak spesifik untuk IE. Maksud saya, jika sumber daya itu tidak perlu di-cache, lakukan di server (ini karena tidak ada hubungannya dengan browser yang digunakan; itu tidak sesuai dengan sumber daya).
Sebagai contoh di java dengan JAX-RS melakukannya secara programatik untuk JAX-RS v1 atau declativly untuk JAX-RS v2.
Saya yakin siapa pun akan mengetahui cara melakukannya
sumber
Ini agak tua tapi: Solusi seperti sudah usang. Biarkan server menangani cache atau tidak cache (dalam respons). Satu-satunya cara untuk menjamin tidak ada caching (memikirkan versi baru dalam produksi) adalah mengubah file js atau css dengan nomor versi. Saya melakukan ini dengan webpack.
sumber
Anda juga dapat mencoba di servce Anda untuk mengatur header seperti misalnya:
sumber
Solusi, sisi server, yang benar: Cara yang Lebih Baik untuk Mencegah Cache IE di AngularJS?
sumber
Masalah ini disebabkan oleh masalah caching IE seperti yang Anda katakan, Anda dapat mengujinya dalam mode debug IE dengan menekan f12 (ini akan berfungsi dengan baik dalam mode debug) .IE tidak akan mengambil data server setiap kali panggilan halaman, dibutuhkan data dari cache. Untuk menonaktifkan ini lakukan salah satu dari yang berikut:
// Sebelum (dikeluarkan satu)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName, {})
// Setelah (bekerja dengan baik)
this.httpService.get (this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName + "? DateTime =" + Tanggal baru (). getTime () + '', {cache: false})
$ httpProvider.defaults.headers.common ['Pragma'] = 'no-cache';
sumber
Saya baru saja menambahkan ini ke View dan mulai bekerja pada IE. Dikonfirmasi untuk bekerja pada Angular 2.
sumber
Sebuah opsi adalah menggunakan pendekatan sederhana untuk menambahkan Stempel Waktu dengan setiap permintaan tidak perlu menghapus cache.
sumber
Coba ini, itu bekerja untuk saya dalam kasus serupa: -
sumber