ASP NET sitelerinde performansı arttırmak için kullanılan en önemli yapılardan biri olan Caching mekanizmasını anlatmaya çalışacağım. Caching'in Türkçesi önbellekleme demektir ki adından da anlaşılacağı gibi sayfanızın bir kopyasının önbellekte saklanması ve artık gelen isteklere de önbelleklenmiş sayfanın gösterilmesi ve bu sayede ASP. NET sayfamızın yeniden derlenmemesi ve böylece artan performans. Artık düşündüğümüzde 1000 lerce kişinin bağlandığı bir server da isteklere göre sayfaların derlenmesi ve kullanıcılara gösterilmesinin oluşturacağı gecikmeyi herhalde tahmin edebilirsiniz ama tabii ki cachin'gin iyi yönleri olduğu gibi kötü yönleride vardır, aslında kötü yönleri demeyelim de dezavantajları diyelim ama ne güzeldir ki yine bu dezavantajları da caching için kullanacağımız kodlarda bazı değişikler yaparak giderebiliriz. Caching olayını eğer sınıflamak gerekirse ana başlık altında 2 sınıfta toplayabiliriz. 1- OutPut Caching 2- Data Caching Ve bunların dışında ama yukarıdakiler ile alakalı alt başlık olarakta koyabileceğimiz özelleşmiş cachingler ise Fragment Caching ki bu OutPut Caching'in özelleşmiş bir halidir ve DataSource Caching ki bu da Data Caching in özelleşmiş halidir. Biz bu makalemizde Data Cacheing hariç diğer bütün yöntemlere göz atmaya çalıcağız. OutPut Caching : Bu Cachleme sayesinde sayfamızın son HTML halininin önbellekte bir kopyası oluşturulur ve gelen isteklere bu sayfalar gönderilir ama unutmadan söyleyelim cache için bir yaşam süresi diyebileceğim Duration alt özelliğini eklememiz gerekecektir. Bunun sayesinde cache mizin ne kadar süre önbellekte saklanacağını ayarlamış olacağız. Şimdi bu dediklerimizi bir örnekle açaklamaya çalışalım. İlk başta kendinize yeni bir ASP. NET projesi oluşturun. Aşağıdaki resimde olduğu gibi sayfasınıza <%@ OutputCache Duration="5" VaryByParam="None" %> satırını ekleyin. Bu kod satırını açıklamak gerekirse ; Duration : Sayfamızın önbellekte ne kadar saklanacağını belirttiğimiz alt özelliktir. VaryByParam : Bu alt özellikiğin "None" yapılması demek, Sayfamızın tamamının önbelleğe alınması demektir ki buna ileride daha detaylı değineceğiz. Şimdi sayfamıza önbelleklemeyi somut bir şekilde görmek için Zaman ekleyelim. Bunu yapmak için tek yapmanız gereken sayfamıza bir tane label eklemeniz ve şu kodları yazmanız; Kod: public partial class _Default : System. Web. UI. Page { protected void Page_Load } Yukarıda bulunan kodda sizinde göreceğiniz gibi Sayfa her Yüklendiğinde eğer önbellekleme yapılmamış ise o anki saati gösterir ama şimdi sayfamızı derleyelim ve sayfamızı devamlı Refresh yani yenileyelim, ne gördünüz? Tabiki saatin hiç değişmediğini, neden? Nedeni ni söyleyelim ; Önbellekleme tabiki. Sayfamızı devamlı yenilerseniz 5 saniyede bir saatin saniyesinin değişeceğini göreceksiniz. Çünkü biz önbellekleme süresini 5 saniye olarak ayarladık ve her 5 saniyede yeni bir cachimiz oluşturulur. Bu olayın avantajları : Sayfamız yeniden derlenmedi Kullanıcılara değişmeyen yani static sayfalar daha hızlı bir şekilde gösterilir Server gereksiz yere yorulmaz Kısacası performans artışı... Dezavantajlar ise : Eğer sayfamız dinamik olsaydı ve dışarıdan QueryString ler ile farklı bilgiler gelseydi! İşte yukarıdaki dezavantajtan sıyrılmanın yöntemi : Yeniden bir proje açın ve bu sefer iki tane asp. net sayfası ekleyin projenize. İsimleri Default.aspx ve Default2.aspx olsun. Default2.aspx sayfasının Source kısmına şunu yazmayı uutmayın : <%@ OutputCache Duration="10" VaryByParam="None" %> Burada önbellekte kalma süresini 10 saniye yaptık. Şimdi Default.aspx sayfamızın Kod kısmı olan Default.aspx. cs sayfasının Button_Click olayına aşağıdaki kodları yazın ama bundan önce tabi sayfamıza bir tane TextBox ve bir tane de Button Kontrolu koymayı unutmayın. Kod: protected void Button1_Click Burada Default2.aspx sayfamıza giden QueryStringi sayesinde TextBox1 den alınan veriyi gönderiyoruz şimdi de Default.aspx sayfasına bir tane Label koyun ve Default2.aspx. cs sayfasına ise şu kodları yazın ; Kod: protected void Page_Load Burada ise gelen verimizi Request ile aldırdıktan sonra Labelimiza yazdırıyoruz. Evet şimdi deneyin bakalım ne olacak. Ben size söyleyeyim ilk gönderdiğiniz veri Default2.aspx sayfamızda görülecek ama bunda sonra her göndereceğiniz veride yeni ilk gönderdiğiniz veri şeklinde gözükecek. Yani Label kontrolmuzde hep aynı yazı gözükecek taki 10 sn geçene kadar. İşte size Dezavantaj?. İşte bundan şöyle sıyrılacağız : <%@ OutputCache Duration="10" VaryByParam=" " %> kodumuzun VaryByParam özelliğini " " bu şekilde yapın ve bu sefer yeniden deneyin bakalım ne olacak o zaman. İşte şimdi problem çözüldü. Artık her gelen yeni QueryStringe göre bir cache oluşturulup kullanıcılara en taze hali gösterilir ama burada da çok ama çok önemli bir durum söz konusu: Şimdi siz mesela "Ahmet" diye bir QueryString gönderdiniz Default2.aspx sayfamıza ve doğal olarak ta label kontrolmuzda "Ahmet" gözükecektir. İşte bu sayfanın serverda A kopyası olarak saklandığını düşünelim. Peki başka bir kullanıcı ise "Mehmet" diye bir QueryString gönderdi o zaman Default2.aspx sayfamda ise "Mehmet" olarak gözükecektir Label kontrolum ama önceki A kopyam silindi mi peki? Cevap vereyim: Kocaman bir Hayır! A kopyam hala saklanmakta ve bu sefer ise "Mehmet" olan B kopyam olarak saklanıyor. Eğer başka bir tane daha farklı bir QueryString ile sayfama istekte bulunulursa bu sefer sayfam C kopyası olarak saklanacaktır. Peki bunlar saklandı ama ne olacak bunlara. Eğer bir kullanıcı sayfamı Ahmet QueryString ile çağırırsa o zaman ona A kopyası gösterilecek ve sayfam yeniden derlenmecektir. Eğer başkası ise "Mehmet" QueryString ile çağırırsa ona da B kopyası gönderilecektir ve bu sayede yine performans artışı sağlanacaktır. Nasıl ama? ? Peki ben eğer iki tane QueryString gönderirsem ama sayfamın sadece bir tane QueryStringim değiştiğinde cachleme yapmasını istiyorsam o zaman ne yaparım. Düşünün bir UrunlerID ve HizmetID diye iki tane QueryStringim var ve ben bunlardan sadece HizmetID değiştiğinde sayfamın serverda farklı bir cachlenmiş halinin saklanmasını istiyorum. O zaman yapmam gereken sadece şu : <%@ OutputCache Duration="10" VaryByParam="HizmetlerID" %> İşte bu kadar. Artık istediğim gibi oldu. Eğer ki ben birkaç tane QueryString e göre cachleme yapmak istiyorsam o zaman ise Noktalı Virgül kullanmam yeterli olacaktır. Örneğin VaryByParam="HizmetlerID;UrunlerID;SenID" vs gibi. Gayet kolay değil mi? Şimdi diğer özellikleri inceleyelim : VaryByCustom : Bu alt özellik ; kendi yazacağımız kodumuza göre Cahcleme yapabiliriz. Mesela Browser farklılıklarına göre bile Önbellekme yapabiliriz. Bir düşünün Nescape kullanan ve bir kullanıcı doğal olarak Nescape-Optimized sayfalara ulaşacaktır aynı şekilde IE kullanan ise Explorer-Optimized sayfalar kullanmak ister. İşte bu farklılık doğal olarak Cachlemeyede yansır. Aynı şekilde başta ta dediğimiz gibi kendinize Procuderler yazarak istediğiniz bir şeye göre cachleme yapabilirsiniz. Diğer makalemizde kodların nasıl yazılacağını göstermeye çalışacağız ki bu özelliğin kullanması ise özel bir kod yapısı kullanması gerekmektedir. DiskCacheable : Bu alt özellik ise diskinizin önbellenebilir veya olmadığını ayarlamanızı sağlar. Bool değer geriye dönderir. VaryByHeader : Bu alt özellik ise HTML başlığınızın değişimine göre Cachleme yapılmasını sağlar. Location : Bu ise Cachlemenmiş dosyaların nerede saklancağını göstermenizi sağlar. NoStore : Depolama yapılıp yapılmayacağını belirtmenizi sağlar. Mr.