|  | 
        
            | 
                    
                        | Asp.Net MVC Framework - OutputCache Kullanımı ve Performans |  |  
                        | 
	
    
		
            | Gönderiliyor lütfen bekleyin... | 
 |  | 
        
            |  	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") %>
 </div>
 
 </asp:Content>
 |  
  
 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 
                Makale:Asp.Net MVC Framework - OutputCache Kullanımı ve Performans ASP.NET Turhal Temizer
 | 
        
            |  | 
        
            |  | 
        
            | 
                    
                        
                            
                        
                            Eklenen Son 10 
                            Bu Konuda Geçmiş 10 
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                            Son Eklenen 10 Makale Yükleniyor
                         
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         | 
        
            |  |