|
Bilişim ve yazılım dünyasına öncü kaynaklardan biri haline getirmek istediğimiz sitemizde ilk makalemize asp.net bölümünde state management serisiyle başlıyoruz.
State management konusuna girmeden önce bir şeyi belirtmek sanırım yararlı olacaktır.Kullanıcı ile etkileşim halindeki bir web sitesi hazırlamanın temel şartlarından biri kullanıcının anlık bilgilerini (hangi sayfadan geldiği,kaçıncı kez geldiği,yönlendirilmiş olup olmadığı vs…) request hızını da göz önüne alarak saklayabilmektir.Bu işlem klasik bir windows uygulamasında hafıza da yeterli olduğundan otomatik olarak yapılır.Sürekli çalışan bir masaüstü uygulamasında hafızadan özel bir bölge programın kullanması için ayrılmıştır.Profesyonal bir Asp.net web uygulaması da bu şekilde görülse de aslında olay biraz farklı işler.Web sayfanızı, servera bağlanarak istersiniz ve o size post edilir bu adımdan sonra sayfanın çalışması durmuştur eğer bundan sonra kullanıcı bilgilerini saklamak ve kullanmak istiyorsanız kullanabileceğiniz bazı yöntemler mevcuttur:
|
|

|
View State |
|
|
Session State |
|
|
Application State |
|
| View State : |
|
View State kontrolü kendisine verilen bilgiyi gizli bir alanda tutar.Bu bilgi hafızaya Base64 formatında bir karakter dizisi olarak yazılır ve her geri postalamada(postback) sunucuya getirilir ancak viewstate özelliği sunucu kontrolleriyle sınırlıdır.Yüklenen bilgi ya sizin tarafınızdan oluşturlan bir custom object veya basit bir bilgi türü olmak zorundadır.
Sayfadaki viewstate özelliği view state koleksiyonuyla işlem yapılmasını sağlar.Bu özellik SatteBag classının bir instancedır.Bu classa herhangi bir şey eklemek veya çıkarmak istediğinizde belli bir syntax kullanmanız gerekmektedir.
|
| |
|
//this anahtar sözcüğü görüntülenen sayfanın nesnesine başvurur.
this.viewstate[“sayac”]=1;
int Sayac;
Sayac=this.ViewState["sayac"];
LblGoster.Text=Sayac.ToString(); //Sonuç 1 olarak görünecektir
|
|
| |
|
yukarıdaki kodu yazdığımızda belirlenmiş olan sayactır.Eğer daha önce sayac isminde bir öğe yoksa bu kaydedilir varsa da yenisi üstüne yazılır.Alınan değeri bir yerde kullanmanız gerekiyorsa değerin türünü belirtmeniz gerekmektedir.Çünkü view state collection alınan değeri generic(markasız,türsüz) tutar.
|
| |
|
int Sayac;//int türünde değişken yaratılır
Sayac=(int)this.ViewState[“sayac”];// int türündeki değer atanır
|
|
| |
|
Yukarıda da belirtildiği gibi viewstate özelleğinin tuttuğu değer alenen görülebilecek şekilde dizayn edilmiştir.Hiçbir şekilde şifreleme veya daha başka bir işlem uygulan-
mamıştır.Sisteminize sızmak istiyen art niyetli kişilerin eriişmine açıktır.Bunu önlemek
sistem güvenliği açısından bir mecburiyet olduğuna göre önlem 2 şekilde alınabilir
1-)Viewstate değerinin hash code olmasını sağlayarak yapılması;
Asp.net viewstate değerini alarak daha önceden belirlenmiş gizli bir key value sayesinde karıştırma algoritmasına tabii tutar.Algoritma kısa bir bilgi katarı oluşturur ve bu bölüm değerin sonuna eklenir ve sayfa ne zaman geri postalanırsa Asp.net bu bilgiyi alır ve yeniden hesaplayarak viewstate de saklanan değerle aynı olup olmadığına bakar değer aynı değilse işlem sona erer.Asp.net bilginin tamamını istemciye yollamayı reddeder.Bu bilgiyi hash etme aslında Asp.netin default olarak gerçekleştirdiği bir işlemdir .Programcı tarafından gerekli görülmezse atlanabilir.(Yeni Serverlarda çıkan problemlerden kaçınmak için)
İptal işlemi web.config dosyasındaki enableViewStateMac=”False” denilerek yapılabilir.
2-)Sorun birden çok serverda da aynı gizli key value değeri kullanılarak aşılabilir (Bu konu detaylı şekilde işlenmesi gerekliliğinden dolayı başka bir makale konusu olarak görülmüştür.)
Aşağıdaki örnekle konuyu bitiriyoruz.
|
| |
|

|
| |
|
public partial class _Default : System.Web.UI.Page
{
private string icerik;
protected void Page_Load(object sender, EventArgs e)
{
if (this.IsPostBack)//Sayfanın geri yüklenen olup olmadığını kontrol eder
{
icerik = (string)ViewState["icerik"];
}
}
protected void Page_PreRender(object sender, EventArgs e)
{
ViewState["icerik"] = icerik;
}
protected void CmdKaydet_Click(object sender, EventArgs e)
{
//TextBoxa yazılan değeri üye değişkene atayalım
icerik = TxtGoster.Text;
//İçeriğin saklandığının anlaşılması için TextBox içeriğini temizleyelim
TxtGoster.Text = "";
}
protected void CmdBaglan_Click(object sender, EventArgs e)
{
TxtGoster.Text = icerik;
}
}
|
|
| |
|
Bir bilgiyi web sitesinde saklarken masaüstü uygulamalardaki kadar belleğe sahip olmadığımızdan dolayı gerekli olmayan hiçbir şeyi tutmamaya gayret göstermek gereklidir.Çok büyük bilgilerin saklanması gönderilen son sayfanın gereksiz bilgilerle şişmesine ve performans azalmasına neden olacaktır .Bir dahaki makalede session state konusunda görüşmek üzere………
|
| |
| |
| |