ASP.NET Core'da Yanıt Önbelleğe Alma Ara Yazılımı
Tarafından John Luo ve Rick Anderson
Bu makalede, ASP.NET Core uygulamasında Yanıt Önbelleğe Alma Ara Yazılımının nasıl yapılandırılması açıklanır. Ara yazılım yanıtların ne zaman önbelleğe alındığını belirler, yanıtları depolar ve önbellekten yanıtlar sunar. HTTP önbelleğe alma ve özniteliğine [ResponseCache]
giriş için bkz . Yanıt Önbelleğe Alma.
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.
Yapılandırma
içinde Program.cs
, Hizmet koleksiyonuna Yanıt Önbelleğe Alma Ara Yazılımı hizmetlerini AddResponseCaching ekleyin ve uygulamayı uzantı yöntemiyle UseResponseCaching ara yazılımı kullanacak şekilde yapılandırın. UseResponseCaching
ara yazılımı istek işleme işlem hattına ekler:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddResponseCaching();
var app = builder.Build();
app.UseHttpsRedirection();
// UseCors must be called before UseResponseCaching
//app.UseCors();
app.UseResponseCaching();
Uyarı
UseCorsCORS ara yazılımı kullanılırken önce UseResponseCaching çağrılmalıdır.
Örnek uygulama, sonraki isteklerde önbelleğe almayı denetlemek için üst bilgiler ekler:
- Önbellek Denetimi: Önbelleğe alınabilen yanıtları 10 saniyeye kadar önbelleğe alır.
- Değişiklik: Ara yazılımı yalnızca sonraki isteklerin Accept-Encoding üst bilgisi özgün istekle eşleşiyorsa önbelleğe alınmış bir yanıt sunmak üzere yapılandırır.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddResponseCaching();
var app = builder.Build();
app.UseHttpsRedirection();
// UseCors must be called before UseResponseCaching
//app.UseCors();
app.UseResponseCaching();
app.Use(async (context, next) =>
{
context.Response.GetTypedHeaders().CacheControl =
new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
{
Public = true,
MaxAge = TimeSpan.FromSeconds(10)
};
context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] =
new string[] { "Accept-Encoding" };
await next();
});
app.MapGet("/", () => DateTime.Now.Millisecond);
app.Run();
Yukarıdaki üst bilgiler yanıta yazılmaz ve bir denetleyici, eylem veya Razor Sayfa olduğunda geçersiz kılınabilir:
- [ResponseCache] özniteliği var. Bu, bir özellik ayarlı olmasa bile geçerlidir. Örneğin, VaryByHeader özelliğinin atlanması, karşılık gelen üst bilginin yanıttan kaldırılmasına neden olur.
Yanıt Önbelleğe Alma Ara Yazılımı yalnızca 200 (Tamam) durum koduna neden olan sunucu yanıtlarını önbelleğe alır. Hata sayfaları da dahil olmak üzere diğer tüm yanıtlar ara yazılım tarafından yoksayılır.
Uyarı
Kimliği doğrulanmış istemciler için içerik içeren yanıtlar, ara yazılımların bu yanıtları depolamasını ve sunmasını önlemek için önbelleğe alınamaz olarak işaretlenmelidir. Ara yazılımının yanıtın önbelleğe alınıp alınmadığını nasıl belirlediğinin ayrıntıları için bkz. Önbelleğe alma koşulları.
Yukarıdaki kod genellikle önbelleğe alınmış bir değeri tarayıcıya döndürmez. Fiddler'ı veya istek üst bilgilerini açıkça ayarlayabilen ve önbelleğe alma testi için tercih edilen başka bir aracı kullanın. Daha fazla bilgi için bu makalede sorun giderme bölümüne bakın.
Seçenekler
Yanıt önbelleğe alma seçenekleri aşağıdaki tabloda gösterilmiştir.
Seçenek | Açıklama |
---|---|
MaximumBodySize | Yanıt gövdesi için bayt cinsinden önbelleğe alınabilen en büyük boyut. Varsayılan değer (64 MB) değeridir 64 * 1024 * 1024 . |
SizeLimit | Yanıt önbelleği ara yazılımının bayt cinsinden boyut sınırı. Varsayılan değer ( 100 * 1024 * 1024 100 MB). |
UseCaseSensitivePaths | Yanıtların büyük/küçük harfe duyarlı yollarda önbelleğe alındığını belirler. Varsayılan değer şudur: false . |
Aşağıdaki örnek ara yazılımı şu şekilde yapılandırılır:
- Gövde boyutu 1.024 bayttan küçük veya buna eşit olan yanıtları önbelleğe alın.
- Yanıtları büyük/küçük harfe duyarlı yollara göre depolayın. Örneğin ve
/page1
/Page1
ayrı olarak depolanır.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddResponseCaching(options =>
{
options.MaximumBodySize = 1024;
options.UseCaseSensitivePaths = true;
});
var app = builder.Build();
app.UseHttpsRedirection();
// UseCors must be called before UseResponseCaching
//app.UseCors();
app.UseResponseCaching();
app.Use(async (context, next) =>
{
context.Response.GetTypedHeaders().CacheControl =
new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
{
Public = true,
MaxAge = TimeSpan.FromSeconds(10)
};
context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] =
new string[] { "Accept-Encoding" };
await next(context);
});
app.MapGet("/", () => DateTime.Now.Millisecond);
app.Run();
VaryByQueryKeys
MVC, web API denetleyicileri veya Razor Sayfalar sayfa modelleri kullanılırken, [ResponseCache]
özniteliği yanıt önbelleğe alma için uygun üst bilgileri ayarlamak için gereken parametreleri belirtir. Özniteliğin [ResponseCache]
ara yazılımı kesinlikle gerektiren tek parametresi, gerçek bir HTTP üst bilgisine karşılık gelen parametresidir VaryByQueryKeys. Daha fazla bilgi için bkz . ASP.NET Core'da yanıt önbelleğe alma.
özniteliğini kullanmadığınızda [ResponseCache]
, yanıt önbelleğe alma ile VaryByQueryKeys
değiştirilebilir. ResponseCachingFeature Doğrudan HttpContext.Features'tan öğesini kullanın:
var responseCachingFeature = context.HttpContext.Features.Get<IResponseCachingFeature>();
if (responseCachingFeature != null)
{
responseCachingFeature.VaryByQueryKeys = new[] { "MyKey" };
}
içinde VaryByQueryKeys
değerine *
eşit tek bir değerin kullanılması, önbelleği tüm istek sorgusu parametrelerine göre değişir.
Yanıt Önbelleğe Alma Ara Yazılımı tarafından kullanılan HTTP üst bilgileri
Aşağıdaki tabloda, yanıt önbelleğe almayı etkileyen HTTP üst bilgileri hakkında bilgi sağlanmaktadır.
Üst bilgi | Ayrıntılar |
---|---|
Authorization |
Üst bilgi varsa yanıt önbelleğe alınmaz. |
Cache-Control |
Ara yazılım yalnızca önbellek yönergesi ile işaretlenmiş önbelleğe alma yanıtlarını dikkate public alır. Önbelleğe almayı aşağıdaki parametrelerle denetleyin:
max-stale ara yazılım hiçbir işlem gerçekleştirmez.proxy-revalidate ‡ ile aynı etkiye must-revalidate sahiptir.Daha fazla bilgi için bkz . RFC 9111: İstek Yönergeleri. |
Pragma |
Pragma: no-cache İstekteki üst bilgi ile aynı etkiyi Cache-Control: no-cache üretir. Bu üst bilgi varsa, üst bilgideki Cache-Control ilgili yönergeler tarafından geçersiz kılınmış olur. HTTP/1.0 ile geriye dönük uyumluluk için dikkate alınır. |
Set-Cookie |
Üst bilgi varsa yanıt önbelleğe alınmaz. İstek işleme işlem hattında bir veya daha fazla tanımlama bilgisi ayarlayan herhangi bir ara yazılım, Yanıt Önbelleğe Alma Ara Yazılımının yanıtı önbelleğe almasını engeller (örneğin, cookietabanlı TempData sağlayıcısı). |
Vary |
Üst Vary bilgi, önbelleğe alınan yanıtı başka bir üst bilgiyle değiştirmek için kullanılır. Örneğin, üst bilgi içeren istekler için yanıtları ayrı olarak önbelleğe alan üst bilgiyi ekleyerek Vary: Accept-Encoding yanıtları kodlama yoluyla önbelleğe Accept-Encoding: gzip Accept-Encoding: text/plain alın. üst bilgi değerine * sahip bir yanıt hiçbir zaman depolanmaz. |
Expires |
Bu üst bilgi tarafından eski olarak kabul edilen bir yanıt, diğer Cache-Control üst bilgiler tarafından geçersiz kılınmadığı sürece depolanmaz veya alınmaz. |
If-None-Match |
Değer * değilse ve ETag yanıtın değeri sağlanan değerlerle eşleşmiyorsa, tam yanıt önbellekten sunulur. Aksi takdirde, 304 (Değiştirilmedi) yanıtı sunulur. |
If-Modified-Since |
If-None-Match Üst bilgi yoksa, önbelleğe alınan yanıt tarihi sağlanan değerden daha yeniyse önbellekten tam yanıt sunulur. Aksi takdirde, 304 - Değiştirilmedi yanıtı sunulur. |
Date |
Önbellekten sunum yaparken, Date özgün yanıtta sağlanmadıysa üst bilgi ara yazılım tarafından ayarlanır. |
Content-Length |
Önbellekten sunum yaparken, Content-Length özgün yanıtta sağlanmadıysa üst bilgi ara yazılım tarafından ayarlanır. |
Age |
Age Özgün yanıtta gönderilen üst bilgi yoksayılır. Ara yazılım, önbelleğe alınmış bir yanıt sunarken yeni bir değer hesaplar. |
Önbelleğe alma, istek Cache-Control yönergelerini dikkate alır
Ara yazılım RFC 9111: HTTP Önbelleğe Alma (Bölüm 5.2) kurallarına uyar . Önbellek Denetimi). Kurallar, istemci tarafından gönderilen geçerli Cache-Control
bir üst bilgiyi kabul etmek için bir önbellek gerektirir. Belirtim altında, bir istemci üst bilgi değerine sahip no-cache
istekler yapabilir ve sunucuyu her istek için yeni bir yanıt oluşturmaya zorlayabilir. Ara yazılım resmi önbelleğe alma belirtimine bağlı olduğundan, ara yazılımı kullanırken şu anda bu önbelleğe alma davranışı üzerinde geliştirici denetimi yoktur.
Önbelleğe alma davranışı üzerinde daha fazla denetim için ASP.NET Core'un diğer önbelleğe alma özelliklerini keşfedin. Aşağıdaki konulara bakın:
- ASP.NET Core'da bellek içi önbellek
- ASP.NET Core'da dağıtılmış önbelleğe alma
- ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı
- ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı
Sorun giderme
Yanıt Önbelleğe Alma Ara Yazılımı sınırlı kapasiteye sahip olan öğesini kullanırIMemoryCache. Kapasite aşıldığında, bellek önbelleği sıkıştırılır.
Önbelleğe alma davranışı beklendiği gibi değilse yanıtların önbelleğe alınıp alınamadığını ve önbellekten sunulduğundan emin olun. İsteğin gelen üst bilgilerini ve yanıtın giden üst bilgilerini inceleyin. Hata ayıklamaya yardımcı olması için günlüğe kaydetmeyi etkinleştirin.
Önbelleğe alma davranışını test ederken ve sorun giderirken, tarayıcı genellikle önbelleğe almayı engelleyen istek üst bilgilerini ayarlar. Örneğin, bir tarayıcı bir sayfayı Cache-Control
yenilerken üst bilgiyi no-cache
veya max-age=0
olarak ayarlayabilir. Fiddler ve diğer araçlar istek üst bilgilerini açıkça ayarlayabilir ve önbelleğe alma testi için tercih edilir.
Önbelleğe alma koşulları
- İstek, 200 (Tamam) durum koduyla bir sunucu yanıtına neden olmalıdır.
- İstek yöntemi GET veya HEAD olmalıdır.
- Yanıt Önbelleğe Alma Ara Yazılımı, önbelleğe alma gerektiren ara yazılımdan önce yerleştirilmelidir. Daha fazla bilgi için, bkz. ASP.NET Core Ara Yazılımı.
- Üst
Authorization
bilgi mevcut olmamalıdır. Cache-Control
üst bilgi parametreleri geçerli olmalı ve yanıt işaretlenmelipublic
ve işaretlenmemelidirprivate
.Pragma: no-cache
Üst bilgi mevcut değilse, üst bilgi mevcut olduğundaCache-Control
üst bilgiyi geçersiz kıldığındanCache-Control
Pragma
üst bilgi mevcut olmamalıdır.- Üst
Set-Cookie
bilgi mevcut olmamalıdır. Vary
üst bilgi parametreleri geçerli olmalı ve değerine*
eşit olmamalıdır.- Üst
Content-Length
bilgi değeri (ayarlandıysa) yanıt gövdesinin boyutuyla eşleşmelidir. - IHttpSendFileFeature kullanılmaz.
- Yanıt, üst bilgi ve ve
max-age
s-maxage
önbellek yönergeleri tarafındanExpires
belirtildiği gibi eski olmamalıdır. - Yanıt arabelleğe alma başarılı olmalıdır. Yanıtın boyutu yapılandırılan veya varsayılan SizeLimitdeğerinden küçük olmalıdır. Yanıtın gövde boyutu, yapılandırılan veya varsayılan MaximumBodySizedeğerinden küçük olmalıdır.
- Yanıtın RFC 9111: HTTP Önbelleğe Alma'ya göre önbelleğe alınabilmesi gerekir. Örneğin, yönergesi
no-store
istek veya yanıt üst bilgisi alanlarında mevcut olmamalıdır. Ayrıntılar için bkz . RFC 9111: HTTP Önbelleğe Alma (Bölüm 3: Yanıtları Önbelleklerde Depolama.
Not
Siteler Arası İstek Sahteciliği (CSRF) saldırılarını önlemek için güvenli belirteçler oluşturmaya yönelik Antiforgery sistemi, yanıtların Cache-Control
önbelleğe alınmaması için no-cache
ve Pragma
üst bilgilerini olarak ayarlar. HTML form öğeleri için sahte belirteçleri devre dışı bırakma hakkında bilgi için bkz . ASP.NET Core'da Siteler Arası İstek Sahteciliği (XSRF/CSRF) saldırılarını önleme.
Ek kaynaklar
- Örnek kodu görüntüleme veya indirme (indirme)
- GitHub kaynağı:
IResponseCachingPolicyProvider
- GitHub kaynağı:
IResponseCachingPolicyProvider
- ASP.NET Core'da uygulama başlatma
- ASP.NET Core Ara Yazılımı
- 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
- ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı
- ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı
Bu makalede, ASP.NET Core uygulamasında Yanıt Önbelleğe Alma Ara Yazılımının nasıl yapılandırılması açıklanır. Ara yazılım yanıtların ne zaman önbelleğe alındığını belirler, yanıtları depolar ve önbellekten yanıtlar sunar. HTTP önbelleğe alma ve özniteliğine [ResponseCache]
giriş için bkz . Yanıt Önbelleğe Alma.
Örnek kodu görüntüleme veya indirme (indirme)
Yapılandırma
Yanıt Önbelleğe Alma Ara Yazılımı, paylaşılan çerçeve aracılığıyla ASP.NET Core uygulamaları için örtük olarak kullanılabilir.
içinde Startup.ConfigureServices
, Hizmet koleksiyonuna Yanıt Önbelleğe Alma Ara Yazılımını ekleyin:
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
services.AddRazorPages();
}
Uygulamayı, içindeki istek işleme işlem hattına Startup.Configure
ara yazılımı ekleyen uzantı yöntemiyle UseResponseCaching ara yazılımı kullanacak şekilde yapılandırın:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
// UseCors must be called before UseResponseCaching
// app.UseCors("myAllowSpecificOrigins");
app.UseResponseCaching();
app.Use(async (context, next) =>
{
context.Response.GetTypedHeaders().CacheControl =
new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
{
Public = true,
MaxAge = TimeSpan.FromSeconds(10)
};
context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] =
new string[] { "Accept-Encoding" };
await next();
});
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Uyarı
UseCorsCORS ara yazılımı kullanılırken önce UseResponseCaching çağrılmalıdır.
Örnek uygulama, sonraki isteklerde önbelleğe almayı denetlemek için üst bilgiler ekler:
- Önbellek Denetimi: Önbelleğe alınabilen yanıtları 10 saniyeye kadar önbelleğe alır.
- Değişiklik: Ara yazılımı yalnızca sonraki isteklerin Accept-Encoding üst bilgisi özgün istekle eşleşiyorsa önbelleğe alınmış bir yanıt sunmak üzere yapılandırır.
// using Microsoft.AspNetCore.Http;
app.Use(async (context, next) =>
{
context.Response.GetTypedHeaders().CacheControl =
new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
{
Public = true,
MaxAge = TimeSpan.FromSeconds(10)
};
context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] =
new string[] { "Accept-Encoding" };
await next();
});
Yukarıdaki üst bilgiler yanıta yazılmaz ve bir denetleyici, eylem veya Razor Sayfa olduğunda geçersiz kılınabilir:
- [ResponseCache] özniteliği var. Bu, bir özellik ayarlı olmasa bile geçerlidir. Örneğin, VaryByHeader özelliğinin atlanması, karşılık gelen üst bilginin yanıttan kaldırılmasına neden olur.
Yanıt Önbelleğe Alma Ara Yazılımı yalnızca 200 (Tamam) durum koduna neden olan sunucu yanıtlarını önbelleğe alır. Hata sayfaları da dahil olmak üzere diğer tüm yanıtlar ara yazılım tarafından yoksayılır.
Uyarı
Kimliği doğrulanmış istemciler için içerik içeren yanıtlar, ara yazılımların bu yanıtları depolamasını ve sunmasını önlemek için önbelleğe alınamaz olarak işaretlenmelidir. Ara yazılımının yanıtın önbelleğe alınıp alınmadığını nasıl belirlediğinin ayrıntıları için bkz. Önbelleğe alma koşulları.
Seçenekler
Yanıt önbelleğe alma seçenekleri aşağıdaki tabloda gösterilmiştir.
Seçenek | Açıklama |
---|---|
MaximumBodySize | Yanıt gövdesi için bayt cinsinden önbelleğe alınabilen en büyük boyut. Varsayılan değer (64 MB) değeridir 64 * 1024 * 1024 . |
SizeLimit | Yanıt önbelleği ara yazılımının bayt cinsinden boyut sınırı. Varsayılan değer ( 100 * 1024 * 1024 100 MB). |
UseCaseSensitivePaths | Yanıtların büyük/küçük harfe duyarlı yollarda önbelleğe alındığını belirler. Varsayılan değer şudur: false . |
Aşağıdaki örnek ara yazılımı şu şekilde yapılandırılır:
- Gövde boyutu 1.024 bayttan küçük veya buna eşit olan yanıtları önbelleğe alın.
- Yanıtları büyük/küçük harfe duyarlı yollara göre depolayın. Örneğin ve
/page1
/Page1
ayrı olarak depolanır.
services.AddResponseCaching(options =>
{
options.MaximumBodySize = 1024;
options.UseCaseSensitivePaths = true;
});
VaryByQueryKeys
MVC / web API denetleyicileri veya Razor Sayfalar sayfası modelleri kullanılırken, [ResponseCache]
özniteliği yanıt önbelleğe alma için uygun üst bilgileri ayarlamak için gereken parametreleri belirtir. Özniteliğin [ResponseCache]
ara yazılımı kesinlikle gerektiren tek parametresi, gerçek bir HTTP üst bilgisine karşılık gelen parametresidir VaryByQueryKeys. Daha fazla bilgi için bkz . ASP.NET Core'da yanıt önbelleğe alma.
özniteliğini kullanmadığınızda [ResponseCache]
, yanıt önbelleğe alma ile VaryByQueryKeys
değiştirilebilir. ResponseCachingFeature Doğrudan HttpContext.Features'tan öğesini kullanın:
var responseCachingFeature = context.HttpContext.Features.Get<IResponseCachingFeature>();
if (responseCachingFeature != null)
{
responseCachingFeature.VaryByQueryKeys = new[] { "MyKey" };
}
içinde VaryByQueryKeys
değerine *
eşit tek bir değerin kullanılması, önbelleği tüm istek sorgusu parametrelerine göre değişir.
Yanıt Önbelleğe Alma Ara Yazılımı tarafından kullanılan HTTP üst bilgileri
Aşağıdaki tabloda, yanıt önbelleğe almayı etkileyen HTTP üst bilgileri hakkında bilgi sağlanmaktadır.
Üst bilgi | Ayrıntılar |
---|---|
Authorization |
Üst bilgi varsa yanıt önbelleğe alınmaz. |
Cache-Control |
Ara yazılım yalnızca önbellek yönergesi ile işaretlenmiş önbelleğe alma yanıtlarını dikkate public alır. Önbelleğe almayı aşağıdaki parametrelerle denetleyin:
max-stale ara yazılım hiçbir işlem gerçekleştirmez.proxy-revalidate ‡ ile aynı etkiye must-revalidate sahiptir.Daha fazla bilgi için bkz . RFC 9111: İstek Yönergeleri. |
Pragma |
Pragma: no-cache İstekteki üst bilgi ile aynı etkiyi Cache-Control: no-cache üretir. Bu üst bilgi varsa, üst bilgideki Cache-Control ilgili yönergeler tarafından geçersiz kılınmış olur. HTTP/1.0 ile geriye dönük uyumluluk için dikkate alınır. |
Set-Cookie |
Üst bilgi varsa yanıt önbelleğe alınmaz. İstek işleme işlem hattında bir veya daha fazla tanımlama bilgisi ayarlayan herhangi bir ara yazılım, Yanıt Önbelleğe Alma Ara Yazılımının yanıtı önbelleğe almasını engeller (örneğin, cookietabanlı TempData sağlayıcısı). |
Vary |
Üst Vary bilgi, önbelleğe alınan yanıtı başka bir üst bilgiyle değiştirmek için kullanılır. Örneğin, üst bilgi içeren istekler için yanıtları ayrı olarak önbelleğe alan üst bilgiyi ekleyerek Vary: Accept-Encoding yanıtları kodlama yoluyla önbelleğe Accept-Encoding: gzip Accept-Encoding: text/plain alın. üst bilgi değerine * sahip bir yanıt hiçbir zaman depolanmaz. |
Expires |
Bu üst bilgi tarafından eski olarak kabul edilen bir yanıt, diğer Cache-Control üst bilgiler tarafından geçersiz kılınmadığı sürece depolanmaz veya alınmaz. |
If-None-Match |
Değer * değilse ve ETag yanıtın değeri sağlanan değerlerle eşleşmiyorsa, tam yanıt önbellekten sunulur. Aksi takdirde, 304 (Değiştirilmedi) yanıtı sunulur. |
If-Modified-Since |
If-None-Match Üst bilgi yoksa, önbelleğe alınan yanıt tarihi sağlanan değerden daha yeniyse önbellekten tam yanıt sunulur. Aksi takdirde, 304 - Değiştirilmedi yanıtı sunulur. |
Date |
Önbellekten sunum yaparken, Date özgün yanıtta sağlanmadıysa üst bilgi ara yazılım tarafından ayarlanır. |
Content-Length |
Önbellekten sunum yaparken, Content-Length özgün yanıtta sağlanmadıysa üst bilgi ara yazılım tarafından ayarlanır. |
Age |
Age Özgün yanıtta gönderilen üst bilgi yoksayılır. Ara yazılım, önbelleğe alınmış bir yanıt sunarken yeni bir değer hesaplar. |
Önbelleğe alma, istek Cache-Control yönergelerini dikkate alır
Ara yazılım RFC 9111: HTTP Önbelleğe Alma (Bölüm 5.2) kurallarına uyar . Önbellek Denetimi). Kurallar, istemci tarafından gönderilen geçerli Cache-Control
bir üst bilgiyi kabul etmek için bir önbellek gerektirir. Belirtim altında, bir istemci üst bilgi değerine sahip no-cache
istekler yapabilir ve sunucuyu her istek için yeni bir yanıt oluşturmaya zorlayabilir. Ara yazılım resmi önbelleğe alma belirtimine bağlı olduğundan, ara yazılımı kullanırken şu anda bu önbelleğe alma davranışı üzerinde geliştirici denetimi yoktur.
Önbelleğe alma davranışı üzerinde daha fazla denetim için ASP.NET Core'un diğer önbelleğe alma özelliklerini keşfedin. Aşağıdaki konulara bakın:
- ASP.NET Core'da bellek içi önbellek
- ASP.NET Core'da dağıtılmış önbelleğe alma
- ASP.NET Core MVC'de Önbellek Etiketi Yardımcısı
- ASP.NET Core'da Dağıtılmış Önbellek Etiketi Yardımcısı
Sorun giderme
Önbelleğe alma davranışı beklendiği gibi değilse yanıtların önbelleğe alınıp alınamadığını ve önbellekten sunulduğundan emin olun. İsteğin gelen üst bilgilerini ve yanıtın giden üst bilgilerini inceleyin. Hata ayıklamaya yardımcı olması için günlüğe kaydetmeyi etkinleştirin.
Önbelleğe alma davranışını test ederken ve sorun giderirken, tarayıcı istenmeyen yollarla önbelleğe almayı etkileyen istek üst bilgileri ayarlayabilir. Örneğin, bir tarayıcı bir sayfayı Cache-Control
yenilerken üst bilgiyi no-cache
veya max-age=0
olarak ayarlayabilir. Aşağıdaki araçlar istek üst bilgilerini açıkça ayarlayabilir ve önbelleğe alma testi için tercih edilir:
Önbelleğe alma koşulları
- İstek, 200 (Tamam) durum koduyla bir sunucu yanıtına neden olmalıdır.
- İstek yöntemi GET veya HEAD olmalıdır.
- içinde
Startup.Configure
, önbelleğe alma gerektiren ara yazılımdan önce Yanıt Önbelleğe Alma Ara Yazılımı yerleştirilmelidir. Daha fazla bilgi için, bkz. ASP.NET Core Ara Yazılımı. - Üst
Authorization
bilgi mevcut olmamalıdır. Cache-Control
üst bilgi parametreleri geçerli olmalı ve yanıt işaretlenmelipublic
ve işaretlenmemelidirprivate
.Pragma: no-cache
Üst bilgi mevcut değilse, üst bilgi mevcut olduğundaCache-Control
üst bilgiyi geçersiz kıldığındanCache-Control
Pragma
üst bilgi mevcut olmamalıdır.- Üst
Set-Cookie
bilgi mevcut olmamalıdır. Vary
üst bilgi parametreleri geçerli olmalı ve değerine*
eşit olmamalıdır.- Üst
Content-Length
bilgi değeri (ayarlandıysa) yanıt gövdesinin boyutuyla eşleşmelidir. - IHttpSendFileFeature kullanılmaz.
- Yanıt, üst bilgi ve ve
max-age
s-maxage
önbellek yönergeleri tarafındanExpires
belirtildiği gibi eski olmamalıdır. - Yanıt arabelleğe alma başarılı olmalıdır. Yanıtın boyutu yapılandırılan veya varsayılan SizeLimitdeğerinden küçük olmalıdır. Yanıtın gövde boyutu, yapılandırılan veya varsayılan MaximumBodySizedeğerinden küçük olmalıdır.
- Yanıtın RFC 9111: HTTP Önbelleğe Alma'ya göre önbelleğe alınabilmesi gerekir. Örneğin, yönergesi
no-store
istek veya yanıt üst bilgisi alanlarında mevcut olmamalıdır. Ayrıntılar için bkz . RFC 9111: HTTP Önbelleğe Alma (Bölüm 3: Yanıtları Önbelleklerde Depolama.
Not
Siteler Arası İstek Sahteciliği (CSRF) saldırılarını önlemek için güvenli belirteçler oluşturmaya yönelik Antiforgery sistemi, yanıtların Cache-Control
önbelleğe alınmaması için no-cache
ve Pragma
üst bilgilerini olarak ayarlar. HTML form öğeleri için sahte belirteçleri devre dışı bırakma hakkında bilgi için bkz . ASP.NET Core'da Siteler Arası İstek Sahteciliği (XSRF/CSRF) saldırılarını önleme.
Ek kaynaklar
- ASP.NET Core'da uygulama başlatma
- ASP.NET Core Ara Yazılımı
- 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
- 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