ASP.NET DURUM YÖNETİMİ (State Management)
Web sayfalarında sayfa ile server arasındaki iletişim , HTTP protokolü ile gerçekleştirilir. Bu protokolde sunucuya gönderdiğimiz bilgiler, kendi bilgisayarımızda kalıcı değildir. Biz bir istek gönderdiğimizde sunucuda sayfamızın bir örneği oluşturulur. Gönderdiğimiz bilgiler sunucuya gider ve orada işlenir. İşlendikten sonra sayfanın örneği, sunucudan silinir. Bu gönderdiğimiz verilere tekrar erişebilmek ve bunları taşıyabilmek için durum yönetimi kontrollerini kullanmaktayız.
Bilgiler istemci ve sunucu tarafında saklanabilir Bilgiler istemci ve sunucu tarafında saklanabilir.Eğer istemci tabanlı durum yönetimlerini kullanırsak her istemci için sunucuda bir yer ayrılır.Bu sayfanın kullanıcısı çok olursa, bu bilgilerin server tarafında tutulması zorlaşacak ve belki de sunucu isteklere yanıt veremeyecektir.Ayrıca istemci taraflı kontrolleri kullanırsak güvenlik açısından sıkıntı oluşturur.Eğer Sunucu taraflı kontrolleri kullanırsak bu güvenlik sorunu en aza iner.
Bir web sayfasi sinifi her çagirildigi zaman yeniden olusturulur Bir web sayfasi sinifi her çagirildigi zaman yeniden olusturulur. Sayfa üzerinde istemci bilgilerini tutmaz. Örnegin bir textbox içine metin yazip gönder butonuna basarsaniz bu metin postback olayindan sonra görünmez çünkü sayfa her postbackte yeninde olusturulur.
Yukarda görüldügü gibi sayfa istemciye gönderilmeden önce tekrar olusturulur. Bu islem her istek için gerçeklesir. ASP.NET bu problemi çözmek için View State, Cookie, Session, Application Object gibi özellikler sunar.
State Management Türleri 1. Istemci Taraflı State Management · View State · Hidden Field · Cookies (Çerezler) · Control State 2. Sunucu Taraflı State Management · Session · Application Object · Caching · Database
Bu çözümlerden hangisini kullanacagimiza karar vermek için bazi kriterler kullaniriz. Ne kadar bilgi saklamak istiyorsunuz? Bilgileri istemcide mi yoksa sunucuda mı saklamak istiyorsunuz? Bilgileriniz önemlimi? Uygulamaniz için bant genisligi ve performans kriterleriniz nedir? Bilgileri kullanici bazlımı kaydetmek istiyorsunuz? Bilgileri ne kadar süreyle saklamak istiyorsunuz? Uygulamaniz bir Web Farm (birden fazla sunucu) , Web Garden (Çok islemcili sunucu) yoksa tek islemcili bir sunucuda mi çalisiyor.
İstemci taraflı olanlar herhangi bir sunucu kaynagini kullanmazlar İstemci taraflı olanlar herhangi bir sunucu kaynagini kullanmazlar. Bilgileri istemci tarafında tutarlar. Sunucu taraflı olanlar ise bilgileri sucunu kaynaklarında tutarlar. Istemci taraflı mı yoksa sunucu taraflı mı state management kullanacaginizi seçmek ihtiyaçlarınıza ve yukarda verilen kriterlere bağlıdır.
VİEWSTATE ViewState nesnesi ASP.NET’te form düzeyinde verileri saklamak için kullanılır. Yani Sayfa geçişleri arasında verileri saklamak için kullanılır. Asp dilinde kod yazarken postback işlemi sonrasında veriler kayboluyordu. Bunun önüne geçmek için viewstate nesnesi kullanılmaya başlandı.Bu sayede sayfa postback olduğunda verilerin, form üzerinde saklanması sağlandı.Kısaca açıklayacak olursak tarayıcı ve sunucu arasında bilgi alışverişi yapar. Sunucuya gönderilen değerler viewstate içinde saklanır ve tarayıcıya dönen değerler, viewstate içerisine depo edilerek gönderilir.
Örnegin bir degiskeni view state içine atmak isterseniz: string KullaniciAdi =" Akhisar Myo "; ViewState["Kullanici"] = KullaniciAdi; View State içindeki bir veriyi geri almak için ise: string KullaniciAdi = ViewState["Kullanici"].ToString(); View state içinde bilgileri object türünde saklandigi için sakladiginiz veriyi yeniden yüklerken tip dönüşümlerine dikkat etmeniz gerekir.
Viewstate sayfa bazlı tutulan bir değerdir sayfalar arası veritransferi için kullanılamaz yani ViewState["Key"] viewstate'nin değeri'ne A sayfasında bir değer atayıp B sayfasında bu değeri almaya çalışırsanız, alacağız değer NULL olacaktır.Kullanımsal olarak Session'la ayrıldıkları temel noktalardan biride budur.
View State in avantajlari Kullanimi kolaydir. Sunucu kaynaklarina ihtiyaç duymaz. Sakladigi verileri kodlama yaparak daha güvenli hale getirir. View State in dezavantajlari Asiri büyüklükteki veriler için kullanildiginda performans kaybina sebep olur. Bilgileri kodlayarak gizli alanlarda tutar. Kodlamasini çözerek bilgilere ulasmak kolaydir.
Ne zaman View State kullanmaliyiz Veriler küçük boyutlu olduklari zaman çünkü gönderilen veriler sayfa içerisinde gönderilirler buda büyük boyutlu verilerde performans kaybina sebep olur. Güvenligin önemli oldugu datalari View State içine koymayin. Ne Zaman View State Kullanmamaliyiz Kullandiginiz kontrol içerigi asla degismiyorsa Kullanilan kontrol her postbackde yeniden dolduruluyorsa
Çerez (Cookie) Çerez istemci bilgisayarında veya istemci browserının hafızasında oluşturulan küçük dosyacıklardır. Bu yolla istemcinin sisteminde daha sonra kullanmak üzere küçük bilgileri saklanır. Çerezler bilgileri düz metin şeklinde saklarlar. Genel olarak çerezler kullanıcı bilgilerini tutmak için kullanılırlar.
Çerezler Nasıl Çalışır? İstemci sunucudan istekte bulunduğunda sunucu istemciye çerezleri gönderir. Gönderilen ayni çerez alt istekler içinde kullanılabilir. Birbirinden farklı siteler ve browserlar çerezleri farklı şekillerde depolarlar. Bir sayfa çerezlerdeki bir bilgiye ihtiyaç duyduğunda ilk olarak lokal sistemde arama yapar ve bulduğu çerezi sunucuya gönderir.
Avantajları · Kullanımı çok kolaydır. · Verilerin gönderimi browser tarafından yapılır. Dezavantajları · Veriler düz metin dosyalarında saklandığı için güvenli değillerdir. · Çerezlerde saklayabileceğimiz veriler için boyut sınırlaması vardır. Bu sinir 4096 byte (4KB dır). · Kullanılabilecek çerez sayısı sinirlidir. Çoğu browser çerez sayısını 20 ile sınırlandırır, bazılarında ise bu rakam 300 ‘ çıkar. · Yüksek güvenlik seviyesinde çalışmazlar.
Persistent ve Non Persistent Çerezler Çerezleri iki kategoriye ayırabiliriz. · Persistent Çerezler ( Saklanan) · Non Persistent Çerezler (Saklanmayan, Geçici)
Non Persistent Çerez Tanimlama HttpCookie cerez = new HttpCookie("KullaniciBilgileri"); cerez["KullaniciAdi"] = ’’ irfan.sarica’’; cerez["Sifre"] = "123456"; Response.Cookies.Add(cerez); Yukarıda oluşturduğumuz çerez browser kapatılana kadar istemci bilgisayarında saklanır. Bu tür çerezlere Non Persistent Çerez(Geçici çerez) denir.
Çerezlerden Bilgi Okuma HttpCookie cerez = Request.Cookies["KullaniciBilgileri"]; string kullaniciAdi,sifre; if (cerez != null) { kullaniciAdi = cerez["KullaniciAdi"]; sifre = cerez["Sifre"]; } Dikkat:Daha önce sisteme kaydettiğimiz çerezleri okurken çerezin sistemde olup olmadığını kontrol edin yoksa sisteminiz hata verir.
Persistent Çerezler Bu tür çerezler istemcinin hard diskinde son geçerlilik tarihine kadar saklanırlar. Bu tür çerezlerde bir geçerlilik tarihi olmalıdır. Bazen kullanıcı silene kadar istemcide saklanırlar. Non Persistent Çerezler Bu tür çerezlere geçici çerezlerde denir. Eğer çerez tanımlamasında bir geçerlilik süresi yoksa bu çerezler istemci browserının hafızasında saklanırlar. Yukarıda vermiş olduğumuz örnek geçici bir çerez örneğiydi. İki tür çerezi oluşturma ve kullanma aşamalarında herhangi bir farklılık yoktur. Aralarındaki tek fark persistent türü çerezlerde geçerlilik süresinin verilmiş olmasıdır.
Persistent Çerez Tanimlama HttpCookie cerez = new HttpCookie("KullaniciBilgileri"); cerez["KullaniciAdi"] = ’’ irfan.sarica’’; cerez["Sifre"] = "123456"; cerez["Gecerlilik"] = "5 Gün"; cerez.Expires = DateTime.Now.AddDays(5); Response.Cookies.Add(cerez);
QUERYSTRİNG QueryString ile taşınacak olan veri, URL aracılığı ile diğer sayfalara taşınabilir. Taşınacak veriler, sayfanın adı yazıldıktan sonra ’? ’işareti ile başlayan kısımda anahtar-değer şeklinde taşınmaktadır. Bu yöntem kullanım kolaylığı ve sunucuya getirdiği yükün az olması nedeni ile pek çok yazılımcının tercihi olmaktadır ve hemen hemen her site bu yöntemi kullanmaktadır.
protected void Button1_Click(object sender, EventArgs e) { Response protected void Button1_Click(object sender, EventArgs e) { Response.Redirect("Sayfa2.aspx?veri1=irfan&veri2=Sarica"); } protected void Page_Load(object sender, EventArgs e) string metin= Request.QueryString["veri1"]; string metin2 = Request.QueryString["veri2"]; Response.Write(metin + " " + metin2); Burada butona tıklandığında Response.Redirect içerisinde bulunan veri1 ve veri2 değişkenlerindeki bilgileri sayfa2 ye yollar. Sayfa2.nin load olayında ise bu bilgiler alınarak değişkenlere atılır ve ekrana yazılır.Sayfa1 de gönderilecek 2 parametre birbirinden & simgesi ile ayrılır. Sayfa2 de veriler, Request.QueryString ile alınır
Avantajları · Kullanımı çok kolaydır. · Verilerin gönderimi isi browser tarafından yapılır. · Sunucuya getirdiği yük çok azdır. Dezavantajları · QueryString ile taşınan veriler kullanıcılar tarafından görüntülenebilmektedir ve dolayısıyla bir güvenlik açığı oluşturmaktadır
SESSION (OTURUM) Sunucudan bir sayfa talep edildiğinde, web sunucusu her kullanıcı için bir oturum başlatır. Session nesneleri ile kullanıcı bilgilerini oturum boyunca sayfalar arasında taşıyabiliriz. Örneğin alışveriş sitelerinde sepete eklenenleri session ile sayfalar arasında taşıyabiliriz. Session da taşınan veriler tüm sayfalardan erişilebilir.
Session; oturum zaman aşımına uğradığında, kullanıcı pencereyi kapattığında, kullanıcı oturumu kapattığında sonlanır. Session içerisinde çok kritik veriler saklanabilmektedir ve bu sebeple işleminiz bittikten sonra Session mutlaka sonlandırılmalıdır. Kod içerisinde Session.Abandon(); kodu ile Session sonlandırabiliriz.
Session’da veri aktarma yöntemi, viewstate ile benzerlik gösterir Session’da veri aktarma yöntemi, viewstate ile benzerlik gösterir. Session[“keyAdi”]=deger veya Session.Add(“keyAdi”,deger) ile session nesnesine değerler atanır. Veri okurken de Session[“keyAdi”] ile okuma yapılır.
Örnek Uygulama Sayfamız ilk yüklendiğinde eğer oturum açmış bir kullanıcı yoksa sadece hoş geldin yazsın. Eğer oturum açan biri ise hoş geldin ” kullanıcının ad ı” yazsın. Bunun için Default.aspx sayfamıza 1 label 1 textbox ve 1 buton ekliyoruz. Eğer oturumu açık olan biri giriş yaptıysa Label üzerinde hoş geldin “kullanıcı adı” yazacak. Eğer yok ise Textbox’a kullanıcı adı girilecek ve oturum aç butonuna basılınca Profil.aspx sayfasına gidilecek. O sayfada ise Hoş geldin Mehmet tarzında bir mesaj verilecek ve oturum kapatılacak yani session nesnesinin içerisi temizlenecek.
Dafault.aspx
Default.aspx sayfamızdaki Oturum aç butonunun Click olayına aşağıdaki kodu yazın
Profil.aspx
APPLICATION OBJECT Sitenin genelini ilgilendiren bilgilerin tutulabildiği nesne Application nesnesidir. Application nesnesi global bir değişken gibi düşünülebilir. Siteye erişen her kullanıcı aynı bilgileri görüp değiştirebilmektedir. Application nesnesinde de veri saklanırken, tıpkı Session ve ViewState nesnelerinde olduğu gibi anahtar-değer çiftleri kullanılır. Session ve ViewState nesnelerinde her anahtarda tutulan değer kullanıcıya özgü bir değerken, Application nesnesinde tutulan değer tüm kullanıcılar için ortak olmaktadır.
Application nesnesine veri eklerken Application Application nesnesine veri eklerken Application.Add(“key”, “deger”) ya da Application[“key”] = “deger” sözdizimi kullanılırken, Application nesnesinden veri okumak için Application[“key”] sözdizimi kullanılmaktadır.
Global. asax dosyasında 5 adet olay yakalayıcı metod bulunur Global.asax dosyasında 5 adet olay yakalayıcı metod bulunur . Bu metodlar , yanındaki olaylar olduğunda tetiklenir Application_Start =>Uygulama ilk defa çalıştırılırken tetiklenir Application_End =>Uygulama bilinçli bir şekilde kapatılırken tetiklenir Application_Error =>Uygulamada bir hata oluştuğunda tetiklenir Session_Start =>Web sitesinde yeni bir oturum açıldığında tetiklenir Session_End =>Web sitesinde bir oturum sonlandığında tetiklenir
Kaynakça http://www.mehmetkirazli.com/asp-net-durum-yonetimi/ http://www.yazilimmutfagi.com/10103/web/asp-net/cerezler-cookie-hakkinda-bilgi-ve-asp-net-de-cerez-cookie-kullanimi.aspx