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 ara proxy'ler RFC 9111: HTTP Önbelleğe Alma 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 bilgilerini ayarladığından, Sayfalar gibi Razor kullanıcı arabirimi uygulamaları için genellikle 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'ı 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

RFC 9111: HTTP Önbelleğe Alma, İ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 Önbellek Denetimi'dir. İstekler istemcilerden sunuculara doğru ilerledikçe ve yanıtlar sunuculardan istemcilere geri döndükçe yönergeler önbelleğe alma davranışını denetler. İstekler ve yanıtlar ara sunucularda 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önerge Eylem
genel Önbellek yanıtı depolar.
private Yanıt, paylaşılan önbellek tarafından depolanmamalıdır. Özel önbellek yanıtı depolayıp yeniden kullanabilir.
maksimum yaş İ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 istemci için yanıtı 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
Yaş Yanıtın kaynak sunucuda oluşturulmasından veya başarıyla doğrulanmasından bu yana geçen süreyi saniye olarak tahmin etme.
Sona Erme Tarihi Yanıtın eski olarak kabul edildiği saat.
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ü Vary hem önbelleğe alınmış yanıtın ö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 Önbelleği Denetimi yönergelerine uyar

RFC 9111: HTTP Önbelleğe Alma (Bölüm 5.2. Cache-Control), istemci tarafından gönderilen geçerli Cache-Control bir üst bilgiyi kabul etmek için bir önbellek gerektirir. İstemci bir no-cache üst bilgi değeriyle istekte bulunabilir 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 kabul etmeniz mantıklıdır. Resmi belirtim kapsamında önbelleğe alma, istemci, ara sunucu ve sunucu ağı genelinde istekleri karşılamanın gecikme süresini ve ağ ek yükünü azaltmaya yöneliktir. Kaynak sunucudaki yükü denetlemenin bir yolu olması şart değildir.

Ara yazılım resmi önbelleğe alma belirtimine uyduğundan, Yanıt Önbelleğe Alma Ara Yazılımını kullanırken bu önbelleğe alma davranışı üzerinde geliştirici denetimi yoktur. .NET 7'de sunucu yükünü daha iyi denetlemek için çıktı önbelleğe alma desteği eklendi. Daha fazla bilgi için bkz . Çıktı önbelleğe alma.

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 tüm istek sorgu dizesi parametrelerine göre yanıtları değişir.

Özelliği ayarlamak için Yanıt Önbelleğe Alma Ara Yazılımının etkinleştirilmesi VaryByQueryKeys gerekir. 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çların sırasını 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 için (aracılığıyla IFilterFactory) Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilterkullanı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, Hizmet koleksiyonuna Yanıt Önbelleğe Alma Ara Yazılım hizmetlerinin AddResponseCaching 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 trueCache-Control ayarlandığında, üst bilgi olarak no-storeayarlanır. olarak ayarlandıysa LocationNone:

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

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

NoStore genellikle hata sayfaları için olarak ayarlanır true . Aşağıdaki, 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 veyaRazorSayfalar 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, 6.0'da Minimal API'lerin yayımlanmasından ö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ı Duration etkinleştirmek için pozitif bir değere ayarlanmalıdır ve Location (varsayılan) veya Clientolmalıdır Any . Çerçeve üst bilgiyi, yanıtın ardından max-age konum 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, hem Pragma hem de Cache-Control üst bilgileri no-cacheolarak ayarlı olarak ayarlayın LocationNone.

Location.Any(Cache-Control olarak publicayarlanır), istemcinin veya herhangi bir ara ara proxy'nin, 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 privateayarlanır) 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 RFC 9111: HTTP Önbelleğe Alma kabul edeceği garanti edilmez. Yanıt Önbelleğe Alma Ara Yazılım her zaman belirtim tarafından belirtilen önbelleğe alma kurallarını izler.

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, MVC/Razor Sayfaları ayarlarken ö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.

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 Default30 başvurur:

[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 Default30 elde edilen üst bilgi yanıtı şunları 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 ara proxy'ler RFC 9111: HTTP Önbelleğe Alma 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 özelliklerini kullanabilir [ResponseCache] .

HTTP tabanlı yanıt önbelleğe alma

RFC 9111: HTTP Önbelleğe Alma, İ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 Önbellek Denetimi'dir. İstekler istemcilerden sunuculara doğru ilerledikçe ve yanıtlar sunuculardan istemcilere geri döndükçe yönergeler önbelleğe alma davranışını denetler. İstekler ve yanıtlar ara sunucularda 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önerge Eylem
genel Önbellek yanıtı depolar.
private Yanıt, paylaşılan önbellek tarafından depolanmamalıdır. Özel önbellek yanıtı depolayıp yeniden kullanabilir.
maksimum yaş İ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 istemci için yanıtı 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
Yaş Yanıtın kaynak sunucuda oluşturulmasından veya başarıyla doğrulanmasından bu yana geçen süreyi saniye olarak tahmin etme.
Sona Erme Tarihi Yanıtın eski olarak kabul edildiği saat.
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ü Vary hem önbelleğe alınmış yanıtın ö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 Önbelleği Denetimi yönergelerine uyar

RFC 9111: HTTP Önbelleğe Alma (Bölüm 5.2. Cache-Control), istemci tarafından gönderilen geçerli Cache-Control bir üst bilgiyi kabul etmek için bir önbellek gerektirir. İstemci bir no-cache üst bilgi değeriyle istekte bulunabilir 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 kabul etmeniz mantıklıdır. Resmi belirtim kapsamında önbelleğe alma, istemci, ara sunucu ve sunucu ağı genelinde istekleri karşılamanın gecikme süresini ve ağ ek yükünü azaltmaya yöneliktir. Kaynak sunucudaki yükü denetlemenin bir yolu olması şart değildir.

Ara yazılım resmi önbelleğe alma belirtimine uyduğ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, ASP.NET Core'un gelecekteki bir sürümü için bir tasarım teklifidir. Daha fazla bilgi için bkz. Çıkış Önbelleğe Alma desteği ekleme (dotnet/aspnetcore #27387).

ASP.NET Core'daki 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'da bellek içi önbelleğe alma ve Azure Uygulaması lication 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 dağıtılmış önbelleğe alma.

Önbellek Etiketi Yardımcısı

İçeriği, Önbellek Etiketi Yardımcısı ile bir MVC görünümünden veya Razor Sayfasından ö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ındaki bir MVC görünümünden veya Sayfasından 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 tüm istek sorgu dizesi parametrelerine göre yanıtları değişir.

Özelliği ayarlamak için Yanıt Önbelleğe Alma Ara Yazılımının etkinleştirilmesi VaryByQueryKeys gerekir. 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ç sırasını 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 için (aracılığıyla IFilterFactory) Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilterkullanı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 trueCache-Control ayarlandığında, üst bilgi olarak no-storeayarlanır. olarak ayarlandıysa LocationNone:

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

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

NoStore genellikle hata sayfaları için olarak ayarlanır true . Ö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 veyaRazorSayfalar 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ı Duration etkinleştirmek için pozitif bir değere ayarlanmalıdır ve Location (varsayılan) veya Clientolmalıdır Any . Çerçeve üst bilgiyi, yanıtın ardından max-age konum 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, hem Pragma hem de Cache-Control üst bilgileri no-cacheolarak ayarlı olarak ayarlayın LocationNone.

Location.Any(Cache-Control olarak publicayarlanır), istemcinin veya herhangi bir ara ara proxy'nin, 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 privateayarlanır) 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 proxy'lere yanıtların ne zaman ve nasıl önbelleğe alınacakları konusunda rehberlik sağlar. İstemcilerin ve proxy'lerin RFC 9111: HTTP Önbelleğe Alma kabul edeceği garanti edilmez. Yanıt Önbelleğe Alma Ara Yazılım her zaman belirtim tarafından belirtilen önbelleğe alma kurallarını izler.

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, önbellek profilleri içinde Startup.ConfigureServicesMVC/Razor Sayfalar ayarlanırken seçenekler 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