Veri Gösterim Kontrolü Altyapısı (Model View Controller) ve Önbellekleme (Output Caching)

Eyl 06, 2013

Veri Gösterim Kontrolü Altyapısı (MVC Framework)'nda Önbellekleme, Web uygulamalarında kullanıcı tarafında görüntülenen sayfaların, kullanıcıların yerel bilgisayarlarında yer alan "Temp" klasörünün içerisine atılarak daha sonraki açılışlarda sayfaların çok daha hızlı çalışabilmesine olanak tanımaktadır. "Temp" klasörünün yerine herhangi bir Web sunucusu veya Proxy sunucusu da kullanılabilir. Önbellekleme kullanımı, veritabanı içerisinde yer alan verilerin ve "Flash" animasyonlarının görüntülenmesinde en yoğun olarak kullanılmaktadır. Böylece aynı kullanıcı tarafından tekrar tekrar gelen talepler sonucunda oluşan gereksiz veri akışı engellenir ve sunucu tarafındaki yükün azaltılması sağlanır. Bu da ciddi derecede performans artışı demektir. Ancak, çok fazla önbellekleme yapılması da tam tersine performansı artırmak yerine düşürebilir, çünkü bilgisayarın belleğini (Ram) kullanmaktadır.

Bir ASP.NET MVC Framework uygulaması oluşturabilmek için öncelikle bilgisayarda Visual Studio 2008 SP1, ASP.NET MVC  1.0 ve .NET Framework 3.5 SP1 yüklü olmalıdır.

  1. Visual Studio'da File (Dosya) sekmesinden New Project (Yeni Proje)'e tıklanır ve açılan pencereden ASP.NET MVC Web Application (ASP.NET MVC Web Uygulaması) seçilerek proje oluşturulur.




  2. Test projesi istenip istenilmediğine dair bir pencere çıkacaktır. Tercihe göre bir seçim yapılarak OK (Tamam)'a tıklanır.




  3. "F5" tıklanırsa proje derlenmiş olur ve aşağıdaki gibi bir görüntü ortaya çıkar. Görüldüğü gibi önceden kullanıcı için otomatik olarak hazırlanmış bir arayüz mevcuttur.




  4. Öncelikle Önbellekleme özelliğini aktif hale getirmek gerekir. Bu da Controller (Kontrol) katmanındaki sınıfların içerisindeki gerçekleşmesi istenilen her metodun üzerindeki satıra “[OutputCache(Duration=10,VaryByParam="none")]” kodu eklenerek gerçekleştirilebilir. Eğer uygulamadaki tüm metodlar için aktif olması isteniyorsa sınıfın içine yazmak yerine dışına yazmak yeterli olacaktır. Duration (Süre) parametresinin yanındaki “10” rakamı isteğe göre değişebilir. Bu, her 10 saniyede bir önbellekleme işleminin gerçekleştirilmesi anlamına gelir. VaryByParam özelliğinin ise none (hiç) olması herhangi bir parametre çeşidine göre önbellekleme yapılmaması demektir. Örneğin none yerine "*" kullanıldığı takdirde, string (karakter dizisi) parametreli değerlerin tümü önbelleğe alınacaktır.

  5. Projenin oluşturulmasıyla beraber otomatik olarak oluşturulan Controller katmanının içerisindeki HomeController.cs dosyasının içindeki index() metodunun üzerine “[OutputCache(Duration=10,VaryByParam="none")]” kodu eklenir. Bu kodu girdikten sonra sayfa 10 saniye içerisinde ne kadar yenilenirse yenilensin aynı içeriği görüntüleyecektir.

                      


    namespace MVC_Caching.Controllers
    {
        [HandleError]
        public class HomeController : Controller
        {
            [OutputCache(Duration=10,VaryByParam="none")]
            public ActionResult Index()
            {
                 ViewData["Message"] = "İTÜ Bilgi İşlem Daire Başkanlığı";
                 return View();
            }
            public ActionResult About()
            {
                 return View();
            }
        }
    }

  6. Visual Studio’daki proje dizini içerisindeki  Views (Görünümler) -> Home (Ev) -> Index.aspx dosyası açılarak önbellekleme işleminin hangi içerik üzerinde uygulanacağı belirlenebilir. İstenilen bir yere "<% = DateTime.Now.ToString("T")%>" kodu eklenerek, o an saatin kaç olduğu 10 saniyelik periyotlarla bellekte tutulacaktır.

                     

    <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage" %>
    <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
        Home Page
    </asp:Content>
    <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
        <h2><%= Html.Encode(ViewData["Message"]) %></h2>
        <div>
        Bellekteki Saat : <% = DateTime.Now.ToString("T") %>
        </div>    

    </asp:Content>





  7. Varsayılan olarak ara belleğe alma işlemi, hem sunucu tarafında hem de istemci tarafında uygulanmaktadır. MVC Framework, verilerin sadece istemci tarafında da tutulabilmesini sağlar ve performans artışı sağlar. Örnek olarak; bir Web uygulamasına kullanıcı adı ve şifre yazılarak giriş yapıldığında, girilen kullanıcı bilgilerinin sunucu tarafında ara belleğe alınmasına gerek yoktur. Ancak, yukarıdaki Output Cache kullanımı şekli kullanılırsa önbellekleme işlemi sunucu tarafında da yapılacağı için uygulama belli bir süreliğine herkesi aynı kullanıcı olarak kabul edecektir. Bu da istenmeyen bir durumdur. Bunu düzeltmek için "[OutputCache(Duration=10, VaryByParam="none")]" yerine "[OutputCache(Duration=10, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]" kodu eklenir. "OutputCacheLocation.Client" kısmı verilerin istemci tarafında tutulacağını, NoStore (Saklama Yok) özelliğinin de true (doğru) olması geçit sunucusunda yer alan değerlerin kalıcı olması anlamına gelir.

    namespace MVC_Caching.Controllers
    {
        [HandleError]
        public class HomeController : Controller
        {
            [OutputCache(Duration=10,VaryByParam="none", 
                         Location=OutputCacheLocation.Client, NoStore=true)]
            public ActionResult Index()
            {
                ViewData["Message"] = "İTÜ Bilgi İşlem Daire Başkanlığı";
                return View();
            }

            public ActionResult About()
            {
                return View();
            }
        }
    }



  8. MVC ile hazırlanmış projelerde önbellekleme işlemini gerçekleştirirken her metodun üzerine kodun teker teker yazılması yerine bir profil oluşturulup daha sonra yazılan profilden de özelliklerin otomatik olarak çekilebilmesi mümkündür. Bunun için Visual Studio'da proje dizinin altında yer alan "Web.config"dosyasının içine girilir ve "<system.web>" yazan yerden hemen sonra aşağıdaki kod eklenerek önbellek profili oluşturulur.

    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <clear/>
          <add
            name="Saat"
            duration="10"
            varyByParam="none" />
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>



  9. Önbellek profili oluşturulduktan sonra artık istenilen metodun üstüne sadece aşağıdaki gibi kod eklenerek ara belleğe alma işlemi gerçekleştirilebilir.

    namespace MVC_Caching.Controllers
    {
        [HandleError]
        public class HomeController : Controller
        {
            [OutputCache(CacheProfiler="Saat")]
            public ActionResult Index()
            {
                 ViewData["Message"] = "İTÜ Bilgi İşlem Daire Başkanlığı";
                 return View();
            }
            public ActionResult About()
            {
                 return View();
            }
        }
    }