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)