Asp.net uygulamalarında projelerimizi hızlandırmak için birçoğumuz caching yapısını kullanmışızdır. Ancak sayfaya belli bir süre için caching uyguladığımızda sayfanın tamamı cache bellekte saklanarak belirtilen zaman geçmediği müddetçe yenilenen verileri görmemiz mümkün olmuyordu. Bu sorunu önbelleğe alınan sayfanın dinamik noktalarını caching yapısından ayrı tutmamızı sağlayan substitution kontrolü kendisine gönderdiğimiz html çıktıları ile caching alanından bağımsız olarak dinamik yapısını kullanabilmektedir.
Konuyu bir örnek üzerinde açıklayacak olursak;
substitution.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="substitution.aspx.cs" Inherits="substitution" %>
<%@ OutputCache Duration="15" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label" ></asp:Label>
<br />
<asp:Substitution ID="Substitution1" runat="server" MethodName="SubFonk" />
</div>
</form>
</body>
</html>
sayfamızda 15sn boyunca caching uygulaması yapacağımızı belirterek. 15sn boyunca sayfanın içeriğinin güncellenmemesini sağlayabiliriz. Ancak burda Substitution kontrolünün methodname propertysinden faydalanarak sayfa üzerinde dinamik bir alan tanımlayıp bu alanı güncelleyecek bir fonksiyon tanımlayabiliyoruz.
substitution.aspx.cs
public partial class substitution : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToString();
}
public static string SubFonk(HttpContext icerik)
{
return "Anlık Zaman: " + DateTime.Now.ToString();
}
}
Burada Page_Load eventine yerleştirdiğimiz kod ile sayfaya zamanı yazdırıyoruz. Ancak bu zaman ne kadar postback yaparsak yapalım cache duration süresi boyunca güncellenmeyecektir. Bu nedenle sayfa üzerinde 15sn geçmesini beklemeden güncellenecek bir alana ihtiyacımız olabilir. Bu durumda sayfa üzerine eklediğimiz ve SubFonk fonksiyonundan etkilenmesini istediğimiz Substitution1 kontrolümüz ile yine zamanı string formatında return ediyoruz. Böylelikle sayfanın 15sn lik zaman dilimindeki postbacklerinde Label1 in text propertysinin etkilenmeyeceğini ancak Substitution1 kontrolünün içeriğine string formatında gönderdiğimiz html içeriğinin güncellendiğini gözlemleyebiliriz.
Burada dikkat etmemiz gereken 2 husus vardır. 1. si Substitution kontrolü html çıktısını alacağından bu kontrolün methodname propertysine atadığımız fonksiyonun geriye string türünde veri göndermesi gerekmektedir. Bununla beraber 2. hususta yine bu fonksiyonun static olarak tanımlanması gerektiğidir. Bunun nedeni sayfa her postback olduğunda sunucu tarafında yeniden üretilmesidir. Static tanımlı methodlar bellekte static bölgesinde tutulduğundan yeniden üretilmeden çalışacaktır. Böylelikle caching mekanizmasına aykırı davranmamış olacaktır.