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 bağlı olduğ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 veya kullanıcının identity 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 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ç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.ResponseCacheFilter
kullanılır. , ResponseCacheFilter
yanıtın uygun HTTP üst bilgilerini ve özelliklerini güncelleştirme işini gerçekleştirir. Filtre:
- ,
Cache-Control
vePragma
içinVary
varolan 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ştirir.
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ıyor.
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 true
Cache-Control
ayarlandığında, üst bilgi olarak no-store
ayarlanır. olarak ayarlandıysa Location None
:
Cache-Control
olarak ayarlanırno-store,no-cache
.Pragma
olarak ayarlanırno-cache
.
ve NoStore Location ise false
None
, Cache-Control
ve 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 veyaRazor 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, 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.cs
olarak 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 Client
olmalı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-cache
olarak ayarlı olarak ayarlayın Location None
.
Location.Any
(Cache-Control
olarak public
ayarlanır), istemcinin veya herhangi bir ara 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 private
ayarlanı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'ya saygı göstereceğinin garantisi yoktur. 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, 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
- Yanıtları Önbelleklerde Depolama
- Önbellek Denetimi
- ASP.NET Core'da bellek içi önbellek
- ASP.NET Core'da dağıtılmış önbelleğe alma
- ASP.NET Core'da değişiklik belirteçleriyle değişiklikleri algılama
- ASP.NET Core'da Yanıt Önbelleğe Alma Ara Yazılımı
- ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı
- ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı
Ö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 bağlı 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, 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 veya kullanıcının identity 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 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ç 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.ResponseCacheFilter
kullanılır. , ResponseCacheFilter
yanıtın uygun HTTP üst bilgilerini ve özelliklerini güncelleştirme işini gerçekleştirir. Filtre:
- ,
Cache-Control
vePragma
içinVary
varolan 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ştirir.
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 true
Cache-Control
ayarlandığında, üst bilgi olarak no-store
ayarlanır. olarak ayarlandıysa Location None
:
Cache-Control
olarak ayarlanırno-store,no-cache
.Pragma
olarak ayarlanırno-cache
.
ve NoStore Location ise false
None
, Cache-Control
ve 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 veyaRazor 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ı Duration etkinleştirmek için pozitif bir değere ayarlanmalıdır ve Location (varsayılan) veya Client
olmalı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-cache
olarak ayarlı olarak ayarlayın Location None
.
Location.Any
(Cache-Control
olarak public
ayarlanır), istemcinin veya herhangi bir ara 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 private
ayarlanı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'ya saygı göstereceğinin garantisi yoktur. 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, önbellek profilleri içinde Startup.ConfigureServices
MVC/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
- Yanıtları Önbelleklerde Depolama
- RFC 9111: HTTP Önbelleğe Alma (Bölüm 5.2. Önbellek Denetimi)
- ASP.NET Core'da bellek içi önbellek
- ASP.NET Core'da dağıtılmış önbelleğe alma
- ASP.NET Core'da değişiklik belirteçleriyle değişiklikleri algılama
- ASP.NET Core'da Yanıt Önbelleğe Alma Ara Yazılımı
- ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı
- ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı
ASP.NET Core