ASP.NET Core 'de yanıt önbelleğe alma
John Luo, Rick Andersonve Steve Smith tarafından
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
Yanıt önbelleğe alma, bir istemcinin veya proxy 'nin bir Web sunucusunda yaptığı istek sayısını azaltır. Yanıt önbelleği Ayrıca, Web sunucusunun yanıt oluşturmak için gerçekleştirdiği iş miktarını azaltır. Yanıt önbelleğe alma, istemci, ara sunucu ve ara yazılım 'nin yanıtları nasıl önbellekte istediğinizi belirten üstbilgiler tarafından denetlenir.
Responsecache özniteliği , yanıt önbelleği üst bilgilerini ayarlamaya katılır. istemciler ve ara proxy 'ler HTTP 1,1 Önbelleğe Alma belirtimindeyanıtları önbelleğe almak için üst bilgileri dikkate almalıdır.
HTTP 1,1 Önbelleğe Alma belirtimini izleyen sunucu tarafında önbelleğe alma için, yanıt Önbelleğe Alma ara yazılımı' nı kullanın. Ara yazılım, ResponseCacheAttribute sunucu tarafı önbelleğe alma davranışını etkilemek için özellikleri kullanabilir.
HTTP tabanlı yanıt önbelleğe alma
HTTP 1,1 Önbelleğe Alma belirtiminde , Internet önbellekler nasıl davranmalıdır açıklanmaktadır. Önbelleğe alma için kullanılan birincil HTTP üst bilgisi cache -Control' dır, önbellek yönergeleri belirtmek için kullanılır. Yönergeler denetim önbelleği, istek olarak önbelleğe alma davranışını istemcilerden sunuculara ve yanıt olarak sunuculardan istemcilere geri doğru bir şekilde getirir. istekler ve yanıtlar proxy sunucuları üzerinden taşınır ve proxy sunucuları da HTTP 1,1 Önbelleğe Alma belirtimine uymalıdır.
Ortak Cache-Control yönergeler aşağıdaki tabloda gösterilmiştir.
| Deki | Eylem |
|---|---|
| genel | Önbellek, yanıtı saklayabilir. |
| özelleştirme | Yanıtın paylaşılan bir önbellek tarafından depolanması gerekir. Özel bir önbellek, yanıtı depolayıp yeniden kullanabilir. |
| Maksimum yaş | İstemci, yaşı belirtilen saniyeden daha büyük olan bir yanıtı kabul etmez. Örnekler: max-age=60 (60 saniye), max-age=2592000 (1 ay) |
| önbellek yok | İsteklerde: bir önbellek, isteği karşılamak için depolanan bir 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ıtlar: yanıt, kaynak sunucuda doğrulamadan sonraki bir istek için kullanılmamalıdır. |
| mağaza yok | Istekler üzerinde: bir önbelleğin isteği depolaması gerekir. Yanıtlar: bir önbellek, yanıtın herhangi bir parçasını depolamamalıdır. |
Önbelleğe alma işleminde bir rol oynatacak diğer önbellek üstbilgileri aşağıdaki tabloda gösterilmiştir.
| Üst bilgi | İşlev |
|---|---|
| Age | Yanıt oluşturulduktan veya kaynak sunucuda başarıyla doğrulandıktan sonra geçen sürenin saniye cinsinden tahmini. |
| Bitiminden | Yanıtın eski kabul edildiği zaman. |
| Prag | Ayar davranışı için HTTP/1.0 önbellekler ile geriye dönük uyumluluk için mevcuttur no-cache . Cache-ControlÜst bilgi varsa, Pragma üst bilgi yok sayılır. |
| Değiş | Tüm Vary üst bilgi alanları önbelleğe alınan yanıtın orijinal isteği ve yeni istek ile eşleşmediği takdirde, önbelleğe alınmış bir yanıtın gönderilmemesi gerektiğini belirtir. |
HTTP tabanlı önbellek ve istek Cache-Control yönergeleri
Cache-Control üst bilgisi için HTTP 1,1 Önbelleğe Alma belirtimi , istemci tarafından gönderilen geçerli bir üst bilgiyi kabul etmek için bir önbellek gerektirir Cache-Control . İstemci no-cache , bir üst bilgi değeri ile istek yapabilir ve sunucuyu her istek için yeni bir yanıt oluşturmaya zorlayabilir.
İstemci Cache-Control isteği üst bilgilerinin her zaman dikkate alınması, http önbelleği hedefini düşünüyorsanız anlamlı hale getirir. Resmi belirtim altında, önbelleğe alma, istemcilerin, proxy 'lerin ve sunucuların bir ağı üzerinde istekleri karşılayan gecikme süresini ve ağ yükünü azaltmaya yöneliktir. Kaynak sunucu üzerindeki yükü denetlemek için bir yol değildir.
ara yazılım, resmi önbellek belirtimine bağlı olduğundan, yanıt Önbelleğe Alma ara yazılımı kullanılırken bu önbelleğe alma davranışı üzerinde geliştirici denetimi yoktur. Sunucu yükünü daha iyi denetlemek için çıkış önbelleği desteği, ASP.NET Core gelecek bir sürümü için bir tasarım teklifidir. daha fazla bilgi için bkz. çıkış Önbelleğe Alma için destek ekleme (dotnet/aspnetcore #27387).
ASP.NET Core 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 tür bir önbelleğe alma, yapışkan oturumları kullanan tek bir sunucu veya birden çok sunucu için uygundur. Yapışkan oturumlar, bir istemciden gelen isteklerin işlenmek üzere her zaman aynı sunucuya yönlendirildiği anlamına gelir.
Daha fazla bilgi için bkz. ASP.NET Core 'de önbellek belleği.
Dağıtılmış Önbellek
Uygulama bir bulutta veya sunucu grubunda barındırıldığı zaman bellekte verileri depolamak için dağıtılmış önbellek kullanın. Önbellek, istekleri işleyen sunucular arasında paylaşılır. İstemci, önbelleğe alınmış veriler varsa, gruptaki herhangi bir sunucu tarafından işlenen bir istek gönderebilir. ASP.NET Core, SQL Server, redsısve ncache dağıtılmış önbellekler ile çalışır.
Daha fazla bilgi için bkz. ASP.NET Core 'de dağıtılmış önbelleğe alma.
Önbellek Etiketi Yardımcısı
İçeriği bir MVC görünümü veya Razor sayfasından önbellek etiketi Yardımcısı ile önbelleğe alma. Ö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ış Razor önbellek etiketi Yardımcısı ile dağıtılmış bulut veya Web grubu senaryolarında BIR MVC görünümü veya sayfasından içerik önbelleğe alma. dağıtılmış önbellek etiketi yardımcısı, verileri depolamak için SQL Server, redsısveya ncache kullanır.
Daha fazla bilgi için bkz. ASP.NET Core dağıtılmış önbellek etiketi Yardımcısı.
ResponseCache özniteliği
ResponseCacheAttributeYanıt önbelleğe alma işleminde 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 bir kullanıcının kimliğine göre değişmeyen içerik veya bir kullanıcının oturum açmış olup olmadığı için etkinleştirilmelidir.
VaryByQueryKeys saklı yanıtı, belirtilen sorgu anahtarları listesinin değerlerine göre değiştirir. Tek bir değer * sağlandığında, ara yazılım tüm istek sorgu dizesi parametrelerine göre yanıtları değiştirir.
özelliği ayarlamak için yanıt Önbelleğe Alma ara yazılımı etkinleştirilmelidir VaryByQueryKeys . Aksi takdirde, çalışma zamanı özel durumu oluşturulur. Özellik için karşılık gelen bir HTTP üst bilgisi yok VaryByQueryKeys . özelliği, yanıt Önbelleğe Alma ara yazılımı tarafından işlenen bir HTTP özelliğidir. Ara yazılım, önbelleğe alınmış bir yanıta hizmeti sağlamak için sorgu dizesi ve sorgu dizesi değerinin önceki bir istekle eşleşmesi gerekir. Örneğin, aşağıdaki tabloda gösterilen istek sırasını ve sonuçları 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ım tarafından 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ım içinde ö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 (Aracılığıyla) yapılandırmak ve oluşturmak için kullanılır IFilterFactory Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter . , ResponseCacheFilter Yanıtın uygun HTTP üstbilgilerini ve özelliklerini güncelleştirme işini gerçekleştirir. Filtre:
- , Ve için varolan tüm üstbilgileri kaldırır
VaryCache-ControlPragma. - İçinde ayarlanan özelliklere göre uygun üstbilgileri yazar ResponseCacheAttribute .
- Ayarlanırsa, yanıt önbelleğe alma HTTP özelliğini güncelleştirir VaryByQueryKeys .
Değiş
Bu üst bilgi yalnızca VaryByHeader özellik ayarlandığında yazılır. Özelliği, Vary özelliğin değerine ayarlanır. Aşağıdaki örnek VaryByHeader özelliğini 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 true , Cache-Control üst bilgi olarak ayarlanır no-store . LocationŞu şekilde ayarlanmışsa None :
Cache-Control, olarak ayarlanırno-store,no-cache.Pragma, olarak ayarlanırno-cache.
, NoStore Ve ise ve ise, false ve olarak Location None Cache-Control Pragma ayarlanır no-cache .
NoStore genellikle true hata sayfaları için olarak ayarlanır. Örnek uygulamadaki Cache2 sayfası, istemcinin yanıtı depolayamamasını sağlayan 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
Konum ve süre
Önbelleğe almayı etkinleştirmek için Duration pozitif bir değere ayarlanmalıdır ve Location Any (varsayılan) ya da olmalıdır Client . Çerçeve, Cache-Control üst bilgisini konum değerine ve ardından max-age yanıtın sonuna ayarlar.
Locationöğesinin seçenekleri Any ve Client Cache-Control sırasıyla üst bilgi değerlerine dönüştürülür public private . NoStore ve Location. None bölümünde belirtildiği gibi, Location None hem hem de Cache-Control Pragma üst bilgileri olarak ayarlar no-cache .
Location.Any( Cache-Control olarak ayarlanır public ), istemci veya herhangi bir ara proxy 'nin, yanıt Önbelleğe Alma ara yazılımıdahil olmak üzere değeri önbelleğe alabilir olduğunu gösterir.
Location.Client ( Cache-Control olarak ayarlanır private ) yalnızca istemcinin değeri önbelleğe alabilir olduğunu gösterir. ara önbellek, yanıt Önbelleğe Alma ara yazılımıdahil olmak üzere değeri önbelleğe almalıdır.
Önbellek denetim üstbilgileri, yalnızca istemcilere ve yanıt önbelleklerine ne zaman ve nasıl önbellek alınacağını gösteren yönergeler sağlar. istemcilerin ve proxy 'lerin HTTP 1,1 Önbelleğe Alma belirtiminikabul edeceğini garanti etmez. yanıt Önbelleğe Alma ara yazılımı her zaman belirtim tarafından düzenlendiği önbelleğe alma kurallarını izler.
Aşağıdaki örnek, örnek uygulamadan Cache3 sayfa modelini ve Duration varsayılan değeri ayarlayarak ve bırakarak oluşturulan üstbilgileri gösterir Location :
[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 eylem özniteliği üzerinde yanıt önbelleği ayarlarını çoğaltmak yerine, ' de MVC/sayfalar ayarlanırken, önbellek profilleri seçenek olarak yapılandırılabilir Razor Startup.ConfigureServices . Başvurulan bir önbellek profilinde bulunan değerler, tarafından varsayılan olarak kullanılır ResponseCacheAttribute ve özniteliğinde belirtilen özellikler tarafından geçersiz kılınır.
Önbellek profili ayarlayın. Aşağıdaki örnek, örnek uygulamanın bir 30 saniyelik önbellek profilini göstermektedir Startup.ConfigureServices :
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddMvc(options =>
{
options.CacheProfiles.Add("Default30",
new CacheProfile()
{
Duration = 30
});
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.CacheProfiles.Add("Default30",
new CacheProfile()
{
Duration = 30
});
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Örnek uygulamanın Cache4 sayfa modeli Default30 önbellek profiline başvurur:
[ResponseCache(CacheProfileName = "Default30")]
public class Cache4Model : PageModel
{
, ResponseCacheAttribute Öğesine 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ç üst bilgisi Default30 :
Cache-Control: public,max-age=30
Ek kaynaklar
- Yanıtları önbellekte depolama
- Cache-Control
- ASP.NET Core 'de önbellek belleği
- ASP.NET Core 'de dağıtılmış önbelleğe alma
- ASP.NET Core'de değişiklik belirteçleriyle değişiklikleri ASP.NET Core
- ASP.NET Core'Önbelleğe Alma Ara Yazılımına yanıt ASP.NET Core
- ASP.NET Core MVC 'de önbellek etiketi yardımcısı
- ASP.NET Core dağıtılmış önbellek etiketi Yardımcısı