Ana içeriğe atla

Asp.Net MVC Framework - OutputCache Kullanımı ve Performans

Asp.Net MVC Framework ile geliştirilen uygulamaların sayısı gün geçtikçe artmaya devam etmektedir. Verileri ID üzerinde getirmesi, tasarım kalıpları ile uyumluluğu, geliştirme kolaylığı, OOP 'ye uyumlu olması ve bunun gibi bir çok sebepten ötürü yazılım geliştiricilerin tercih sebebi olmaktadır.



Geliştirilen web uygulamalarının performansının arttırılması için yapılan çok basit ve etkili bir yöntem bulunmaktadır. Caching kullanımı. Caching, web uygulamalarında son kullanıcı da tarafında görüntülenen sayfaların yerel bilgisayarlarında  yer alan temp klasörünün içerisine atarak daha sonraki açılışlarda sayfaların çok daha hızlı çalışabilmesine olanak tanımaktadır. Caching 'i gridlerin içerisinde yer alan verilen görüntülenmesi ve css ile Flash animasyonlarının görüntülenmesinde en yoğun olarak kullanılmaktadır.



Bu yazımızda Asp.Net MVC Framework ile hazırlanmış olan web uygulamalarında performansın arttırılması için Caching kullanımına değiniyor olacağız.



ASP.NET MVC Framework uygulamalarında veritabanından alınan kayıtların görüntülenmesinde yararlanılan kayıtlarda Caching özelliğinin en sık kullanıldığı gözlenmektedir. Biz de bu yazımızda değineceğimiz örneğimizde index isimli web sayfasında görüntülemiş olduğumuz kayıtların içerisinde kullanıyor olacağız. Ayrıca Caching özelliği kullanılan MVC uygulamaları web server lara atılırken bu sistemlerin Caching özelliğinin de açık olmasına dikkat edilmesi gerekmektedir.



Output Caching Kullanımı



OutputCaching 'in aktif duruma getirilmesi için Controller sınıflarında kullanılan actionların üst kısımlarına (örn: Index() ) [OutputCaching] özniteliğini (attribute) eklemek yeterli olacaktır. Bu durumda hazırlayacak olduğumuz örneğe Caching 'i ekliyor caching zamanını 10 saniye olarak ekliyoruz.



Controllers\HomeController.cs

using System.Web.Mvc;



namespace Caching.Controllers

{

    [HandleError]

    public class HomeController : Controller

    {

        [OutputCache(Duration=10,VaryByParam="none")]

        public ActionResult Index()

        {

            ViewData["Message"] = "Merhabalar";

   

            return View();

        }



        public ActionResult About()

        {

            return View();

        }

    }

}


Yapılmış olan işlem, Index sayfasına yapılan istekler doğrultusunda 10 saniyelik aralıklar ile caching mekanizmasını yenileyerek ekranda görünen kayıtları ara belleğe alacaktır. Ayrıca caching süresi ile ilgili bir kısıtlama yer almamaktadır. İsteğinize bağlı olarak günde sadece bir kez caching işlemini gerçekleştirsin derseniz ekleyecek olduğunuz zaman değeri 60 saniye * 60 dakika * 24 saat olması gerekecektir.



Caching kullanımında dikkat edilmesi gereken bir nokta var. Kaynaklara harcanacak olan bellekler kısıtlı olduğundan ötürü Caching kullanırken başlama süresinin otomatik olarak kullanılmasına bırakmak doğru bir tercih olacaktır.



Home Controller sınıfı içerisinde yer alan Index() metoduna Cache değerini vermiştik. Şimdi bu metodun view sayfasını oluşturarak oluşan sonucu gözlemleyelim.



Views\Home\Index.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>



<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">

    Index

</asp:Content>



<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">



    <h2>Index</h2>

    <div>

         Saat şu anda <%=DateTime.Now.ToString("T") %>

    



</asp:Content>


Free Image Hosting



Index() metoduna eklediğimiz Cache özniteliğinden sonra Views\Home\Index yolundaki web sayfasını çalıştırdığımızda yukarıdaki ekran görüntüsünü elde ediyor olacağız. Bu arada ekran da görülen zaman değeri de Cache lenmiş durumda bulunmaktadır ve bizim belirttiğimiz 10 saniye boyunca internet sayfasını ne kadar yenilersek yenileyelim bu değeri görüyor olacağız. Bu durumda da  kullandığımız tekniğin çalıştığı görmüş olacağız.



Unutulmaması gereken bir konu, Cache 'i herkesin görüntülediği view sayfalarda kullanmak çok daha mantıklı bir işlem olacaktır. Çünkü Cache lediğiniz veriler IIS sunucu üzerinde tutulacak ve bellek harcayacaktır. Bu sebepten ötürüde hangi sayfa ve action çok fazla kullanılacaksa onları Cache lemek web uygulamalarının oldukça hızlı olmasını sağlayacaktır. Ancak tersi bir durum olması da kaçınılmaz bir durum olabilir. Ön bellekte tutulan veriyi ne kadar arttırırsak uygulamanın da kısmen yavaşlamasına sebep olabiliriz.



Cache kullanılması durumda performans artışı sağlayan bir diğer kullanım alanı ise veri tabanından alınan kayıtların gösterilmesidir. Bu kullanım esnasında verileri ara bellekte tuttuğumuzda belirli bir süre boyunca kaydedilen verileri gösteriyoruz. Kullanımın en avantajlı durumu ise bir web sayfasına 1000 kişi giriyor ve bu kişiler sürekli veri ekliyorlar. Web sitesinde ise eklenen bu veriler ana sayfa üzerinde gösteriliyor. Sayfayı görüntüleyen kullanıcılar her yenilediklerinde bu verileri tekrardan yüklemek yerine belirli süre aralıkları ile yüklemek o kullanıcıların sayfayı daha hızlı açmasına imkan sağlayacaktır. Ancak dikkat edilmesi gereken çok önemli bir nokta var. Ara belleğe alınan kayıtlar web  sunucusu üzerinde tutulmakta ve çok kısa sürede yenilenmesi istenirse sayfanın görüntülenmesi performansında önemli kayıplara sebep olabilmektedir.



Not: MVC uygulamalarında View sayfalarında içerisinde <%= OutputCache %> şeklinde bir kullanım çalışmayacak ve sayfa içerisinde belirtilen bölümün arabelleğe alınmasına olanak tanımayacaktır.



Nerede İçerik Arabelleğe ( Cached ) Alınacak ?



OutputCache özniteliğini MVC projelerinde kullandığımızda varsayılan olarak üç bölümde ara belleğe alma işlemi uygulamaktadır. Bunlar;

   •Web Server

   •Proxy Server

   •Web tarayıcısı

şeklindedir. Ancak istenirse [OutputCache] özniteliğinin özelliklerinden yararlanarak belirli bölümlerde kullanılmasına olanak tanıyabiliriz.



Peki bu yerel özellikler nelerdir?

   •Any

   •Client

   •Downstream

   •Server

   •None

   •ServerAndClient

şeklindedir.



Varsayılan olarak yerel özelliklerden Any kullanılmaktadır. Bu özellik hem sunucu tarafında hem de internet tarayıcısı tarafında arabelleğe yapmaktadır. Örnek vermek gerekirse web uygulamasına giriş yaptığımızda kullanıcı bilgileri ara belleğe alınmaktadır. Ancak bu bilgilerin sunucu tarafında tutulmasına gerek yoktur. Bu tür bilgilerin Client tarafında tutuluyor olmasın uygulama bazında performansa etki edecek faktörlerden biridir.



Şimdi bu konu ile ilgili bir örnek düşünelim. Controller katmanı içerisinde GetName() isimli bir action oluşturalım bunun geri dönüş değerini kullanıcı adı olarak belirleyelim. Eğer kullanıcı GetName() metodunun kullanırsa mesela " Merhaba TurhalTemizer " bir geri dönüş değeri kullanacaktır. Eğer ki geri dönen string değeri ön belleklersek bu sunucu üzerinde olacak ve bu değer yenilene kadar bütün kullanıcılar biraz önce bizim almış olduğumuz mesajı almaya devam edeceklerdir. Bu istenmeyen durumu kod yardımı ile örneklemek gerekirse,



Controllers\HomeController.cs

using System.Web.Mvc;

using System.Web.UI;



namespace Caching.Controllers

{

    public class NotLikeUserController : Controller

    {

        [OutputCache(Duration = 3600, VaryByParam = "none")]

        public string GetName()

        {

            return "Merhaba " + User.Identity.Name;

        }

    }

}


YYukarıda kullanmış olduğumuz yöntem büyük ihtimalle istediğimiz bir şekilde çalışmayacaktır. Herkesin Merhaba TurhalTemizer görmesi istenen bir durum değil.



Ön bellek kullanırken ilk olarak hiç kullanıcı bilgileri sunucu tarafında tutulacak mı diye düşünmek olacaktır. Daha öncede belirttiğimiz gibi kullanıcı bazlı önbellek işlemlerini internet tarayıcısı tarafında yapılması daha doğru bir tercih olmaktadır.



Edinmiş olduğumuz bu bilgilerden yararlanarak GetName() action ınında biraz düzenleme yapalım. Bu değişikler sonrasında içerik tarayıcı önbelleğinde tutulurken sunucular üzerinde herhangi bir işlem yapmayacaktır. Ayrıca uygulama üzerinde yer alan kişilerin kullanıcı adlarını gösteren uygulama çalışırken ön bellek sunucu üzerinde yapılacağı için her kullanıcı giriş yapmak istediğinde daha önceden girmiş herhangi bir kişinin de kullanıcı adını görmüyor olacaktır.



Controllers\HomeController.cs

using System.Web.Mvc;

using System.Web.UI;



namespace Caching.Controllers

{

    public class UserController : Controller

    {

        [OutputCache(Duration = 3600, VaryByParam = "none", Location=OutputCacheLocation.Client, NoStore=true)])]

        public string GetName()

        {

            return "Merhaba " + User.Identity.Name;

        }

    }

}


[OutputCache] özniteliğine atanan değerlerin arttırılması ile istediğimiz sonuç elde ediliyor. Önbellek işleminin nerede olacağını belirtmek için Location özelliğine OutputCacheLocation.Client değerini atıyoruz. NoStore proxy sunucusunda yer alan değerlerin kalıcı bir şekilde saklanmasına olanak tanır. Bu değeri de true olarak belirledikten sonra istediğimiz sonucunda gerçekleştiğini görürüz.



Output Cache Çeşitlendirme



Geliştirilen uygulamalar için bazı durumda görünen değerler için de önbellek kullanılması gerektiği durumlar olabiliyor. Örneğin Master/detail sayfalarda yer alan bir değer için Id sinden yararlanarak detaylarını gösterebilmemize olanak vardır. Bu seçilen değerler için detayları getirmek amacıyla da kullanılmaktadır.



Yukarıda değinmiş olduğumuz konu ile ilgili sürekli örneklerimizde kullandığımız film veritabanından yararlanabiliriz. Burada iki adet action kullanacağız. Birincisi Master() diğeri ise Details() olacaktır. Ayrıca önbellek özelliklerinde VarByParam 'ın değeri Master için bir değer vermezden Details() için Master dan tıklanacak olan Id değerini veriyor olacağız. Bu durumda Master() action nundan seçilen değeri Detail() üzerinde kullanırken gerekli ön bellekleme işlemini de gerçekleştirmiş olacağız.



Not: Eğer ki bu örneği anlamakta zorluk çekiyorsanız MVC Framework ile ilgili daha önce yayınlanmış olan yazıları inceleyebilirsiniz.



Controllers\MoviesController.cs

using System.Linq;

using System.Web.Mvc;

using Caching.Models;



namespace Caching.Controllers

{

    public class MoviesController : Controller

    {

        private MovieDataContext _dataContext;



        public MoviesController()

        {

            _dataContext = new MovieDataContext();

        }



        [OutputCache(Duration=int.MaxValue, VaryByParam="none")]

        public ActionResult Master()

        {

            ViewData.Model = (from m in _dataContext.Movies select m).ToList();

            return View();

        }



        [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]

        public ActionResult Details(int id)

        {

            ViewData.Model = _dataContext.Movies.SingleOrDefault(m => m.Id == id);

            return View();

        }

    }

}


VarByParam özelliğinde kullanılan none önbellek esnasında çeşitlendirilmiş içerik almayacağını belirtir. * kullanırsak form üzerinde yer alan bütün string parametreli değereri önbelleğe alacaktır. Eğer ki özel bir değeri veriyorsak da yalnızca bu değer için önbellekleme işlemi yapacaktır.



Cache (Önbellek) Profili Oluşturma



MVC ile hazırlanmış uygulamalarda OutputCache özniteliğini her Action üzerinde tanımlamakla birlikte çok sık olarak kullanılacak ayarlar için web.config içerisine de bu değerleri belirtip kullanım esnasında profil olarak kullanabilinmesi mümkündür. Özellikle grup içerisinde çalışılan projelerde bu kullanım şekli geliştirilebilirliğe ve kod okunabilirliğini oldukça fazla katkısı olacaktır.



Web.config dosyasının içerisinde yer alan <system.web> 'ın içerisinde <caching> i kullanarak önbellek profilinin eklenebilinmesi mümkündür.



Controllers\MoviesController.cs

<caching>

    <outputCacheSettings>

        <outputCacheProfiles>

            <add name="SaatlikOnBellek" duration="3600" varyByParam="none"/>

        </outputCacheProfiles>

    </outputCacheSettings>

</caching>


OutputCache özniteliğinde bu sefer CacheProfile özelliğini kullanarak önbellekleme işlemi gerçekteştireceğiz.



Controllers\HomeController.cs

using System.Web.Mvc;



namespace Caching.Controllers

{

    [HandleError]

    public class HomeController : Controller

    {

        [OutputCache(CacheProfiler="SaatlikOnBellek")]

        public ActionResult Index()

        {

            return DateTime.Now.ToString("T");

        }



    }

}


Eğer ki Index() action 'ını içeren bir istek olursa ekran görülen zaman tam bir saat sonra kendisini güncelleyecek yani sayfa içerisinde önbelleklenmiş olan değerler bu zaman aralığından sonra kendisini tekrardan güncelleyecektir.



Geldik bir yazımızın daha sonuna, bu yazımızda MVC Framework ile hazırlanmış olan uygulamalarda ön bellekleme kullanılmak istediğinde hangi işlemlerin yapılacağına ve OutputCache niteliğini ve bunun özelliklerini detaylı bir biçimde incelemeye çalıştık.



Umarım yararlı olabilmiştir.
Kaynaklar

Yorumlar

Bu blogdaki popüler yayınlar

Olasılıksız - Kitap Yorum

Olasılıksız hayatımda okuduğum en iyi kitaptı. Tek çırpıda hiç sıkılmadan, eğlenerek okudum bu kitabı, tavsiyem sizinde okumanız.Kitabın kapağı ve içeriği ile ilgili kısa bilgi aşağıdadır.Olasılık, tahmin, düşünceler, nöbetler, karışıklıklar, ileriyi görebilme zannı, dejavu ve tabii ki olasılıksız şeyler. Bu kelimelerle içli dışlı olabileceğiniz, bütün bu kelimelerin yaşamdaki yerini kavrayabileceğiniz müthiş bir uyarlama.Adam Fawer' ın ortaya çıkardığı bu uyarlama romanın müthiş bir çalışmanın ve araştırmanın sonucu ortaya çıktığının kitabın başından sonuna kadar farkındasınız. Bu uyarlamasını, derin araştırmalarıyla birleştirip romanı tekdüzelikten çıkarıp müthiş bir yere koyduğu için de Fawer' a müteşekkir oluveriyorsunuz. Sıkıcı diye nitelendirebileceğiniz teorik bilgileri bile bir çırpıda okuyuveriyorsunuz. Teorik bilgiler dahi olaylarla sonuna kadar bağlantılı aktarılmış. Tekdüzelikten çıkmış bir roman; olasılıksız. Her an olayın kurgusunun değişmesi olasılık dahilinde. …

.Net 3.5 SP1 – Full Install Packages (Tam Kurulum)

.Net Framework 3.5 SP1 ‘i bilgisayarınıza kurmak istediğinizde normal şartlar altında Microsoft ‘un sitesinde 2.7 mb ‘lik bir dosya indirir ve kurulum işlemlerinizi bu dosya üzerinden yaparsınız. Ancak bu indirmiş oluğunuz dosya yaklaşık 220 mb ‘lik veriyi internetten indirerek kurulum yapmaktadır. İnternet çıkışına izin verilmeyen kurumlar ve kuruluşlar için bu durum bir sıkıntı oluşturmaktadır. Bu sebepten ötürü aşağıdaki link yardımı ile tam yükleme paketini indirdikten sonra hiç internet ihtiyacınız olmadan .Net 3.5 SP1 ‘i kurabilmeniz mümkün olacaktır.Link

Çoklu Dil Desteği – Veri Tabanı Tasarım Örnekleri ile

Zaman içerisinde karşımıza çok farklı projeler gelebilmektedir. Ancak bu projeler içerisinde özellikle de global ölçekli ya da bu ölçekte uygulama geliştiren firmalarda bazı temel gereksinimler sürekli olarak karşımıza çıkabilmektedir. Bu gereksinimlerden biri ve belki de en önemlisi olan çoklu dil desteğinin veri tabanı (DB) katmanında nasıl yapıldığını kısa ve hızlıca inceliyor olacağız.Öncelikle çoklu dil desteği dediğimizde aklımıza gelen ilk çözüm yolu *.resx dosyalarını kullanmak gelmektedir. Ancak bu uzaktan yönetilen ya da anlık olarak metin değişikliği gereksinimi bulunan uygulamalarda bazı ufak problemler çıkartabilmektedir.Ne gibi problemler derseniz; iki grupta inceleyebiliriz. Web projeleri ve windows üzerinde çalışan projeler.Web projelerinde IIS üzerinde yer alan bir *.resx dosyasını değiştirdiğinizde son kullanıcı tarafında etkisi hemen görülmeyebilir. Cache mekanizmaları sebebiyle ortalama 15-30 dakika arasında bir görüntüleme süre farkı ile karşılaşabiliriz. Faha köt…