Penembolokan respons di ASP.NET Core

Oleh Rick Anderson dan Kirk Larkin

Melihat atau mengunduh kode sampel (cara mengunduh)

Penembolokan respons mengurangi jumlah permintaan yang dilakukan klien atau proksi ke server web. Penembolokan respons juga mengurangi jumlah pekerjaan yang dilakukan server web untuk menghasilkan respons. Penembolokan respons diatur dalam header.

Atribut ResponseCache mengatur header penembolokan respons. Klien dan proksi perantara harus mematuhi header untuk respons penembolokan di bawah RFC 9111: Penembolokan HTTP.

Untuk penembolokan sisi server yang mengikuti spesifikasi Penembolokan HTTP 1.1, gunakan Middleware Penembolokan Respons. Middleware dapat menggunakan ResponseCacheAttribute properti untuk memengaruhi perilaku penembolokan sisi server.

Middleware penembolokan respons:

  • Mengaktifkan respons server penembolokan berdasarkan header cache HTTP. Menerapkan semantik penembolokan HTTP standar. Cache berdasarkan header cache HTTP seperti proksi.
  • Biasanya tidak bermanfaat untuk aplikasi UI seperti Razor Pages karena browser umumnya mengatur header permintaan yang mencegah penembolokan. Penembolokan output, yang tersedia di ASP.NET Core 7.0 dan yang lebih baru, menguntungkan aplikasi UI. Dengan penembolokan output, konfigurasi memutuskan apa yang harus di-cache secara independen dari header HTTP.
  • Mungkin bermanfaat untuk permintaan GET publik atau HEAD API dari klien tempat Ketentuan penembolokan terpenuhi.

Untuk menguji penembolokan respons, gunakan Fiddler, atau alat lain yang dapat secara eksplisit mengatur header permintaan. Mengatur header secara eksplisit lebih disukai untuk menguji penembolokan. Untuk informasi selengkapnya, lihat Pemecahan masalah.

Penembolokan respons berbasis HTTP

RFC 9111: Penembolokan HTTP menjelaskan bagaimana cache Internet harus bereaksi. Header HTTP utama yang digunakan untuk penembolokan adalah Cache-Control, yang digunakan untuk menentukan arahan cache. Direktif mengontrol perilaku penembolokan karena permintaan beralih dari klien ke server dan sebagai respons membuat jalan mereka dari server kembali ke klien. Permintaan dan respons berpindah melalui server proksi, dan server proksi juga harus sesuai dengan spesifikasi Penembolokan HTTP 1.1.

Direktif umum Cache-Control diperlihatkan dalam tabel berikut.

Direktif Perbuatan
public Cache dapat menyimpan respons.
private Respons tidak boleh disimpan oleh cache bersama. Cache privat dapat menyimpan dan menggunakan kembali respons.
usia maks Klien tidak menerima respons yang usianya lebih besar dari jumlah detik yang ditentukan. Contoh: max-age=60 (60 detik), max-age=2592000 (1 bulan)
no-cache Pada permintaan: Cache tidak boleh menggunakan respons tersimpan untuk memenuhi permintaan. Server asal meregenerasi respons untuk klien, dan middleware memperbarui respons tersimpan dalam cache-nya.

Pada respons: Respons tidak boleh digunakan untuk permintaan berikutnya tanpa validasi pada server asal.
no-store Pada permintaan: Cache tidak boleh menyimpan permintaan.

Pada respons: Cache tidak boleh menyimpan bagian mana pun dari respons.

Header cache lain yang memainkan peran dalam penembolokan diperlihatkan dalam tabel berikut.

Header Function
Usia Perkiraan jumlah waktu dalam detik sejak respons dihasilkan atau berhasil divalidasi di server asal.
Berakhir Waktu setelah itu respons dianggap basi.
Pragma Ada untuk kompatibilitas mundur dengan cache HTTP/1.0 untuk perilaku pengaturan no-cache . Cache-Control Jika header ada, Pragma header diabaikan.
Bervariasi Menentukan bahwa respons yang di-cache tidak boleh dikirim kecuali semua Vary bidang header cocok dalam permintaan asli respons yang di-cache dan permintaan baru.

Penembolokan berbasis HTTP menghormati permintaan arahan Cache-Control

RFC 9111: Penembolokan HTTP (Bagian 5.2. Cache-Control) memerlukan cache untuk menghormati header yang valid Cache-Control yang dikirim oleh klien. Klien dapat membuat permintaan dengan no-cache nilai header dan memaksa server untuk menghasilkan respons baru untuk setiap permintaan.

Selalu menghormati header permintaan klien Cache-Control masuk akal jika Anda mempertimbangkan tujuan penembolokan HTTP. Di bawah spesifikasi resmi, penembolokan dimaksudkan untuk mengurangi latensi dan overhead jaringan untuk memenuhi permintaan di seluruh jaringan klien, proksi, dan server. Ini belum tentu merupakan cara untuk mengontrol beban di server asal.

Tidak ada kontrol pengembang atas perilaku penembolokan ini saat menggunakan Middleware Penembolokan Respons karena middleware mematuhi spesifikasi penembolokan resmi. Dukungan untuk penembolokan output untuk mengontrol beban server yang lebih baik ditambahkan di .NET 7. Untuk informasi selengkapnya, lihat Penembolokan output.

Atribut ResponseCache

ResponseCacheAttribute menentukan parameter yang diperlukan untuk mengatur header yang sesuai dalam penembolokan respons.

Peringatan

Nonaktifkan penembolokan untuk konten yang berisi informasi untuk klien terautentikasi. Penembolokan hanya boleh diaktifkan untuk konten yang tidak berubah berdasarkan identitas pengguna atau apakah pengguna masuk.

VaryByQueryKeys bervariasi respons tersimpan berdasarkan nilai daftar kunci kueri yang diberikan. Saat satu nilai * disediakan, middleware bervariasi respons oleh semua parameter string kueri permintaan.

Middleware Penembolokan Respons harus diaktifkan untuk mengatur VaryByQueryKeys properti. Jika tidak, pengecualian runtime dilemparkan. Tidak ada header HTTP yang sesuai untuk properti .VaryByQueryKeys Properti adalah fitur HTTP yang ditangani oleh Middleware Penembolokan Respons. Agar middleware melayani respons cache, string kueri dan nilai string kueri harus cocok dengan permintaan sebelumnya. Misalnya, pertimbangkan urutan permintaan dan hasil yang diperlihatkan dalam tabel berikut:

Minta Dikembalikan dari
http://example.com?key1=value1 Server
http://example.com?key1=value1 Middleware
http://example.com?key1=NewValue Server

Permintaan pertama dikembalikan oleh server dan di-cache di middleware. Permintaan kedua dikembalikan oleh middleware karena string kueri cocok dengan permintaan sebelumnya. Permintaan ketiga tidak berada di cache middleware karena nilai string kueri tidak cocok dengan permintaan sebelumnya.

ResponseCacheAttribute digunakan untuk mengonfigurasi dan membuat (melalui IFilterFactory) a Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter. ResponseCacheFilter melakukan pekerjaan memperbarui header HTTP dan fitur respons yang sesuai. Filter:

  • Menghapus header yang ada untuk Vary, , Cache-Controldan Pragma.
  • Menulis header yang sesuai berdasarkan properti yang diatur dalam ResponseCacheAttribute.
  • Memperbarui fitur HTTP penembolokan respons jika VaryByQueryKeys diatur.

Bervariasi

Header ini hanya ditulis ketika VaryByHeader properti diatur. Properti diatur ke Vary nilai properti. Sampel berikut menggunakan VaryByHeader properti :

[ApiController]
public class TimeController : ControllerBase
{
    [Route("api/[controller]")]
    [HttpGet]
    [ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
    public ContentResult GetTime() => Content(
                      DateTime.Now.Millisecond.ToString());

Lihat header respons dengan Fiddler atau alat lain. Header respons meliputi:

Cache-Control: public,max-age=30
Vary: User-Agent

Kode sebelumnya memerlukan penambahan layanan AddResponseCaching Middleware Penembolokan Respons ke koleksi layanan dan mengonfigurasi aplikasi untuk menggunakan middleware dengan UseResponseCaching metode ekstensi.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddResponseCaching();

var app = builder.Build();

app.UseHttpsRedirection();

// UseCors must be called before UseResponseCaching
//app.UseCors();

app.UseResponseCaching();

app.UseAuthorization();

app.MapControllers();

app.Run();

NoStore dan Location.None

NoStore mengambil alih sebagian besar properti lainnya. Ketika properti ini diatur ke true, Cache-Control header diatur ke no-store. Jika Location diatur ke None:

  • Cache-Control diatur ke no-store,no-cache.
  • Pragma diatur ke no-cache.

Jika NoStore adalah false dan Location adalah None, Cache-Control, dan Pragma diatur ke no-cache.

NoStore biasanya diatur ke true untuk halaman kesalahan. Berikut ini menghasilkan header respons yang menginstruksikan klien untuk tidak menyimpan respons.

[Route("api/[controller]/ticks")]
[HttpGet]
[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
public ContentResult GetTimeTicks() => Content(
                  DateTime.Now.Ticks.ToString());

Kode sebelumnya menyertakan header berikut dalam respons:

Cache-Control: no-store,no-cache
Pragma: no-cache

Untuk menerapkan ResponseCacheAttribute ke semua pengontrol MVC aplikasi atau Razor respons halaman Pages, tambahkan dengan filter MVC atau Razor filter Halaman.

Di aplikasi MVC:

builder.Services.AddControllersWithViews().AddMvcOptions(options => 
    options.Filters.Add(
        new ResponseCacheAttribute
        {
            NoStore = true, 
            Location = ResponseCacheLocation.None
        }));

Untuk pendekatan yang berlaku untuk Razor aplikasi Pages, lihat Menambahkan ResponseCacheAttribute ke daftar filter global MVC tidak berlaku untuk Razor Pages (dotnet/aspnetcore #18890). Contoh yang diberikan dalam komentar masalah ditulis untuk aplikasi yang menargetkan ASP.NET Core sebelum rilis API Minimal pada 6.0. Untuk aplikasi 6.0 atau yang lebih baru, ubah pendaftaran layanan dalam contoh menjadi builder.Services.AddSingleton... untuk Program.cs.

Lokasi dan Durasi

Untuk mengaktifkan penembolokan, Duration harus diatur ke nilai positif dan Location harus Any (default) atau Client. Kerangka kerja mengatur Cache-Control header ke nilai lokasi diikuti oleh max-age respons.

Locationopsi Any dan Client diterjemahkan ke dalam Cache-Control nilai public header dan private, masing-masing. Seperti yang disebutkan di bagian NoStore dan Location.None , atur Location untuk None mengatur header Cache-Control dan Pragma ke no-cache.

Location.Any (Cache-Control diatur ke public) menunjukkan bahwa klien atau proksi perantara dapat menyimpan nilai, termasuk Middleware Penembolokan Respons.

Location.Client(Cache-Control diatur ke private) menunjukkan bahwa hanya klien yang dapat menyimpan nilai. Tidak ada cache perantara yang harus menyimpan nilai, termasuk Middleware Penembolokan Respons.

Header kontrol cache memberikan panduan kepada klien dan proksi perantara kapan dan cara men-cache respons. Tidak ada jaminan bahwa klien dan proksi akan menghormati RFC 9111: Penembolokan HTTP. Middleware Penembolokan Respons selalu mengikuti aturan penembolokan yang ditata dengan spesifikasi.

Contoh berikut menunjukkan header yang dihasilkan dengan mengatur Duration dan meninggalkan nilai default Location :

[Route("api/[controller]/ms")]
[HttpGet]
[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public ContentResult GetTimeMS() => Content(
                  DateTime.Now.Millisecond.ToString());

Kode sebelumnya menyertakan header berikut dalam respons:

Cache-Control: public,max-age=10

Profil cache

Alih-alih menduplikasi pengaturan cache respons pada banyak atribut tindakan pengontrol, profil cache dapat dikonfigurasi sebagai opsi saat menyiapkan MVC/Razor Pages. Nilai yang ditemukan dalam profil cache yang dirujuk digunakan sebagai default oleh ResponseCacheAttribute dan ditimpa oleh properti apa pun yang ditentukan pada atribut .

Contoh berikut menunjukkan profil cache 30 detik:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCaching();
builder.Services.AddControllers(options =>
{
    options.CacheProfiles.Add("Default30",
        new CacheProfile()
        {
            Duration = 30
        });
});

var app = builder.Build();

app.UseHttpsRedirection();

// UseCors must be called before UseResponseCaching
//app.UseCors();

app.UseResponseCaching();

app.UseAuthorization();

app.MapControllers();

app.Run();

Kode berikut mereferensikan Default30 profil cache:

[ApiController]
[ResponseCache(CacheProfileName = "Default30")]
public class Time2Controller : ControllerBase
{
    [Route("api/[controller]")]
    [HttpGet]
    public ContentResult GetTime() => Content(
                      DateTime.Now.Millisecond.ToString());

    [Route("api/[controller]/ticks")]
    [HttpGet]
    public ContentResult GetTimeTicks() => Content(
                      DateTime.Now.Ticks.ToString());
}

Respons header yang dihasilkan oleh Default30 profil cache meliputi:

Cache-Control: public,max-age=30

Atribut [ResponseCache] dapat diterapkan ke:

  • Razor Halaman: Atribut tidak dapat diterapkan ke metode handler. Browser yang digunakan dengan aplikasi UI mencegah penembolokan respons.
  • Pengontrol MVC.
  • Metode tindakan MVC: Atribut tingkat metode mengambil alih pengaturan yang ditentukan dalam atribut tingkat kelas.

Kode berikut menerapkan [ResponseCache] atribut pada tingkat pengontrol dan tingkat metode:

[ApiController]
[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public class Time4Controller : ControllerBase
{
    [Route("api/[controller]")]
    [HttpGet]
    public ContentResult GetTime() => Content(
                      DateTime.Now.Millisecond.ToString());

    [Route("api/[controller]/ticks")]
    [HttpGet]
    public ContentResult GetTimeTicks() => Content(
                  DateTime.Now.Ticks.ToString());

    [Route("api/[controller]/ms")]
    [HttpGet]
    [ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
    public ContentResult GetTimeMS() => Content(
                      DateTime.Now.Millisecond.ToString());
}

Sumber Daya Tambahan:

Melihat atau mengunduh kode sampel (cara mengunduh)

Penembolokan respons mengurangi jumlah permintaan yang dilakukan klien atau proksi ke server web. Penembolokan respons juga mengurangi jumlah pekerjaan yang dilakukan server web untuk menghasilkan respons. Penembolokan respons dikontrol oleh header yang menentukan bagaimana Anda ingin klien, proksi, dan middleware untuk respons cache.

Berpartisipasi [ResponseCache] dalam mengatur header penembolokan respons. Klien dan proksi perantara harus mematuhi header untuk respons penembolokan di bawah RFC 9111: Penembolokan HTTP.

Untuk penembolokan sisi server yang mengikuti spesifikasi Penembolokan HTTP 1.1, gunakan Middleware Penembolokan Respons. Middleware dapat menggunakan [ResponseCache] properti untuk mengatur header penembolokan sisi server.

Penembolokan respons berbasis HTTP

RFC 9111: Penembolokan HTTP menjelaskan bagaimana cache Internet harus bereaksi. Header HTTP utama yang digunakan untuk penembolokan adalah Cache-Control, yang digunakan untuk menentukan arahan cache. Direktif mengontrol perilaku penembolokan karena permintaan beralih dari klien ke server dan sebagai respons membuat jalan mereka dari server kembali ke klien. Permintaan dan respons berpindah melalui server proksi, dan server proksi juga harus sesuai dengan spesifikasi Penembolokan HTTP 1.1.

Direktif umum Cache-Control diperlihatkan dalam tabel berikut.

Direktif Perbuatan
public Cache dapat menyimpan respons.
private Respons tidak boleh disimpan oleh cache bersama. Cache privat dapat menyimpan dan menggunakan kembali respons.
usia maks Klien tidak menerima respons yang usianya lebih besar dari jumlah detik yang ditentukan. Contoh: max-age=60 (60 detik), max-age=2592000 (1 bulan)
no-cache Pada permintaan: Cache tidak boleh menggunakan respons tersimpan untuk memenuhi permintaan. Server asal meregenerasi respons untuk klien, dan middleware memperbarui respons tersimpan dalam cache-nya.

Pada respons: Respons tidak boleh digunakan untuk permintaan berikutnya tanpa validasi pada server asal.
no-store Pada permintaan: Cache tidak boleh menyimpan permintaan.

Pada respons: Cache tidak boleh menyimpan bagian mana pun dari respons.

Header cache lain yang memainkan peran dalam penembolokan diperlihatkan dalam tabel berikut.

Header Function
Usia Perkiraan jumlah waktu dalam detik sejak respons dihasilkan atau berhasil divalidasi di server asal.
Berakhir Waktu setelah itu respons dianggap basi.
Pragma Ada untuk kompatibilitas mundur dengan cache HTTP/1.0 untuk perilaku pengaturan no-cache . Cache-Control Jika header ada, Pragma header diabaikan.
Bervariasi Menentukan bahwa respons yang di-cache tidak boleh dikirim kecuali semua Vary bidang header cocok dalam permintaan asli respons yang di-cache dan permintaan baru.

Penembolokan berbasis HTTP menghormati permintaan arahan Cache-Control

RFC 9111: Penembolokan HTTP (Bagian 5.2. Cache-Control) memerlukan cache untuk menghormati header yang valid Cache-Control yang dikirim oleh klien. Klien dapat membuat permintaan dengan no-cache nilai header dan memaksa server untuk menghasilkan respons baru untuk setiap permintaan.

Selalu menghormati header permintaan klien Cache-Control masuk akal jika Anda mempertimbangkan tujuan penembolokan HTTP. Di bawah spesifikasi resmi, penembolokan dimaksudkan untuk mengurangi latensi dan overhead jaringan untuk memenuhi permintaan di seluruh jaringan klien, proksi, dan server. Ini belum tentu merupakan cara untuk mengontrol beban di server asal.

Tidak ada kontrol pengembang atas perilaku penembolokan ini saat menggunakan Middleware Penembolokan Respons karena middleware mematuhi spesifikasi penembolokan resmi. Dukungan untuk penembolokan output untuk mengontrol beban server dengan lebih baik adalah proposal desain untuk rilis ASP.NET Core di masa mendatang. Untuk informasi selengkapnya, lihat Menambahkan dukungan untuk Penembolokan Output (dotnet/aspnetcore #27387).

Teknologi penembolokan lainnya di ASP.NET Core

Penembolokan dalam memori

Penembolokan dalam memori menggunakan memori server untuk menyimpan data yang di-cache. Jenis penembolokan ini cocok untuk satu server atau beberapa server menggunakan afinitas sesi. Afinitas sesi juga dikenal sebagai sesi lengket. Afinitas sesi berarti bahwa permintaan dari klien selalu dirutekan ke server yang sama untuk diproses.

Untuk informasi selengkapnya, lihat Cache dalam memori di ASP.NET Core dan Memecahkan masalah afinitas sesi Azure Application Gateway.

Cache Terdistribusi

Gunakan cache terdistribusi untuk menyimpan data dalam memori saat aplikasi dihosting di cloud atau farm server. Cache dibagikan di seluruh server yang memproses permintaan. Klien dapat mengirimkan permintaan yang ditangani oleh server mana pun dalam grup jika data yang di-cache untuk klien tersedia. ASP.NET Core berfungsi dengan cache terdistribusi SQL Server, Redis, dan NCache .

Untuk informasi selengkapnya, lihat Penembolokan terdistribusi di ASP.NET Core.

Pembantu Tag Cache

Cache konten dari tampilan MVC atau Razor Halaman dengan Pembantu Tag Cache. Pembantu Tag Cache menggunakan penembolokan dalam memori untuk menyimpan data.

Untuk informasi selengkapnya, lihat Pembantu Tag Cache di ASP.NET Core MVC.

Pembantu Tag Cache Terdistribusi

Cache konten dari tampilan MVC atau Razor Halaman dalam skenario cloud atau farm web terdistribusi dengan Bantuan Tag Singgahan Terdistribusi. Distributed Cache Tag Helper menggunakan SQL Server, Redis, atau NCache untuk menyimpan data.

Untuk informasi selengkapnya, lihat Pembantu Tag Cache Terdistribusi di ASP.NET Core.

Atribut ResponseCache

ResponseCacheAttribute menentukan parameter yang diperlukan untuk mengatur header yang sesuai dalam penembolokan respons.

Peringatan

Nonaktifkan penembolokan untuk konten yang berisi informasi untuk klien terautentikasi. Penembolokan hanya boleh diaktifkan untuk konten yang tidak berubah berdasarkan identitas pengguna atau apakah pengguna masuk.

VaryByQueryKeys bervariasi respons tersimpan berdasarkan nilai daftar kunci kueri yang diberikan. Saat satu nilai * disediakan, middleware bervariasi respons oleh semua parameter string kueri permintaan.

Middleware Penembolokan Respons harus diaktifkan untuk mengatur VaryByQueryKeys properti. Jika tidak, pengecualian runtime dilemparkan. Tidak ada header HTTP yang sesuai untuk properti .VaryByQueryKeys Properti adalah fitur HTTP yang ditangani oleh Middleware Penembolokan Respons. Agar middleware melayani respons cache, string kueri dan nilai string kueri harus cocok dengan permintaan sebelumnya. Misalnya, pertimbangkan urutan permintaan dan hasil yang diperlihatkan dalam tabel berikut.

Minta Hasil
http://example.com?key1=value1 Dikembalikan dari server.
http://example.com?key1=value1 Dikembalikan dari middleware.
http://example.com?key1=value2 Dikembalikan dari server.

Permintaan pertama dikembalikan oleh server dan di-cache di middleware. Permintaan kedua dikembalikan oleh middleware karena string kueri cocok dengan permintaan sebelumnya. Permintaan ketiga tidak berada di cache middleware karena nilai string kueri tidak cocok dengan permintaan sebelumnya.

ResponseCacheAttribute digunakan untuk mengonfigurasi dan membuat (melalui IFilterFactory) a Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter. ResponseCacheFilter melakukan pekerjaan memperbarui header HTTP dan fitur respons yang sesuai. Filter:

  • Menghapus header yang ada untuk Vary, , Cache-Controldan Pragma.
  • Menulis header yang sesuai berdasarkan properti yang diatur dalam ResponseCacheAttribute.
  • Memperbarui fitur HTTP penembolokan respons jika VaryByQueryKeys diatur.

Bervariasi

Header ini hanya ditulis ketika VaryByHeader properti diatur. Properti diatur ke Vary nilai properti. Sampel berikut menggunakan VaryByHeader properti :

[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public class Cache1Model : PageModel
{

Menggunakan aplikasi sampel, lihat header respons dengan alat jaringan browser. Header respons berikut dikirim dengan respons halaman Cache1:

Cache-Control: public,max-age=30
Vary: User-Agent

NoStore dan Location.None

NoStore mengambil alih sebagian besar properti lainnya. Ketika properti ini diatur ke true, Cache-Control header diatur ke no-store. Jika Location diatur ke None:

  • Cache-Control diatur ke no-store,no-cache.
  • Pragma diatur ke no-cache.

Jika NoStore adalah false dan Location adalah None, Cache-Control, dan Pragma diatur ke no-cache.

NoStore biasanya diatur ke true untuk halaman kesalahan. Halaman Cache2 di aplikasi sampel menghasilkan header respons yang menginstruksikan klien untuk tidak menyimpan respons.

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class Cache2Model : PageModel
{

Aplikasi sampel mengembalikan halaman Cache2 dengan header berikut:

Cache-Control: no-store,no-cache
Pragma: no-cache

Untuk menerapkan ResponseCacheAttribute ke semua pengontrol MVC aplikasi atau Razor respons halaman Pages, tambahkan dengan filter MVC atau Razor filter Halaman.

Di aplikasi MVC:

services.AddMvc().AddMvcOptions(options => 
    options.Filters.Add(
        new ResponseCacheAttribute
        {
            NoStore = true, 
            Location = ResponseCacheLocation.None
        }));

Untuk pendekatan yang berlaku untuk Razor aplikasi Pages, lihat Menambahkan ResponseCacheAttribute ke daftar filter global MVC tidak berlaku untuk Razor Pages (dotnet/aspnetcore #18890).

Lokasi dan Durasi

Untuk mengaktifkan penembolokan, Duration harus diatur ke nilai positif dan Location harus Any (default) atau Client. Kerangka kerja mengatur Cache-Control header ke nilai lokasi diikuti oleh max-age respons.

Locationopsi Any dan Client diterjemahkan ke dalam Cache-Control nilai public header dan private, masing-masing. Seperti yang disebutkan di bagian NoStore dan Location.None , atur Location untuk None mengatur header Cache-Control dan Pragma ke no-cache.

Location.Any (Cache-Control diatur ke public) menunjukkan bahwa klien atau proksi perantara dapat menyimpan nilai, termasuk Middleware Penembolokan Respons.

Location.Client(Cache-Control diatur ke private) menunjukkan bahwa hanya klien yang dapat menyimpan nilai. Tidak ada cache perantara yang harus menyimpan nilai, termasuk Middleware Penembolokan Respons.

Header kontrol cache hanya memberikan panduan kepada klien dan proksi perantara kapan dan cara men-cache respons. Tidak ada jaminan bahwa klien dan proksi akan menghormati RFC 9111: Penembolokan HTTP. Middleware Penembolokan Respons selalu mengikuti aturan penembolokan yang ditata dengan spesifikasi.

Contoh berikut menunjukkan model halaman Cache3 dari aplikasi sampel dan header yang dihasilkan dengan mengatur Duration dan meninggalkan nilai default Location :

[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public class Cache3Model : PageModel
{

Aplikasi sampel mengembalikan halaman Cache3 dengan header berikut:

Cache-Control: public,max-age=10

Profil cache

Alih-alih menduplikasi pengaturan cache respons pada banyak atribut tindakan pengontrol, profil cache dapat dikonfigurasi sebagai opsi saat menyiapkan MVC/Razor Pages di Startup.ConfigureServices. Nilai yang ditemukan dalam profil cache yang dirujuk digunakan sebagai default oleh ResponseCacheAttribute dan ditimpa oleh properti apa pun yang ditentukan pada atribut .

Siapkan profil cache. Contoh berikut menunjukkan profil cache 30 detik di aplikasi Startup.ConfigureServicessampel :

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddMvc(options =>
    {
        options.CacheProfiles.Add("Default30",
            new CacheProfile()
            {
                Duration = 30
            });
    });
}

Model halaman Cache4 aplikasi sampel mereferensikan Default30 profil cache:

[ResponseCache(CacheProfileName = "Default30")]
public class Cache4Model : PageModel
{

ResponseCacheAttribute dapat diterapkan ke:

  • Razor Halaman: Atribut tidak dapat diterapkan ke metode handler.
  • Pengontrol MVC.
  • Metode tindakan MVC: Atribut tingkat metode mengambil alih pengaturan yang ditentukan dalam atribut tingkat kelas.

Header yang dihasilkan diterapkan ke respons halaman Cache4 oleh Default30 profil cache:

Cache-Control: public,max-age=30

Sumber Daya Tambahan: