Ajax ile sunucu tarafında birden fazla XMLHttpRequest işlemi yapıldığında, tarayıcımız bazı işlemlerin sürekli aynı adreste yapılmasından ötürü önbellekleme yapabilir. Böyle bir durumda örneğin bir haber sitesini düşünelim. Her gün hatta her saat güncellenen bir sitedir neticede haber siteleri. Ancak önbellekleme sorununu yaşıyorsak biz bu güncellemelerden haberdar olamayız. Haber sitesinin ilgili sayfasını her açtığımızda aynı haberlerle karşılaşırız.

Bu ve buna benzer önbellekleme sorunlarını çözmek için çeşitli yollar var. Bunlardan birincisi, veri isteğinde bulunduğumuz web adresinin sonuna sürekli değişen bir parametre atmak. Böylece adres her seferinde farklı gözükecektir ve kullanıcı tarafındaki (web browser) önbellekleme bizleri etkilemeyecektir.
Aşağıdaki kodları ajaxbellek.htm şeklinde kaydedip inceleyebilirsiniz. Bu scripti kullanarak web adresinin sonuna parametre ekleyebilir ve önbellekleme sorununu aşabilirsiniz.
// xmlhttp adında bir değişken tanımlıyoruz. Daha sonra;
//bu değişkeni msxml2.xmlhttp active x objesi olarak tanımlamaya çalışıyoruz
//eğer başarılı değilse hatayı try catch metoduyla yakalıyoruz
//başarılı değilse Microsoft.xmlhttp active x objesini belirtip değerini alıyoruz
<script type="text/javascript" language="javascript">
function XMLHTTPObjesi()
{
var XMLHTTP = new ActiveXObject("Msxm12.XMLHTTP");
}
catch (hata)
{
try
{
XMLHTTP = new ActievXObject("Microsoft.XMLHTTP");
}
catch (hata)
{
if (typeof XMLHttpRequest != "undefined")
{
XMLHTTP = new XMLHttpRequest();
}
}
}
return XMLHTTP;
}
//bu fonksiyon xmlhttp objesinin talebinin onaylanıp onaylanmadığını
//kontrol ediyor. Onaylanırsa adrese rastgele atamasını yapıyor
function Dinle()
{
if (Objem.readyState == 4 &&
Objem.status == 200)
{
alert(Objem.responseText);
}
}
var Objem = XMLHTTPObjesi()
Objem.open("GET", "metin.aspx?id=4&rastgele=" + Math.random());
Objem.onreadystatechange = Dinle;
Objem.send(null);
</script>
Diğer çözüme geçeyim. Bu çözüm tekniğinde karşı taraftan gelen veriyi çekerken, ne zaman önbellekten silinmesi gerektiğini belirterek yine önbellekleme sorunundan kurtulabiliriz. Geçmişteki bir zamanı, gelen veriye Header olarak atarsak, veri alındıktan sonra önbellek geçerlilik süresi geçeceği için, web browser tarafından önbelleklenmeyecektir.
Aşağıdaki kodları ajaxbellek2.htm olarak kaydederek inceleyelim:
// daha önce yaptığımzı gibi xmlhttp adında bir değişken tanımlıyoruz.
// Daha sonra;
// bu değişkeni msxml2.xmlhttp active x objesi olarak tanımlamaya çalışıyoruz
// eğer başarılı değilse hatayı try catch metoduyla yakalıyoruz
// başarılı değilse Microsoft.xmlhttp active x objesini belirtip değerini alıyoruz
<script type="text/javascript" language="javascript">
function XMLHTTPObjesi()
{
var XMLHTTP = null;
try
{
XMLHTTP = new ActiveXobject("Msxm12.XMLHTTP");
}
catch (hata)
{
try
{
XMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (hata)
{
if (typeof XMLHttpRequest != "undefined")
{
XMLHTTP = new XMLHttpRequest();
}
}
}
return XMLHTTP;
// bu fonksiyonun diğer fonksiyondan farkları var
// readystate?in 4 yani talep onaylanması işleminden sonra
// objenin önbellekten silinmesi gereken tarihi belirtmemiz gerekiyor
function Dinle()
{
İf (Objem.readyState == 4 &&
Objem.status == 200)
{
alert(Objem.responseText);
}
}
var Objem = XMLHTTPObjesi()
Objem.open("GET", "metin.txt");
Objem.setrequestHeader("If-Modified-Since", "Sat, 3 Nov 1992 13:13:13 GMT");
Objem.onreadystatechange = Dinle;
Objem.send(null);
</script>
Yukarıdaki scriptleri projelerinize rahatlıkla entegre edebilirsiniz. Umarım önbellekleme sorununu bu şekilde giderebilirsiniz.
Farklı makalelerde tekrar görüşmek üzere.
Yağız GÖNÜLER
yagizgonuler@gmail.com
Kaynaklar:
# ASP.net AJAX ? Daron Yöndem
# Ajax.Asp.Net
Ayrıca Bkz:
# XmlHttpRequest (XHR) Nedir? ? Yağız Gönüler