ASP.NET Core'da yanıtı önbelleğe alma

Yayımlayanlar Rick Anderson ve Kirk Larkin

Örnek kodu görüntüleme veya indirme (indirme)

Yanıt önbelleğe alma, bir istemcinin veya ara sunucunun web sunucusuna yaptığı istek sayısını azaltır. Yanıt önbelleğe alma, web sunucusunun yanıt oluşturmak için gerçekleştirdiği çalışma miktarını da azaltır. Yanıt önbelleğe alma üst bilgilerde ayarlanır.

ResponseCache özniteliği yanıt önbelleğe alma üst bilgilerini ayarlar. İstemciler ve ara proxy'ler , HTTP 1.1 Önbelleğe alma belirtimi altındaki yanıtları önbelleğe almak için üst bilgileri dikkate almalıdır.

HTTP 1.1 Önbelleğe Alma belirtimini izleyen sunucu tarafı önbelleğe alma için Yanıt Önbelleğe Alma Ara Yazılımını kullanın. Ara yazılım, sunucu tarafı önbelleğe alma davranışını etkilemek için özelliklerini kullanabilir ResponseCacheAttribute .

Yanıt önbelleğe alma ara yazılımı:

  • HTTP önbellek üst bilgilerine göre sunucu yanıtlarını önbelleğe almayı etkinleştirir. Standart HTTP önbelleğe alma semantiğini uygular. Ara sunucular gibi HTTP önbellek üst bilgilerini temel alan önbellekler.
  • Tarayıcılar genellikle önbelleğe almayı engelleyen istek üst bilgileri ayarladığından, Sayfalar gibi Razor kullanıcı arabirimi uygulamaları için yararlı olmaz. ASP.NET Core 7.0 ve sonraki sürümlerde kullanılabilen çıktı önbelleğe alma, kullanıcı arabirimi uygulamalarından yararlanır. Çıkış önbelleğe alma ile yapılandırma, HTTP üst bilgilerinden bağımsız olarak nelerin önbelleğe alınması gerektiğine karar verir.
  • Önbelleğe alma koşullarının karşılandığı istemcilerden gelen genel GET veya HEAD API istekleri için yararlı olabilir.

Yanıt önbelleğe almayı test etmek için Fiddler, Postman veya istek üst bilgilerini açıkça ayarlayabilen başka bir aracı kullanın. Üst bilgileri açıkça ayarlamak, önbelleğe alma testi için tercih edilir. Daha fazla bilgi için bkz. Sorun giderme.

HTTP tabanlı yanıt önbelleğe alma

HTTP 1.1 Önbelleğe alma belirtimi, İnternet önbelleklerinin nasıl davranması gerektiğini açıklar. Önbelleğe alma için kullanılan birincil HTTP üst bilgisi, önbellek yönergelerini belirtmek için kullanılan Cache-Control'dür. İstekler istemcilerden sunuculara ve yanıtlar sunuculardan istemcilere geri dönerken yönergeleri önbelleğe alma davranışını denetler. İstekler ve yanıtlar ara sunucular arasında taşınır ve proxy sunucuları da HTTP 1.1 Önbelleğe alma belirtimine uygun olmalıdır.

Ortak Cache-Control yönergeler aşağıdaki tabloda gösterilmiştir.

Yönergesi Eylem
genel Önbellek yanıtı depolar.
Özel Yanıt, paylaşılan bir önbellek tarafından depolanmamalıdır. Özel önbellek yanıtı depolayıp yeniden kullanabilir.
max-age İstemci, yaşı belirtilen saniye sayısından büyük olan bir yanıtı kabul etmez. Örnekler: max-age=60 (60 saniye), max-age=2592000 (1 ay)
önbellek yok İsteklerde: Önbellek, isteği karşılamak için depolanmış yanıt kullanmamalıdır. Kaynak sunucu istemcinin yanıtını yeniden oluşturur ve ara yazılım, depolanan yanıtı önbelleğinde güncelleştirir.

Yanıtlarda: Yanıt, kaynak sunucuda doğrulama yapılmadan sonraki bir istek için kullanılmamalıdır.
mağaza yok İsteklerde: Önbellek isteği depolamamalıdır.

Yanıtlarda: Önbellek yanıtın herhangi bir bölümünü depolamamalıdır.

Önbelleğe almada rol oynayan diğer önbellek üst bilgileri aşağıdaki tabloda gösterilmiştir.

Üst bilgi İşlev
Age Yanıtın kaynak sunucuda oluşturulmasından veya başarıyla doğrulanmasından bu yana saniye cinsinden süre tahmini.
Sona eri -yor Yanıtın eski olarak kabul edildiği süre.
Pragma Davranışı ayarlamak no-cache için HTTP/1.0 önbellekleriyle geriye dönük uyumluluk için vardır. Cache-Control Üst bilgi varsa, Pragma üst bilgi yoksayılır.
Değiş Üst bilgi alanlarının tümü hem önbelleğe alınmış yanıtın Vary özgün isteğinde hem de yeni istekte eşleşmediği sürece önbelleğe alınmış yanıtın gönderilmemesi gerektiğini belirtir.

HTTP tabanlı önbelleğe alma, istek Cache-Control yönergelerine uyar

Cache-Control üst bilgisi için HTTP 1.1 Önbelleğe alma belirtimi, istemci tarafından gönderilen geçerli Cache-Control bir üst bilgiyi kabul etmek için bir önbellek gerektirir. İstemci üst no-cache bilgi değeriyle istek yapabilir ve sunucuyu her istek için yeni bir yanıt oluşturmaya zorlayabilir.

HTTP önbelleğe alma hedefini dikkate alırsanız istemci Cache-Control isteği üst bilgilerini her zaman dikkate almanız mantıklıdır. Resmi belirtim kapsamında önbelleğe alma, istemciler, ara sunucular ve sunuculardan oluşan bir ağ üzerinden istekleri karşılamanın gecikme süresini ve ağ yükünü azaltmaya yöneliktir. Bu, bir kaynak sunucudaki yükü denetlemenin bir yolu olmayabilir.

Ara yazılım resmi önbelleğe alma belirtimine uygun olduğundan Yanıt Önbelleğe Alma Ara Yazılımını kullanırken bu önbelleğe alma davranışı üzerinde geliştirici denetimi yoktur. Sunucu yükünü daha iyi denetlemek için çıktı önbelleğe alma desteği, gelecekteki bir ASP.NET Core sürümü için bir tasarım teklifidir. Daha fazla bilgi için bkz . Çıktı Önbelleği için destek ekleme (dotnet/aspnetcore #27387).

ResponseCache özniteliği

, ResponseCacheAttribute yanıt önbelleğe almada uygun üst bilgileri ayarlamak için gereken parametreleri belirtir.

Uyarı

Kimliği doğrulanmış istemciler için bilgi içeren içerik için önbelleğe almayı devre dışı bırakın. Önbelleğe alma yalnızca kullanıcının kimliğine veya kullanıcının oturum açıp açmadığına bağlı olarak değişmeyen içerik için etkinleştirilmelidir.

VaryByQueryKeys depolanan yanıtı verilen sorgu anahtarları listesinin değerlerine göre değişir. Tek bir değeri * sağlandığında ara yazılım, yanıtları tüm istek sorgu dizesi parametrelerine göre değişir.

Özelliği ayarlamak VaryByQueryKeys için Yanıt Önbelleğe Alma Ara Yazılımı etkinleştirilmelidir. Aksi takdirde, bir çalışma zamanı özel durumu oluşturulur. Özelliği için VaryByQueryKeys karşılık gelen bir HTTP üst bilgisi yok. özelliği, Yanıt Önbelleğe Alma Ara Yazılımı tarafından işlenen bir HTTP özelliğidir. Ara yazılımının önbelleğe alınmış bir yanıt sunması için sorgu dizesi ve sorgu dizesi değeri önceki bir istekle eşleşmelidir. Örneğin, aşağıdaki tabloda gösterilen istek ve sonuç dizisini göz önünde bulundurun:

İstek Döndürülen kaynak
http://example.com?key1=value1 Sunucu
http://example.com?key1=value1 Ara yazılım
http://example.com?key1=NewValue Sunucu

İlk istek sunucu tarafından döndürülür ve ara yazılımda önbelleğe alınır. sorgu dizesi önceki istekle eşleştiğinden ikinci istek ara yazılım tarafından döndürülür. Sorgu dizesi değeri önceki bir istekle eşleşmediğinden üçüncü istek ara yazılım önbelleğinde değil.

ResponseCacheAttribute, bir yapılandırmak ve oluşturmak (aracılığıylaIFilterFactory) Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilteriçin kullanılır. , ResponseCacheFilter yanıtın uygun HTTP üst bilgilerini ve özelliklerini güncelleştirme işini gerçekleştirir. Filtre:

  • , Cache-Controlve Pragmaiçin Varyvarolan tüm üst bilgileri kaldırır.
  • içinde ayarlanan ResponseCacheAttributeözelliklere göre uygun üst bilgileri yazar.
  • Ayarlandıysa VaryByQueryKeys yanıt önbelleğe alma HTTP özelliğini Güncelleştirmeler.

Değiş

Bu üst bilgi yalnızca özellik ayarlandığında yazılır VaryByHeader . özelliği, özelliğin Vary değerine ayarlanır. Aşağıdaki örnek özelliğini VaryByHeader kullanır:

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

Fiddler veya başka bir araçla yanıt üst bilgilerini görüntüleyin. Yanıt üst bilgileri şunlardır:

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

Yukarıdaki kod, Yanıt Önbelleğe Alma Ara Yazılımı hizmetlerinin AddResponseCaching hizmet koleksiyonuna eklenmesini gerektirir ve uygulamayı uzantı yöntemiyle UseResponseCaching ara yazılımı kullanacak şekilde yapılandırılır.

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 ve Location.None

NoStore diğer özelliklerin çoğunu geçersiz kılar. Bu özellik olarak ayarlandığında trueCache-Control üst bilgi olarak ayarlanırno-store. olarak ayarlanırsa LocationNone:

  • Cache-Control olarak ayarlanır no-store,no-cache.
  • Pragma olarak ayarlanır no-cache.

false ve NoStoreLocation ise None, Cache-Controlve Pragma olarak ayarlanırno-cache.

NoStore genellikle hata sayfaları için olarak true ayarlanır. Aşağıdakiler, istemciye yanıtı depolamamasını belirten yanıt üst bilgileri oluşturur.

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

Yukarıdaki kod yanıtta aşağıdaki üst bilgileri içerir:

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

uygulamasını uygulamanın tüm MVC denetleyicisine veya Razor Sayfalar sayfası yanıtlarına uygulamak ResponseCacheAttribute için, bunu bir MVC filtresi veya Razor Sayfalar filtresiyle ekleyin.

MVC uygulamasında:

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

Sayfalar uygulamalarına uygulanan bir yaklaşım için Razor bkz. MVC genel filtre listesine ekleme ResponseCacheAttribute Sayfalar için Razor geçerli değil (dotnet/aspnetcore #18890). Sorun açıklamasında sağlanan örnek, Minimum API'lerin 6.0 sürümünden önce ASP.NET Core hedefleyen uygulamalar için yazılmıştır. 6.0 veya üzeri uygulamalar için, örnekteki hizmet kaydını için Program.csolarak builder.Services.AddSingleton... değiştirin.

Konum ve Süre

Önbelleğe almayı etkinleştirmek için pozitif Duration bir değere ayarlanmalıdır ve Location (varsayılan) veya Clientolmalıdır Any . Çerçeve, üst bilgiyi konum değerine ve ardından yanıtın max-age değerine ayarlarCache-Control.

Location'nin seçenekleri Any ve Client sırasıyla ve privateüst bilgi değerlerine public çevrilirCache-Control. NoStore ve Location.None bölümünde belirtildiği gibi, LocationNone ve üst bilgilerini no-cacheolarak Pragma ayarlar.Cache-Control

Location.Any(Cache-Control olarak publicayarlanır), istemcinin veya herhangi bir ara ara sunucusunun, Yanıt Önbelleğe Alma Ara Yazılımı da dahil olmak üzere değeri önbelleğe alabileceğini gösterir.

Location.Client (Cache-Control olarak ayarlanır private) değeri yalnızca istemcinin önbelleğe alabileceğini gösterir. Hiçbir ara önbellek , Yanıt Önbelleğe Alma Ara Yazılımı dahil olmak üzere değeri önbelleğe almamalıdır.

Önbellek denetimi üst bilgileri, istemcilere ve ara ara sunuculara yanıtların ne zaman ve nasıl önbelleğe alınacakları konusunda rehberlik sağlar. İstemcilerin ve proxy'lerin HTTP 1.1 Önbelleğe alma belirtimini yerine getirmesi garanti edilmez. Yanıt Önbelleğe Alma Ara Yazılımı her zaman belirtim tarafından belirtilen önbelleğe alma kurallarına uyar.

Aşağıdaki örnekte, varsayılan Location değer ayarlanıp Duration bırakılarak oluşturulan üst bilgiler gösterilmektedir:

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

Yukarıdaki kod yanıtta aşağıdaki üst bilgileri içerir:

Cache-Control: public,max-age=10

Önbellek profilleri

Birçok denetleyici eylemi özniteliğinde yanıt önbelleği ayarlarını yinelemek yerine, önbellek profilleri MVC/Razor Sayfalar ayarlanırken seçenek olarak yapılandırılabilir. Başvurulan önbellek profilinde bulunan değerler, tarafından varsayılan ResponseCacheAttribute olarak kullanılır ve özniteliğinde belirtilen özellikler tarafından geçersiz kılınır.

Aşağıdaki örnekte 30 saniyelik önbellek profili gösterilmektedir:

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();

Aşağıdaki kod önbellek profiline başvurur Default30 :

[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());
}

Önbellek profili tarafından elde edilen üst bilgi yanıtı şunları Default30 içerir:

Cache-Control: public,max-age=30

[ResponseCache] özniteliği şu özelliklere uygulanabilir:

  • Razor Sayfalar: Öznitelikler işleyici yöntemlerine uygulanamaz. Kullanıcı arabirimi uygulamalarıyla kullanılan tarayıcılar yanıt önbelleğe almayı engeller.
  • MVC denetleyicileri.
  • MVC eylem yöntemleri: Yöntem düzeyi öznitelikler, sınıf düzeyi özniteliklerde belirtilen ayarları geçersiz kılar.

Aşağıdaki kod, denetleyici düzeyinde ve yöntem düzeyinde özniteliğini uygular [ResponseCache] :

[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());
}

Ek kaynaklar

Örnek kodu görüntüleme veya indirme (indirme)

Yanıt önbelleğe alma, bir istemcinin veya ara sunucunun web sunucusuna yaptığı istek sayısını azaltır. Yanıt önbelleğe alma, web sunucusunun yanıt oluşturmak için gerçekleştirdiği çalışma miktarını da azaltır. Yanıt önbelleğe alma, istemci, ara sunucu ve ara yazılımların yanıtları önbelleğe alma şeklini belirten üst bilgiler tarafından denetlenmektedir.

, [ResponseCache] yanıt önbelleğe alma üst bilgilerini ayarlamaya katılır. İstemciler ve ara proxy'ler , HTTP 1.1 Önbelleğe alma belirtimi altındaki yanıtları önbelleğe almak için üst bilgileri dikkate almalıdır.

HTTP 1.1 Önbelleğe Alma belirtimini izleyen sunucu tarafı önbelleğe alma için Yanıt Önbelleğe Alma Ara Yazılımını kullanın. Ara yazılım, sunucu tarafı önbelleğe alma üst bilgilerini ayarlamak için özellikleri kullanabilir [ResponseCache] .

HTTP tabanlı yanıt önbelleğe alma

HTTP 1.1 Önbelleğe alma belirtimi, İnternet önbelleklerinin nasıl davranması gerektiğini açıklar. Önbelleğe alma için kullanılan birincil HTTP üst bilgisi, önbellek yönergelerini belirtmek için kullanılan Cache-Control'dür. İstekler istemcilerden sunuculara ve yanıtlar sunuculardan istemcilere geri dönerken yönergeleri önbelleğe alma davranışını denetler. İstekler ve yanıtlar ara sunucular arasında taşınır ve proxy sunucuları da HTTP 1.1 Önbelleğe alma belirtimine uygun olmalıdır.

Ortak Cache-Control yönergeler aşağıdaki tabloda gösterilmiştir.

Yönergesi Eylem
genel Önbellek yanıtı depolar.
Özel Yanıt, paylaşılan bir önbellek tarafından depolanmamalıdır. Özel önbellek yanıtı depolayıp yeniden kullanabilir.
max-age İstemci, yaşı belirtilen saniye sayısından büyük olan bir yanıtı kabul etmez. Örnekler: max-age=60 (60 saniye), max-age=2592000 (1 ay)
önbellek yok İsteklerde: Önbellek, isteği karşılamak için depolanmış yanıt kullanmamalıdır. Kaynak sunucu istemcinin yanıtını yeniden oluşturur ve ara yazılım, depolanan yanıtı önbelleğinde güncelleştirir.

Yanıtlarda: Yanıt, kaynak sunucuda doğrulama yapılmadan sonraki bir istek için kullanılmamalıdır.
mağaza yok İsteklerde: Önbellek isteği depolamamalıdır.

Yanıtlarda: Önbellek yanıtın herhangi bir bölümünü depolamamalıdır.

Önbelleğe almada rol oynayan diğer önbellek üst bilgileri aşağıdaki tabloda gösterilmiştir.

Üst bilgi İşlev
Age Yanıtın kaynak sunucuda oluşturulmasından veya başarıyla doğrulanmasından bu yana saniye cinsinden süre tahmini.
Sona eri -yor Yanıtın eski olarak kabul edildiği süre.
Pragma Davranışı ayarlamak no-cache için HTTP/1.0 önbellekleriyle geriye dönük uyumluluk için vardır. Cache-Control Üst bilgi varsa, Pragma üst bilgi yoksayılır.
Değiş Üst bilgi alanlarının tümü hem önbelleğe alınmış yanıtın Vary özgün isteğinde hem de yeni istekte eşleşmediği sürece önbelleğe alınmış yanıtın gönderilmemesi gerektiğini belirtir.

HTTP tabanlı önbelleğe alma, istek Cache-Control yönergelerine uyar

Cache-Control üst bilgisi için HTTP 1.1 Önbelleğe alma belirtimi, istemci tarafından gönderilen geçerli Cache-Control bir üst bilgiyi kabul etmek için bir önbellek gerektirir. İstemci üst no-cache bilgi değeriyle istek yapabilir ve sunucuyu her istek için yeni bir yanıt oluşturmaya zorlayabilir.

HTTP önbelleğe alma hedefini dikkate alırsanız istemci Cache-Control isteği üst bilgilerini her zaman dikkate almanız mantıklıdır. Resmi belirtim kapsamında önbelleğe alma, istemciler, ara sunucular ve sunuculardan oluşan bir ağ üzerinden istekleri karşılamanın gecikme süresini ve ağ yükünü azaltmaya yöneliktir. Bu, bir kaynak sunucudaki yükü denetlemenin bir yolu olmayabilir.

Ara yazılım resmi önbelleğe alma belirtimine uygun olduğundan Yanıt Önbelleğe Alma Ara Yazılımını kullanırken bu önbelleğe alma davranışı üzerinde geliştirici denetimi yoktur. Sunucu yükünü daha iyi denetlemek için çıktı önbelleğe alma desteği, gelecekteki bir ASP.NET Core sürümü için bir tasarım teklifidir. Daha fazla bilgi için bkz . Çıktı Önbelleği için destek ekleme (dotnet/aspnetcore #27387).

ASP.NET Core'deki diğer önbelleğe alma teknolojisi

Bellek içi önbellek

Bellek içi önbelleğe alma, önbelleğe alınmış verileri depolamak için sunucu belleğini kullanır. Bu önbelleğe alma türü, oturum benzimi kullanan tek bir sunucu veya birden çok sunucu için uygundur. Oturum benzitesi , yapışkan oturumlar olarak da bilinir. Oturum benzimi, bir istemciden gelen isteklerin her zaman işlenmek üzere aynı sunucuya yönlendirildiğini gösterir.

Daha fazla bilgi için bkz. ASP.NET Core bellek içi önbelleğe alma ve Azure Application Gateway oturum benşimi sorunlarını giderme.

Dağıtılmış Önbellek

Uygulama bir bulutta veya sunucu grubunda barındırıldığında verileri bellekte depolamak için dağıtılmış önbellek kullanın. Önbellek, istekleri işleyen sunucular arasında paylaşılır. İstemci için önbelleğe alınmış veriler varsa, istemci gruptaki herhangi bir sunucu tarafından işlenen bir istek gönderebilir. ASP.NET Core SQL Server, Redis ve NCache dağıtılmış önbellekleriyle çalışır.

Daha fazla bilgi için bkz. ASP.NET Core dağıtılmış önbelleğe alma.

Önbellek Etiketi Yardımcısı

İçeriği bir MVC görünümünden veya Razor Önbellek Etiketi Yardımcısı ile Sayfadan önbelleğe alın. Önbellek Etiketi Yardımcısı, verileri depolamak için bellek içi önbelleğe alma kullanır.

Daha fazla bilgi için bkz. ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı.

Dağıtılmış Önbellek Etiketi Yardımcısı

Dağıtılmış Önbellek Etiketi Yardımcısı ile dağıtılmış bulut veya Razor web grubu senaryolarında bir MVC görünümünden veya Sayfadan içeriği önbelleğe alın. Dağıtılmış Önbellek Etiketi Yardımcısı verileri depolamak için SQL Server, Redis veya NCache kullanır.

Daha fazla bilgi için bkz. ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı.

ResponseCache özniteliği

, ResponseCacheAttribute yanıt önbelleğe almada uygun üst bilgileri ayarlamak için gereken parametreleri belirtir.

Uyarı

Kimliği doğrulanmış istemciler için bilgi içeren içerik için önbelleğe almayı devre dışı bırakın. Önbelleğe alma yalnızca kullanıcının kimliğine veya kullanıcının oturum açıp açmadığına bağlı olarak değişmeyen içerik için etkinleştirilmelidir.

VaryByQueryKeys depolanan yanıtı verilen sorgu anahtarları listesinin değerlerine göre değişir. Tek bir değeri * sağlandığında ara yazılım, yanıtları tüm istek sorgu dizesi parametrelerine göre değişir.

Özelliği ayarlamak VaryByQueryKeys için Yanıt Önbelleğe Alma Ara Yazılımı etkinleştirilmelidir. Aksi takdirde, bir çalışma zamanı özel durumu oluşturulur. Özelliği için VaryByQueryKeys karşılık gelen bir HTTP üst bilgisi yok. özelliği, Yanıt Önbelleğe Alma Ara Yazılımı tarafından işlenen bir HTTP özelliğidir. Ara yazılımının önbelleğe alınmış bir yanıt sunması için sorgu dizesi ve sorgu dizesi değeri önceki bir istekle eşleşmelidir. Örneğin, aşağıdaki tabloda gösterilen istek ve sonuç dizisini göz önünde bulundurun.

İstek Sonuç
http://example.com?key1=value1 Sunucudan döndürüldü.
http://example.com?key1=value1 Ara yazılımdan döndürüldü.
http://example.com?key1=value2 Sunucudan döndürüldü.

İlk istek sunucu tarafından döndürülür ve ara yazılımda önbelleğe alınır. sorgu dizesi önceki istekle eşleştiğinden ikinci istek ara yazılım tarafından döndürülür. Sorgu dizesi değeri önceki bir istekle eşleşmediğinden üçüncü istek ara yazılım önbelleğinde değil.

ResponseCacheAttribute, bir yapılandırmak ve oluşturmak (aracılığıylaIFilterFactory) Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilteriçin kullanılır. , ResponseCacheFilter yanıtın uygun HTTP üst bilgilerini ve özelliklerini güncelleştirme işini gerçekleştirir. Filtre:

  • , Cache-Controlve Pragmaiçin Varyvarolan tüm üst bilgileri kaldırır.
  • içinde ayarlanan ResponseCacheAttributeözelliklere göre uygun üst bilgileri yazar.
  • Ayarlandıysa VaryByQueryKeys yanıt önbelleğe alma HTTP özelliğini Güncelleştirmeler.

Değiş

Bu üst bilgi yalnızca özellik ayarlandığında yazılır VaryByHeader . özelliği, özelliğin Vary değerine ayarlanır. Aşağıdaki örnek özelliğini VaryByHeader kullanır:

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

Örnek uygulamayı kullanarak, tarayıcının ağ araçlarıyla yanıt üst bilgilerini görüntüleyin. Aşağıdaki yanıt üst bilgileri Cache1 sayfa yanıtıyla gönderilir:

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

NoStore ve Location.None

NoStore diğer özelliklerin çoğunu geçersiz kılar. Bu özellik olarak ayarlandığında trueCache-Control üst bilgi olarak ayarlanırno-store. olarak ayarlanırsa LocationNone:

  • Cache-Control olarak ayarlanır no-store,no-cache.
  • Pragma olarak ayarlanır no-cache.

false ve NoStoreLocation ise None, Cache-Controlve Pragma olarak ayarlanırno-cache.

NoStore genellikle hata sayfaları için olarak true ayarlanır. Örnek uygulamadaki Cache2 sayfası, istemciye yanıtı depolamamasını belirten yanıt üst bilgileri oluşturur.

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

Örnek uygulama, aşağıdaki üst bilgileri içeren Cache2 sayfasını döndürür:

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

uygulamasını uygulamanın tüm MVC denetleyicisine veya Razor Sayfalar sayfası yanıtlarına uygulamak ResponseCacheAttribute için, bunu bir MVC filtresi veya Razor Sayfalar filtresiyle ekleyin.

MVC uygulamasında:

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

Sayfalar uygulamalarına uygulanan bir yaklaşım için Razor bkz. MVC genel filtre listesine ekleme ResponseCacheAttribute Sayfalar için Razor geçerli değil (dotnet/aspnetcore #18890).

Konum ve Süre

Önbelleğe almayı etkinleştirmek için pozitif Duration bir değere ayarlanmalıdır ve Location (varsayılan) veya Clientolmalıdır Any . Çerçeve, üst bilgiyi konum değerine ve ardından yanıtın max-age değerine ayarlarCache-Control.

Location'nin seçenekleri Any ve Client sırasıyla ve privateüst bilgi değerlerine public çevrilirCache-Control. NoStore ve Location.None bölümünde belirtildiği gibi, LocationNone ve üst bilgilerini no-cacheolarak Pragma ayarlar.Cache-Control

Location.Any(Cache-Control olarak publicayarlanır), istemcinin veya herhangi bir ara ara sunucusunun, Yanıt Önbelleğe Alma Ara Yazılımı da dahil olmak üzere değeri önbelleğe alabileceğini gösterir.

Location.Client (Cache-Control olarak ayarlanır private) değeri yalnızca istemcinin önbelleğe alabileceğini gösterir. Hiçbir ara önbellek , Yanıt Önbelleğe Alma Ara Yazılımı dahil olmak üzere değeri önbelleğe almamalıdır.

Önbellek denetimi üst bilgileri yalnızca istemcilere ve ara ara sunuculara yanıtların ne zaman ve nasıl önbelleğe alınacakları konusunda rehberlik sağlar. İstemcilerin ve proxy'lerin HTTP 1.1 Önbelleğe alma belirtimini yerine getirmesi garanti edilmez. Yanıt Önbelleğe Alma Ara Yazılımı her zaman belirtim tarafından belirtilen önbelleğe alma kurallarına uyar.

Aşağıdaki örnekte örnek uygulamadaki Cache3 sayfa modeli ve varsayılan Location değeri ayarlayıp Duration bırakarak üretilen üst bilgiler gösterilmektedir:

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

Örnek uygulama aşağıdaki üst bilgiyle Cache3 sayfasını döndürür:

Cache-Control: public,max-age=10

Önbellek profilleri

Birçok denetleyici eylemi özniteliğinde yanıt önbelleği ayarlarını yinelemek yerine, içinde MVC/Razor Sayfalar Startup.ConfigureServicesayarlanırken önbellek profilleri seçenek olarak yapılandırılabilir. Başvurulan önbellek profilinde bulunan değerler, tarafından varsayılan ResponseCacheAttribute olarak kullanılır ve özniteliğinde belirtilen özellikler tarafından geçersiz kılınır.

Önbellek profili ayarlama. Aşağıdaki örnekte, örnek uygulamanın içinde 30 saniyelik bir önbellek profili gösterilmektedir Startup.ConfigureServices:

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

Örnek uygulamanın Cache4 sayfa modeli önbellek profiline Default30 başvurur:

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

ResponseCacheAttribute aşağıdakilere uygulanabilir:

  • Razor Sayfalar: Öznitelikler işleyici yöntemlerine uygulanamaz.
  • MVC denetleyicileri.
  • MVC eylem yöntemleri: Yöntem düzeyi öznitelikler, sınıf düzeyi özniteliklerde belirtilen ayarları geçersiz kılar.

Önbellek profili tarafından Cache4 sayfa yanıtına uygulanan sonuçta elde edilen Default30 üst bilgi:

Cache-Control: public,max-age=30

Ek kaynaklar