Web ortamında sayfaların her post-back olmasında ilgili sayfanın yeni bir örneği oluşturulur. Peki yeni bir örneğinin oluşması ne demek?
- Sayfamızdaki bilgilerin
- Sayfadaki kontrollerin (TextBox, Grid, CheckBox, Button vb.)
tamamen keybolması demektir. Örneğin kullanıcı sayfamızdaki bir TextBox a veri girdiğinde, artık biliyoruz ki bu veri tamamen kaybolacaktır. Ancak bunu deneyip yaptığımızda gerçek ortamda TextBox taki verinin kaybolmadığını görüyoruz.
Peki bu nasıl oluyor?
Geleneksel Web Programlamanın bu sınırlılığının üstesinden gelmek için .NET platformu bize bazı sayfa-tabanlı ve uygulama-tabanlı seçenekleri sunmakta. Bunlar:
- View State
- Control State
- Hidden Fields
- Cookies
- Query Strings
- Application State
- Session State
Bu seçeneklerden (View State, Control State, Hidden Fields, Cookies ve Query Strings) sayfamızdaki bilgileri ve kontrol bilgileri bir takım yollarla kullanıcının kendi bilgisayarında (Client-Based State Manegement) saklarlar. Geri kalan seçenekler ise (Application State, Session State ve Profile Property) bu bilgileri uygulama tarafında yani sunucuda (Server-Based State Management) saklarlar.
.NET platformunun bizlere sunduğu bu seçenekleri incelersek:
View State
Post-Back sırasında default olarak sayfa ve kontrol bilgilerini tutan bu yapı, dictionary mantığıyla çalışır. Her bir kontrolün ve sayfa bilgisinin değerleri “Key”, “Value” şeklinde, hidden field lar olarak korunur. sayfa sunucuya gönderildiğinde,gelen isteğe göre işlem yapıldıkran sonra sunucu view-state değerine göre sayfayı tekrardan render eder ve client a tekrar gönderir. Böylece sayfamızdaki verilerimizi kaybetmemiş ve sunucuya gitmeden önceki halleriyle tekrar tarayıcımızda görürüz.
View state yapısında kendi verilerimizide saklayabiliriz. Dictionar mantığıyla çalıştığını daha önce belirtmiştik. Aşağıdaki gibi basit bir şekilde View State yapısını kullanabilirsiniz
View State e veri ekleme:
ViewState.Add(”[Key]“,”[Value]“);
Eklenen bir veriyi alma:
ViewState["[Key]“].ToString();
Bu yöntemi kullanmanın avantajları:
- Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
- Kolay uygulanabilirlik : Ekstra kodlama gerektirmez. Zaten default olarak kullanılan metoddur
- Güvenlik : View-State değerleri şifrelenmiş bir şekilde saklandıkları için Hidden field lara göre daha güvenlidirler
Dezavantajları:
- Performans düşüklüğü : View-State değerleri sayfamızla beraber sunucuya gittiği için view-state de büyük boyutta veri saklamak sunucuya gidiş-geliş süresini uzatacaktır. özellikle mobil uygulamalarda büyük veriler büyük performans kaybı demektir.
- Potansiyel Güvenlik Riski : Veriler şifrelenmiş bir şekilde saklansa bile sayfa kaynağını görüntülediğimizde bu verileri şifreli halde bile olsa görebiliriz. Bu durum güvenlik riski oluşturabilir.
Control State
.NET ControlState özelliği post-back ler arasında custom kontrol verilerini tutmamıza olanak sağlar. Örneğin sayfamızda farklı içerikler gösteren farklı tab yapılarımızın olduğunu düşünün. Hangi tabın seçili olduğunu post-back işleminden önce bilmek istiyorsak bu yapı uygun bir yapıdır. Bu senaryo ViewState ile de yapılabilir, ancak ViewState sayfa bazında kapatılabildiği için uygulamamızda aksaklıklara neden olabilir. ControlState ise ViewState gibi kapatılamaz.
peki nasıl kullanılır?
Veri ekleme:
PageStatePersister.ControlState = “[Data]“; //(veri object türünde eklenebilir)
Veri alma:
string value = PageStatePersister.ControlState.ToString();
Kullanım Avantajları:
- Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
- Güvenilirlik : ViewState gibi kapatılamadığından kullanımı daha kesin sonuçlar verir.
- Çok Yönlülük : Control state tekli verilerin nasıl ve nerede saklanması konusunda custom adaptörler yazılabilir
Dezavantajları:
- Programlama bilgisi gerektirir : ASP.NET kullanım için limitli imkan sağlasa da, tam kullanım için kodlama gerektirmektedir.
Hidden Fields
Hemen hemen hepimizin bildiği bir state yönetim aracıdır. Normal bir HTML kontrolü olarak sayfamıza ekleyenilirsiniz. Veri saklama ve veri alma, normal bir TextBox tan farksızdır.
Kullanım avantajları:
- Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
- Yaygın Destek : Hemen hemen tüm tarayıcılar hidden field desteği vermektedir.
- Kullanım kolaylığı : Standart HTML kontrolü olarak sayfanıza ekleyebilirsiniz.
Dezavantajları:
- Güvenlik Riski : Sayfa kaynağı direkt olarak görüntülenirse hidden field değerleri açıkça görülebilir. Değerler şifrelenebilir ancak şifrelenmesi ve şifrelerin tekrar çözülmesi işlemi ekstra kodlama demektir.
- Basit Depolama Mantığı : Hidden field larda rich değerler saklayamayız. Daha çok basit veriler saklanması için tasarlanmıştır.
- Performans Kaybı : Büyük veriler saklayamadığımız gibi, aşırı kullanımı durumunda sayfada HTML kontrolü olarak saklandığı için performans kayıplarına neden olacaktır
Cookies (Çerezler)
Uygulamamızda sıklıkla değişen verilerin Client taraflı saklanmasında en çok kullanılan state yönetim aracıdır. En çok karşımıza çıkan senaryosu ise bildiğimiz gibi Login işlemlerinde kullanıcıyı hatırlamaktır.
Kullanımı:
HttpCookie cookie = new HttpCookie(”myCookie”);
cookie.Values.Add(”UserName”, UserName);
cookie.Values.Add(”Password”, Password);
cookie.Expires = DateTime.Now.AddDays(30); //Cookie nin zaman aşımına uğrama süresi
Response.Cookies.Add(cookie);
Veri Okuma:
if (Request.Cookies["myCookie"] != null)
{
string UserName = Request.Cookies["myCookie"].Values["UserName"].ToString();
string Pwd = Request.Cookies["myCookie"].Values["Password"].ToString();
}
Kullanım Avantajları:
- Konfigüre Edilebilme : Cookie lerin ayarlanabilir birçok özelliği vardır. isim, değer, zaman aşımı süresi vb.
- Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
- Veri Devamlılığı : Client bilgisayarlarda veri bütünlülüğünü en yüksek oranda garanti edebilen yapılardır.
- Kullanım kolaylığı : text tabanlı key-value mantığıyla çalışırlar
Dezavantajları :
- Boyut limiti : Bir çok browser cookie boyutu olarak 4096 byte sınırını getirmektedir.
- Kullanıcı Kontrolü : Bazı kullanıcılar cookie alımını tarayıcılarından kapatabilirler, bu da cookie kullanımını olanaksız hale getirir
- Güvenlik Riski : Cookie kullanıcılar tarafından görülebilmektedir. Bu da güvenlik açıklarına neden olabilir. Cookie değerleri manuel olarak şifrelenebilir, ancak bu da ekstra kod demektir
Query Strings
Query String lerde yine en çok aşina olduğumuz state yönetim araçlarındandır. URL lerin ardına eklenen kullanıcılar için çok da bir anlam ifade etmeyen, yazılımcılar için anlamlı bilgilerdir.
Örneğin :xyz/index.php?option=com_comprofiler&task=userProfile&user=142 adresindeki “?” işaretinden sonra gelen
“option”, “task” ve “user” kelimeleri birer Query String anatarlarıdır. Bu anahtarlar kullanıcılar için fazla bir anlam ifade etmez ancak yazılımcılar için çok anlamlıdırlar.
Kullanımı :
xyzindex.php?option=com_comprofiler
Her iki kullanımda aynı işi görmektedir.
Veri Alma:
if (Request["[Key]“] != null)
{
string value = Request["[Key]“].ToString();
}
Kullanım Avantajları:
- Sunucu kaynaklarını yormaz : Client-Based olduğu için sunucumuza artı bir yük getirmez
- Yaygın Destek : Hemen hemen tüm tarayıcıların Query String iler veri taşıma desteği vardır.
Dezavantajları:
- Güvenlik Riski : Query String ile taşınan veriler clear text olarak tüm kullanacılar tarafından görülebilmektedir. Bu nedenle değerli veriler kesinlikle query string ile taşınmamalıdır. Bunun yerine Hidden field veya diğer yapılar kullanılabilir.
- Kapasite Limiti : Bazı tarayıcılar URL uzunluklarını en fazla 2083 karakter olarak sınırladıklarından istenilen uzunlukta veri taşınamıyor.
Böylece ASP.NET State (Durum) yönetiminin Client tarafındaki yapılarını incelemiş olduk. Umarım yardımcı olabilmişimdir. Diğer yazımda Server tarafındaki yapılara göz atıyor olacağız.