C#nedir?com
 
YAZAR HAKKINDA
Turhal Temizer
Turhal Temizer
http://www.turhaltemizer.com
İletişme geçmek için tıklayın.
92 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: Asp.Net Asp.Net MVC Cache CacheProfiler Linq LinqToSQL MVC OutpuCaching OutputCache Önbellek VarByParam ASP.NET Turhal Temizer
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : ASP.NET
Yayınlanma Tarihi : 29.9.2009
Okunma Sayısı : 15569
Yorum Sayısı : 1     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer 'in Blogu
ChatBot UI Sample 22.10.2017
Turhal Temizer 'in Blogu
C# – IRR Function 22.10.2017
Burak Selim Şenyurt
Asp.Net Core'da Bir WebSocket Macerası 22.10.2017
Burak Selim Şenyurt
.NET Core 2.0 ile Basit Bir Web API Geliştirmek 22.10.2017
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Asp.Net MVC Framework - OutputCache Kullanımı ve Performans
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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>

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
Makale:
Asp.Net MVC Framework - OutputCache Kullanımı ve Performans ASP.NET Turhal Temizer
  • Yazılan Yorumlar
  • Yorum Yaz
TEM
10
2014
çok güzel bir yazı tebrik ederim
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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