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:

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 VaryByQueryKeysdeğ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:
  • maksimum yaş
  • maksimum eski†
  • min-fresh
  • yeniden doğrulamalı
  • önbellek yok
  • mağaza yok
  • yalnızca önbelleğe alınmışsa
  • private
  • public
  • s-maxage
  • proxy-revalidate‡
†Bu sınır belirtilmezse max-staleara yazılım hiçbir işlem gerçekleştirmez.
proxy-revalidate‡ ile aynı etkiye must-revalidatesahiptir.

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:

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şaretlenmeli public ve işaretlenmemelidir private.
  • Pragma: no-cache Üst bilgi mevcut değilse, üst bilgi mevcut olduğunda Cache-Control üst bilgiyi geçersiz kıldığından Cache-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ından Expires 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

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.Configureara 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:

// 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 VaryByQueryKeysdeğ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:
  • maksimum yaş
  • maksimum eski†
  • min-fresh
  • yeniden doğrulamalı
  • önbellek yok
  • mağaza yok
  • yalnızca önbelleğe alınmışsa
  • private
  • public
  • s-maxage
  • proxy-revalidate‡
†Bu sınır belirtilmezse max-staleara yazılım hiçbir işlem gerçekleştirmez.
proxy-revalidate‡ ile aynı etkiye must-revalidatesahiptir.

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:

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şaretlenmeli public ve işaretlenmemelidir private.
  • Pragma: no-cache Üst bilgi mevcut değilse, üst bilgi mevcut olduğunda Cache-Control üst bilgiyi geçersiz kıldığından Cache-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ından Expires 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