Tambah versi yang menunjukkan bahawa versi lama cached fail statik adalah terkini untuk mengelakkan daripada digunakan

Tarikh penciptaan halaman :

Oleh kerana peringkat depan panjang, jika anda mahu melihat hanya program, sila langkau.

Persekitaran

Visual Studio
  • Studio Visual 2019
ASP.NET Teras
  • 3.1 (Laman Cukur, MVC)

Perihtanya fail caching di laman Web

Apabila anda melawati halaman Web, sebagai tambahan kepada HTML, .js fail (Javascript), fail .css (stylesheets), dan fail imej dimuat turun kepada pelanggan untuk paparan dan pelaksanaan. Walau bagaimanapun, sesetengah fail imej adalah besar, dan memuat turunnya setiap kali boleh menjadi mahal. Juga, .js fail .css fail sering digunakan pada halaman lain, dan tidak perlu memuat turunnya setiap kali. Fail-fail ini mungkin disimpan buat sementara waktu dalam pelayar anda selepas memuat turun. Ini dipanggil caching.

Jika fail dicatakan, contohnya, HTML dimuat turun daripada pelayan Web apabila anda melawat halaman yang sama. Fail lain dilihat dan berjalan menggunakan fail tersimput tempatan tanpa memuat turunnya jika terdapat cache. Ini mengurangkan beban pada pelayan dan membolehkan pelanggan melihat halaman pada kelajuan tinggi tanpa memakan jalur lebar komunikasi.

Masalah yang disebabkan oleh caching

Sama ada fail yang diletakkan pada pelayan dan fail cached adalah sama secara amnya bergantung pada laluan fail yang diterangkan dalam HTML. Laluan fail yang sama pada dasarnya adalah fail cached. (Mungkin terdapat syarat-syarat lain, tetapi laluan fail pasti)

Berikut adalah contoh laluan fail. Parameter atribut daging jam dan src terpakai.

<!-- スタイルシート (.css) -->
<link rel="stylesheet" href="/css/site.css" />

<!-- 画像ファイル -->
<img src="/image/sample.png" alt="サンプル画像" />

<!-- JavaScript (.js) -->
<script src="/js/site.js"></script>

Walau bagaimanapun, tingkah laku ini boleh menjadi masalah.

Sebagai contoh, jika pengguna mempunyai versi 1 JavaScript fail apabila mereka mula-mula mengaksesnya, fail JavaScript versi 1 dicabut. Pelayan kemudian menerbitkan fail JavaScript versi 2. Jika laluan fail JavaScript adalah sama apabila pengguna melawat halaman yang sama, fail Javascript versi 1 cached tanpa memuat turun pelayan versi 2 JavaScript fail boleh digunakan. Ini boleh menyebabkan kecacatan yang tidak dimaksudkan oleh orang ramai.

Pada masa ini, saya fikir anda sering melihat "Cuba untuk memadam cache" sebagai salah satu tindakan balas di sebelah pengguna, tetapi ini mungkin menjadi punca.

Bagaimana untuk menangani masalah cache di sisi pelayan

Seperti yang dinyatakan di atas, sama ada fail cached digunakan bergantung sebahagian besarnya pada laluan fail (URL).

Oleh itu, apabila anda mengemas kini fail, anda boleh memaksanya untuk memuat turun fail baru dengan menukar nama fail.

Contohnya, jika fail versi 1

<link rel="stylesheet" href="/css/site.css" />

Apabila fail telah dikemaskini versi 2

<link rel="stylesheet" href="/css/site2.css" />

Site2 .css di sebelah pelanggan.

Walau bagaimanapun, jika anda melakukan ini secara manual, ia boleh menjadi rumit dan ralat terdedah kepada perubahan laluan dan menamakan semula fail fizikal.

Tambah parameter pertanyaan ke laluan fail

Cara kerja Web membolehkan anda menambah parameter pertanyaan dengan gabungan kekunci dan nilai selepas laluan. Dalam mekanisme caching pelanggan, walaupun fail fizikal adalah sama, jika parameter pertanyaan adalah berbeza, mereka akan diiktiraf sebagai fail berasingan. Parameter pertanyaan adalah nilai-nilai yang tidak mempunyai makna jika tidak ada tujuan penggunaan walaupun ia ditambah.

Parameter pertanyaan boleh ditambah ke laluan dalam format berikut:

<!-- クエリパラメータなし -->
<link rel="stylesheet" href="/css/site.css" />

<!-- クエリパラメータあり -->
<link rel="stylesheet" href="/css/site.css?key=value" />

Dengan menggunakan mekanisme ini, anda perlu menukar laluan, tetapi anda tidak perlu menamakan semula fail fizikal.

Tambah parameter pertanyaan secara automatik dalam atur cara (contoh buruk)

Dengan menambah parameter pertanyaan ini secara automatik dalam atur cara, Anda tidak perlu menukar laluan fail secara manual jika anda menukar fail statik.

Contoh mudah ialah menambah masa semasa untuk pertanyaan parameter apabila pengguna mengakses halaman Web. Ia sangat mudah kerana saya fikir anda boleh menulis dalam satu baris dalam mana-mana bahasa pengaturcaraan. Saya fikir contoh generasi kelihatan seperti ini:

<link rel="stylesheet" href="/css/site.css?20210223120000" />

Walau bagaimanapun, ini mempunyai kelemahan bahawa kelebihan caching hilang sama sekali. Laluan berubah setiap kali anda melawati halaman Web, walaupun ia adalah fail yang sama seperti yang sebelumnya. Kerana ia dikenali sebagai fail berasingan, fail css dimuat turun dari pelayan setiap kali. Versi fail yang lebih lama tidak lagi akan digunakan, tetapi ini adalah sama seperti tidak menggunakan ciri caching.

ASP.NET kawalan versi dengan menambah parameter pertanyaan dalam Teras

Alcause tidak ada pra-ASP.NET Core menyediakan penyelesaian standard untuk masalah caching ini.

Anda hanya perlu menambah atribut ke tag yang menerangkan asp-append-version="true" laluan fail seperti berikut:

<link rel="stylesheet" href="~/css/site.css" asp-append-version="true"/>
<img src="/image/sample.png" asp-append-version="true"/>
<script src="~/js/site.js" asp-append-version="true"></script>

Jika anda benar-benar melawat halaman selepas ia diterbitkan ke Web, ia akan berkembang seperti berikut:

<link rel="stylesheet" href="/css/site.css?v=S2ihmzMFFc3FWmBWsR-NiddZWa8kbyaQYBx2FDkIoHs" />
<img src="/image/sample.png?v=Z0tUqQmLt_3L_NSzPmkbZKxL8cMxglf08BwWb5Od5z4" />
<script src="/js/site.js?v=dLGP40S79Xnx6GqUthRF6NWvjvhQ1nOvdVSwaNcgG18"></script>

Rentetan rawak ditambah, tetapi ini tidak berubah setiap kali akses dibuat. Rentetan ini adalah nilai hash dan dijana berdasarkan kandungan fail yang dirujuk. Oleh itu, rentetan yang sama dijana selagi kandungan fail tidak berubah. Jika kandungan fail berubah, ia akan ditukar kepada rentetan baru.

Ini memastikan fail cached diutamakan kerana jika fail adalah sama, laluan adalah sama. Apabila fail dikemas kini, laluan berubah, jadi anda boleh memuat turun dan menggunakan fail baru.

Dengan cara asp-append-version="true" ini, atribut ini adalah standard hanya untuk fail statik yang diletakkan dalam folder wwwroot. Ambil perhatian bahawa rentetan rawak tidak diperluaskan apabila disetkan ke fail lain.

Mengenai atur cara sampel

Templat projek lalai .js asp-append-version tapak. Tapak.css tidak asp-append-version mempunyai lampiran kepadanya.

Program _Layout.cshtml sampel menambah tapak.js dan .css asp-append-version fail. Kami juga menambah tag img sebagai asp-append-version rujukan.