Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET Core 2.2 – Response Caching

Merhaba

Bu içeriğimizde, hem istemci hemde sunucu tarafında önbelleğe alma sorumluluğunu güden Response Caching middleware’ini inceleyeceğiz.

Response Caching ile önbelleğe alınmış olan endpointler yapılan ilk request neticesinden sonraki tüm requestlerde belirtilen süre çerçevesinde önbellekten cevaplandırılacaktır. Dolayısıyla ilgili endpointler yersiz istekler ile lüzumsuz yere meşgul edilmeyecek böylece uygulama sunucusu gereken işlemlere daha çok odaklanabilecek ve total maliyet minimize edilmiş olacaktır.

Response Caching middleware’ini uygulamada kullanabilmek için ilk olarak ilgili projeye “Startup.cs” dosyasındaki “ConfigureServices” metodu içerisinde “AddResponseCaching” fonksiyonuyla aşağıdaki gibi servis olarak dahil edilmesi gerekmektedir.

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

Response Caching tanımlamasını yaparken aşağıdaki üç parametreyle ayarlarına müdahalede bulunabiliriz.

  • MaximumBodySize : Response Body’ler için geçerli maksimum boyut. Varsayılan olarak 64 MB’tır.
  • SizeLimit : Response Cache’in maksimum ne kadar boyutta tutulacağını belirtiriz. Varsayılan olarak 100 MB değerine sahiptir.
  • UseCaseSensitivePaths : Path değerinin büyük ya da küçük harf duyarlığında olup olmamasını belirler.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddResponseCaching(_ =>
            {
                _.MaximumBodySize = 250;
                _.SizeLimit = 250;
                _.UseCaseSensitivePaths = false;
            });
        }

Ve ardından yine aynı dosya içerisindeki “Configure” metodu içerisinde de uygulamada kullanılabilir olarak “UseResponseCaching” fonksiyonu ile aşağıdaki gibi ayarlanmalıdır.

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

Gerekli konfigürasyonları yaptıktan sonra cachelenmesini istediğimiz endpoint’te “ResponseCache” attributeu aracılığıyla aşağıdaki özellikleri kullanarak önbellekleme işlemi gerçekleştirilebilir.

  • Duration : Response’un saniye cinsinden ne kadar süre cache’de tutulacağını belirttiğimiz özelliktir.
  • Location : Cache’leme işleminin nerede yapılacağını belirttiğimiz özelliktir.
    • Any (Default)
    • Client :
    • None :
  • NoStore : Cache verisinin store edilip edilmeyeceği bilgisinin tutulduğu özelliktir. Bir başka deyişle sayfanın header bilgilerinde “no cache” bilgisinin gönderilip gönderilmeyeceğini belirler.
  • CacheProfileName : Cache profil ismini belirttiğimiz özelliktir. Makalenin ileriki satırlarında bu özelliğe atıfta bulunacağız.
  • VaryByHeader : Response header da yer alan Vary Key bilgisine göre önbellekleme işlemlerinin yapılmasını sağlar.
  • VaryByQueryKeys : Query String’te gelen parametreye göre hangi response’un cacheleneceği belirtilmektedir.

Şimdi aşağıdaki örnek kod bloğunu inceleyiniz.

    public class HomeController : Controller
    {
        [ResponseCache(Duration = 130)]
        public IActionResult Index()
        {
            ViewBag.Now = DateTime.Now;
            return View();
        }
    }

Yukarıdaki örnekte, ResponseCache attribute’u ile “Index” metodunda ki Response datayı 130 saniyelik bir süreyle cachelemiş bulunmaktayız. Uygulama çalışırken “Index” metoduna yapılan ilk requestte döndürülen Response data CacheMiddleware’i tarafından 130 saniye boyunca Response Cache’de tutulacak. Bu 130 saniye boyunca hiçbir request “Index” metodunu tetiklemeyecek ve response olarak direkt olarak middleware tarafından cache üzerinden elde edilen data gönderilecektir..

Cache Profiles

Her bir önbellek ayarlaması yukarıdaki gibi tek tek endpoint merkezli yapılabileceği gibi “Startup.cs” dosyasından da aşağıdaki gibi uygulama ayağa kaldırılırken direkt olarak ayarlanabilir.

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddResponseCaching();
            services.AddMvc(_ =>
            {
                _.CacheProfiles.Add("Default_Cache_1", new CacheProfile()
                {
                    Duration = 50
                });
                _.CacheProfiles.Add("Default_Cache_2", new CacheProfile()
                {
                    Duration = 65
                });
            });
        }

Bu şekilde ayarlanan Cache Profile tanımlamaları endpointler üzerinde aşağıdaki gibi kullanılabilirler.

    public class HomeController : Controller
    {
        [ResponseCache(CacheProfileName = "Default_Cache_1")]
        public IActionResult Index()
        {
            ViewBag.Now = DateTime.Now;
            return View();
        }

        [ResponseCache(CacheProfileName = "Default_Cache_2")]
        public IActionResult Index2()
        {
            ViewBag.Now = DateTime.Now;
            return View();
        }
    }

Asp.NET Core 2.2 - Response Caching

İlgilenenlerin faydalanması dileğiyle…

Sonraki yazılarımızda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Sadık Can dedi ki:

    Hocam merhaba,

    ResponseCacheLocation.Client olarak belirtirsek, ilk kez istek gönderen kullanıcı için server tarafından gerekli bilgi çekilip client tarafında bu bilgi belirtilen süre boyunca cache’lenir ve server tarafında herhangi bir bilgi tutulmaz ve aynı kullanıcı için cache süresi boyunca bilgiler hep cache üzerinden verilir. Yeni bir kullanıcı ilk kez request attığında bu adımlar onun için de tekrar edilir değil mi?

    Peki ResponseCacheLocation.Any olarak belirttiğimizde ilk gelen request sonucu server tarafında oluşturulan cache kendi süresi boyunca tüm gelen requestlere oradan cevap verir değil mi? Peki ResponseCacheLocation.Any için hem server hem client tarafında verinin cachelendiğini okudum client tarafında neden cacheleniyor ki madem server’da cache’lenen üzerinden tüm client’lara aynı response’ı dönecekse? Ya da eksik de anlamış olabilirim hocam. Bu ikisini açıklayabilirseniz çok sevinirim.

    İyi çalışmalar.

    • Gençay dedi ki:

      Merhaba,

      Client’ta cache işlemleri çok fazla başvurduğumuz yapılanmadır. Örneğin; .js, .css vs. gibi dosyalar olsun, image dosyaları olsun client’ta cachelenerek tutulurlar. Client’ta ki cache, ilgili datanın server’dan transfer edilmesini ortadan kaldıracak ve açılış sürecini daha da hızlandıracaktır. Server’da ki cache ise, server’ın in-memory’sinde verileri tutacaktır. Tamam, hızlıdır. Ama bir transfer maliyeti vardır 😉

      Kolay gelsin.
      Sevgiler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*