.NetGurus

Diğer Yazılar

Google a Ekle

Add to Google



Özel Sayfa Önbelleklemesi

Please Click Here to see the this article in English.  

Terimler

Bilişim terimlerinin Türkçelerini kullanmak gerçekten zor bir iş. Günlük hayatta pek olmasa da yazılarımda dikkat etmeye çalışıyorum. Ancak bu yazıda birbirine çok yakın terimler bulunduğu için terimlerin Türkçelerini yanlış kullanıp da konunun anlaşılmamasını engellemek için yazının başında bu makalede geçen bazı terimleri ve İngilizcelerini belirtmekte fayda görüyorum.
- Önbellekleme, Önbelleğe Alma : Caching
- Sayfa Önbelleklemesi : Output Caching
- Kısmi Sayfa Önbelleklemesi : Partial output caching
- Özel Sayfa Önbelleklemesi: Custom Output Caching
- İstek : Request


Giriş

Sayfa önbelleklemesi ya da Kısmi Sayfa Önbelleklemesi bir web sayfasının tamamının ya da bir kısmının kaynağının(html); sunucu, istemci ya da başka bir yerde hazırda tutularak her istekte sayfanın tekrar işlenip hazırlanmasını engellemek amacı ile yani sunucunun yükünü ve tepki süresini azaltmak amacı ile kullanılmaktadır.
İçeriğin güncelleğine göre sayfanın tamamı ya da sadece belirli bir kısmı önbelleklenebilir.

Bu makalemde nasip olursa Özel Sayfa Önbelleklemesi(Custom Output Caching) konusuna değinmeye çalışacağım. Ancak bu konuya başlamadan önce Sayfa Önbelleklemesini kısaca bir iki örnek ile tekrarlayalım.

Sayfa Önbelleklemesi – Kısmi Sayfa Önbelleklemesi

Asp.Net’ te web sayfalarımızın önbellekleğe alınmasını OutputCache direktifi ile sağlarız. Bu direktifi sayfanın başında kullanarak sayfanın tamamının önbelleğe alınmasını sağlayabiliriz. Ya da sayfanın önbelleğe alınmasını istediğimiz belirli bir kısmını ayrı bir kullanıcı kontrolü(usercontrol) olarak hazırlayıp OutputCache direktifini bu kontrolün ascx dosyasının başında kullanarak önbelleğe alma işlemini gerçekleştirebiliriz.
Bu direktifin detaylarına burada değinmeyeceğim. Sayfanın belirli bir kısmının önbelleğe alınmanısı kısa bir örnekle inceleyelim.


Örnek 1
Bu örneğimizde, önbelleğe alınmanın gözle görülebilmesini sağlamak amacı ile standart haline gelmiş olan web sayfamızda zaman(saat) göstermeye çalışalım.
Html-ascx :

 

 

Codebehind :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load        
      spnTime.InnerText = Now.ToLongTimeString
End Sub 

Bu örnekte bir kullanıcı kontrolü oluşturduk. Bu kontrolü web sayfamıza ekleyerek sayfamızda sunucu saatini gösteriyoruz. Ancak kontrolümüzü 3 saniyeliğine önbelleğe aldığımız için gösterdiğimiz zaman sayfa her yüklendiğinde değil de sadece 3 saniyede bir değişecek.

Not: Bu arada hemen hatırlatayım ki Output direktifinin işlevi sayfanın kod(codebehind) tarafından PartialCaching niteliği(attribute)’ü kullanılarak da gerçekleştirilebilir. Örnek 2’ de bunu görebiliriz.

Örnek 2
Html-ascx :

 

Codebehind :

 _
Partial Public Class ClockForMethod2    
            Inherits System.Web.UI.UserControl     
	Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load        
	spnTime.InnerText = Now.ToLongTimeString    
	End Sub 
End Class 


Özel Sayfa Önbelleklemesi (Custom Output Caching)

Her ne kadar Özel Sayfa Önbelleklemesi desem de anlatacağım şey tam olarak sayfa önbelleklemesi de değil. Çünkü önbelleklenmiş bir sayfa ya da kontrol, sayfa tekrar çalıştırıldığında yeniden çalışmaz-oluşmaz. Html, önbellekleme politikasına vb ayarlara göre istemcinin geçici internet dosyaları ya da IIS’ ten veya benzeri yerlerden otomatik olarak gelir. Biraz sonra göreceğimiz örnekte ise kontrolümüz(usercontrol) önbellekleme yokmuşçasına normal bir şekilde hayat döngüsüne girecek ancak biz müdahale ederek özel bir önbellekleme yapacağız.

Şimdi konumuza odaklanalım. Önbellekleme; sayfanın uzun ya da kısa bir takım işlemlerden geçip html’ ye dönüştürülmesinden sonra belirli süre bazı değişkenlere göre bir daha işlenmeden hazırdaki html nin kullanılması olduğuna göre örnek 1,2 vb diğer yolları kullanmadan aynı işlevi sağlayabiliriz. Bunu yapabilmek için kontrolümüzün Render metodunu kullancağız. Bildiğiniz gibi Render aşamasının sonunda kontrol html’ ye dönüştürülmüş oluyor. İşte biz de Render aşamasında oluşan html’ yi bir yerde saklayacağız ve sayfanın sonraki çalışmalarında kontrolün tekrar işlenmesine izin vermeden bu html’ i kullanacağız. Html’ mizi konu ve amacımıza göre sessionstate, applicationstate, viewstate ya da cache(önbellek)’ te saklayabiliriz.
Şimdi isterseniz Örnek 1’ deki zaman gösterme işini bu yolla gerçekleştirelim.

Örnek 3

Html-ascx:

 

Codebehind :

Partial Public Class ClockForMethod3    
	Inherits System.Web.UI.UserControl     
	Public ReadOnly Property isCached() As Boolean        
		Get            
			Return (HttpContext.Current.Cache.Get(Me.ClientID) Is Nothing = False AndAlso String.IsNullOrEmpty(HttpContext.Current.Cache.Get(Me.ClientID).ToString) = False)        
		End Get
	End Property    
	Public Property myCacheDuration() As TimeSpan        
		Get            
			Dim dur As TimeSpan = Me.ViewState("myCacheDuration")            
			If dur = Nothing Then                
				Return New TimeSpan(0, 0, 13)            
			Else                
				Return dur            
			End If        
		End Get        
		Set(ByVal value As TimeSpan)            
			Me.ViewState("myCacheDuration") = value        
		End Set    
	End Property     
	Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load        
		If isCached = False Then            
			spnTime.InnerText = Now.ToLongTimeString        
		End If     
	End Sub     
	Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
		Dim myCachedHtml As String = String.Empty         
		If HttpContext.Current.Cache.Get(Me.ClientID) Is Nothing = False Then            
			myCachedHtml = HttpContext.Current.Cache.Get(Me.ClientID).ToString        
		End If         
		If String.IsNullOrEmpty(myCachedHtml) = False Then            
			writer.Write(myCachedHtml)
		Else
			Dim sb As New Text.StringBuilder
			Dim tw As New IO.StringWriter(sb)
			Dim hw As New HtmlTextWriter(tw)
			MyBase.Render(hw)
			HttpContext.Current.Cache.Insert(Me.ClientID, sb.ToString(), Nothing, Now.Add(myCacheDuration), Web.Caching.Cache.NoSlidingExpiration, Caching.CacheItemPriority.Normal, Nothing)
			writer.Write(sb.ToString())
		End If    
	End Sub
End Class 


Sonuç

Şimdi gelelim bu Özel Sayfa Önbelleklemesinin bize nasıl faydasının dokunabileceğine.
Açıkçası bu yazıda anlatmaya çalıştığım “özel önbellekleme”, performans, esneklik, kullanım kolaylığı vs vs açısından “(kısmi) sayfa önbelleklemesi” yolunun eline su dökemez. Ancak hazır önbellekleme çözümleri çok özel ihtiyaçlara cevap veremeyebilir. Önbellekleme aşamasında kendi ihtiyacınıza göre değişik şeyler yapmak istiyorsanız bu yol işinize yarayabilir.

Ekteki projede bu makalede bahsedilen örnekleri görebilirsiniz.

PartialCachingSite.zip (46,58 kb)


Posted by yavuz on 01 Haziran 2008 Pazar 03:17
Permalink | Yorumlar (1) | Post RSSRSS comment feed

Yorumlar

dotnetgurus.net

03 Haziran 2008 Salı 23:08

pingback

Pingback from dotnetgurus.net

Custom Output Caching

Yorum ekle


(Gravatar simgesini gösterecek)

  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading