.NET Core’da cache kullanımları #3 Response Cache

Gökten Karadağ
3 min readAug 3, 2020

Bu yazıda .NET Core’da response cache konusundan bahsedeceğim.

Cache ile ilgili daha çok bilgi almak ve .NET Core’daki diğer cache kullanımlarını incelemek için, serinin diğer yazılarına aşağıdaki linklerden ulaşabilirsiniz.

  1. .NET Core’da cache kullanımları #1 InMemory Cache
  2. .NET Core’da cache kullanımları #2 Distributed Cache
  3. .NET Core’da cache kullanımları #3 Response Cache

Response Cache Nedir?

Response cache bir web sayfasına gelen isteklerin sonuçlarının depolanmasıdır. Bu sayede bir sonraki istek geldiğinde, istek tekrar oluşturulmak yerine önbellekten hızlıca aktarılır.

Response caching [https://jakeydocs.readthedocs.io/]

.NET Core’da response cache’in nasıl çalışacağı bilgisi ilgili HTTP headerları ile belirlenir. Bu headerlar ile ilgili daha fazla bilgiye buradan erişebilirsiniz.

ResponseCache Attribute

ResponseCacheAttribute actionlarımızda cache mekanizmasının nasıl ayarlanması gerektiğini belirtmek için kullanılır.

ResponseCache attribute’üne ait kullanılabilecek özellikler şunlardır.

  • Duration : Response’un kaç saniye cache’de tutulacağını belirtir.
  • Location : Cache’in işleminin nerede yapılacağını belirtir.Değerleri Any(hem client hem proxy), Client (sadece client), None (no-cache) olabilir. Default değeri Any’dir.
  • NoStore : Verilerin saklanıp saklanmyacağını belirtir. Eğer true olarak ayarlanmışssa cache-control header’ı no-store olarak gönderilir.
  • CacheProfileName : Cache profil ismini belirtir.
  • VaryByHeader : Header’da yer Vary bilgisine göre cache işlemlerinin yapılmasını sağlar.
  • VaryByQueryKeys : Query String’ten gelen parametreye göre cacheleme işlemini sağlar. (Kullanmak için ResponseCacheMiddleware’in eklenmiş olması gerekir)

Örnek bir Response Cache Attribute kullanım örneği:

[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any,   NoStore = false)]
public IActionResult Privacy()
{
return View();
}

Bu action’a istek yaptığımızda http header sonucu aşağıdaki gibi olur.

Cache-Control: public,max-age=10

Response cache’in doğru bir şekilde çalışmasını test ederken dikkat edilmesi gereken bazı noktalar vardır. Örneğin browser, sayfa yenilendiğinde Cache-Control=no cache veya max-age=0 olarak iletebilir. Bu gibi durumlar için browser üzerinde test etmek yerine Microsoft’un da önerdiği postman ya da fiddler gibi toollar kullanılarak test edilmesi daha uygun olabilir.

Postman’de test ederken send no-cache header’ı kapalı olmalıdır.

Cache Profile

Birden çok controller action’da aynı cache ayarlarını yapmak yerinetek bir cache profile yaratıp bunu istediğiniz action’da kullanabilirsiniz.

Bunun için Startup.ConfigureServices içinde yapılması gereken tanımlama;

services.AddControllersWithViews(options =>     options.CacheProfiles.Add("Duration45",new CacheProfile     {        Duration = 45     }));

Bu tanımlamadan sonra istenen herhangi bir actiona ilgili profile’ın tanımlanması yeterlidir.

[ResponseCache(CacheProfileName = “Duration45”)]

ResponseCache Middleware

Response cache middleware’i eğer response cachelenebilir durumda ise response’u memory’de saklar ve bir sonraki istekte bu isteği cache’ten sunar.

Response’un cachelenebilir durumda olması için, Http statuscode 200 dönmeli, authorization header içermemeli gibi kısıtlar vardır. Gerekli tüm durumların listesini buradan inceleyebilirsiniz.

ResponseCache middleware’ini kullanmak için yapılması gerekenler ise şu şekildedir;

Startup.ConfigureServicesiçine ilgili kodu ekleyelim.

public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
}

Burada kullanabileceğimiz 3 adet ayar bulunmakta. Bunlar;

  1. SizeLimit : Response cache’in alabileceği maksimum boyutu belirtir. Default değeri 100 MB dır.
  2. UseCaseSensitivePaths : Case sensitive path olup olmamasını belirler.
  3. MaximumBodySize : Response body’ler için geçerli maximum boyutu belirler. Default değeri 64 MB dır.

Son olarakStartup.Configure içine UseResponseCaching metotunu ekleyelim.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseResponseCaching();
}

ResponseCache attribute ile ResponseCacheMiddleware karıştırılmamalıdır. Attribute, response’un hangi durumlarda cacheleneceğini belirtir, Middleware ise response uygun durumda ise bu bilgiyi cacheler. Yaygın olarak bilinenin aksine ResponseCache attribute’ünü kullanmak için ResponseCache Middleware’i kullanmaya gerek yoktur ( VaryByQueryKeys özelliği hariç ).

ResponseCache anlaşılması,kullanımı,test etmesi biraz zahmetli bir konu. Bu yüzden kullanılırken dikkatli olmakta fayda var. Umarım faydalı bir yazı olmuştur. Anlatımda bir hata olduğunu düşünüyorsanız lütfen yorum yapmaktan çekinmeyin. Bir sonraki yazıda görüşmek üzere.

Proje Github Linki : https://github.com/gktnkrdg/netcore-cache-examples

Kaynaklar

[1] https://docs.microsoft.com/tr-tr/aspnet/core/performance/caching/response?view=aspnetcore-3.1

[2]https://docs.microsoft.com/en-us/aspnet/core/performance/caching/middleware?view=aspnetcore-3.1

[3]http://jakeydocs.readthedocs.io/en/latest/performance/caching/response.html

[4]https://gunnarpeipman.com/aspnet-core-response-cache/

--

--