|
Asp.Net' te Durum Yönetimi - 2 |
|
Gönderiliyor lütfen bekleyin... |
|
|
Uzun bir aradan sonra ASP.NETte Durum Yönetimi 1 in devamı olan makaleyi yazmaya karar verdim. Böylece konu bütünlüğü de bozulmamış oldu. ASP.NET te Durum Yönetimi 1 makalesine bu linkten ulaşabilirsiniz.
Önceki makalede durum yönetimine neden ihtiyaç olduğunu ve istemci tarafında durum yönetiminin nasıl gerçekleştirildiğini tartışmıştık.
Bu makalede sunucu (server) tarafında uygulanan durum yönetimi tiplerini inceleyeceğiz.
Sunuc Tabanlı Durum Yönetimi Teknikleri:
Bu teknikleri üç ana başlık altında ele alabiliriz.
- Session State (Oturum Durumu)
- Application State (Uygulama Durumu)
- Veritabanları (Database Support)
Oturum Durumu (Session State)
Bir istemci (client), bir web sunucusuna bağlanıp bir ASP.NET sayfası talep ettiğinde sunucu istemciye bir SessionID atar ve bu SessionID yi istemciye gönderir. Artık istemcideki web tarayıcısı kapatılıncaya kadar bu SessionID, sunucuda saklı kalır.
SessionID sayesinde sunucu, iletişim içerisinde olduğu istemcileri birbirinden ayırabilir. Bu gerçekten ilk bakışta inanılması zor gibi görünen bir yetenektir. Bir web sitesinden talepte bulunan binlerce kullanıcıyı birbirinden ayırt etmek için ASP.NET 120 bitlik bir kelime kullanır. Bu SessionID, URL adreslerinde kullanılmasına izin verilen ASCII karakterlerinden oluşur. Bu kelime özel bir algoritma ile her istemci için tek (unique) olacak şekilde üretilir. Böylece SessionIDler çakışmaz. Ayrıca, üretilen bu kelime rasgeledir. Bu sayede bir istemcinin SessionIDsini tahmin etmek imkansızlaşır.
SessionID, Session nesnesinin SessionID özelliği ile öğrenilebilir. Local olarak bunu şöyle deneyebiliriz:
private void Page_Load(object sender, System.EventArgse) { Response.Write(Session.SessionID); }
|
|
Tarayıcıda sayfaya baktığımızda 0vxururlzx1fzeit3sucf1nf benzer bir yazı görürüz. Yeni bir tarayıcı penceresi açıp aynı sayfaya yönlendirdiğimizde bu yukarıdaki kelimenin tamamen değişiği olan yeni bir SessionID değeri ekrana yazılır.
Şimdi session değişkenleri kullanarak bir sayı saydırma uygulamasını ele alalım. Uygulamamız için bir web forma iki button ve bir label kontorlü yerleştirelim. Sayfanın yüklendiği an çalışacak kodları yazalım. Uygulamayı indirmek için tıklayın.
private void Page_Load(object sender, System.EventArgs e) { Response.Write(Session.SessionID); Session.Timeout = 1; if (Session["sayi"] == null ) { Session["sayi"] = 0; } }
|
|
Burada session nesnesi içerisine sayi değişkenimizi yerleştiriyoruz. Bunun için Session["sayi"] = 0 yazmak yeterlidir. Sayfa ilk yüklendiğinde Session nesnesi null olacaktır. Bunu kontrol ederek sayi değişkenine ilk değeri olan sıfırı veriyoruz. Artık sayi değişkenimiz sunucuda saklanacaktır. Böylece sanki global olarak saklanmış olan bir değişkene sahip oluruz.
private void Button1_Click(object sender, System.EventArgs e) { Session["sayi" ] = (int )Session["sayi" ] + 1; Label1.Text = Session["sayi"].ToString(); } |
|
İleri düğmesine tıkladıkça Label1 içerisinde sayılar birer birer artar. Her düğmeye basışta sayfa sunucuya gönderilir. Sayi değişkeni session içerisinde saklandığı için değerini korur. Böylece eski değerden yararlanarak onu birer birer arttırabiliriz. Session değişkendeki bir değeri almak için uygun tip dönüşümlerini yapmaya özen göstermeliyiz.
Webformunun içerisinde yer alan form nesnesi sessionların gönderilme şeklini değiştirir.
<form id="Form1" method="get" runat="server">
|
Gönderme metodu olarak postu kullandığımızda session değişkenler, istemcide gizli bir cookie içerisinde saklanır ve sunucuya yollanır. Get metodunu kullandığımızda ise session değerleri, sunucudan URL içerisine yazılarak gönderilir. İleri düğmesine bastıkça URL adresi de sürekli değişecektir. Post metodu varsayılan metottur. Değiştirilmesi tavsiye edilmez.
Session değişkenlerinin sunucuda tutulma süreleri Session.Timeout özelliği ile değiştirilebilir. Varsayılan değer 20 dakikadır. Bizim örneğimizde ise bu süre 1 dakika ile sınırlandırılmıştır. 1 dakika bekleyip ileri tuşuna bastığımızda saymanın devam etmeyip, baştan başladığını gözlemleriz. Session değişkenlerini temizlemek istediğimizde ise Session.Clear() metodunu kullanırız. Bu metodu kullandığımızda Session["sayi"] null olur.
ASP.NET uygulamasının Session değişkenleri ile ilgili bir takım özellikleri web.config dosyası içerinde de belirlenmiştir. Web.config dosyasını açtığımızda
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/> |
ile karşılaşırız. Burada mode session değerlerinin nerede saklanacağını belirler. Bir ASP.NET uygulamasında session değerleri üç farklı şekilde tutulabilir. InProc modunda session değerleri çalışan IIS prosesinin içersinde saklanır. IIS kapatıldığında, yeniden çalıştırıldığında session değerleri kaybolur. StateServer modunda ise session değerleri sunucuda arka planda çalışan ASP.NET state servisinde tutulur. Üçüncü mod olan SQLServerda ise session değerleri SQL Server içerisindeki tablolarda tutulur. Cookieless özelliği ise session değişkenlerin istemcide çerez içerisinde tutulup tutulmayacağını belirler. true değerini aldığında SessionID değeri URLye eklenerek istemciye yollanır. Varsayılan değeri falsedir. Timeout özelliği ise az önce açıklanan sessionın dakika cinsinden yaşama süresidir.
Sessionlar çerezleri desteklemeyen tarayıcılarla çalışabilir. SQLServerda saklandıklarında uygulamalara kalıcılık sağlarlar. Loglama gibi işlemleri kolaylaştırırlar. Ancak büyük verilerin, örneğin datasetlerin sessionlarda tutulması belleğin tükenmesine yol açar. Bu yüzden sessionların perfomansı etkilemeyecek şekilde kullanılması gerekir.
Uygulama Durumu (Application State)
Sessionlar kullanıcıya özgüdür. Kullanıcıya ait değişkenler, özellikler sessionlar içerisinde saklanabilir. Kullanıcı uygulamadan çıktığında sessionlar bellekten atılabilir. Örneğin bir alışveriş sepeti içerisindeki ürünler sessionda tutulabilir. Sipariş tamamlanmazsa veya tarayıcı penceresi kapatılırsa sessionlar silinir. Bu istenen bir durumdur. Uygulama ölçeğinde değişkenler oluşturulup,kullanılmak istenildiğinde ise application nesnesi kullanılır. Application nesnesi uygulamaya özgüdür. ASP.NET uygulaması, IIS çalıştıkça application değişkenlerini kullanabilir. Tarayıcı kapatılsa dahi uygulamaya özgü değişkenler bellekte kalır.
Application nesnesinin çok kullanıldığı bir durum, siteyi ziyaret edenlerin toplam sayısını öğrenmedir.
private void Page_Load(object sender, System.EventArgs e) { if (Application["ziyaret"] == null )     {         Application["ziyaret" ] = 0;     }     Application.Lock(); Application["Ziyaret"] = (int )Application["Ziyaret"] + 1;     Application.UnLock();     Label1.Text  = "Ziyaret Sayısı: " + Application["ziyaret"].ToString(); }
|
Application değişkenlerine değer atamak session değişkenlerine değer atamakla benzerdir. Ancak application nesnesine birden fazla kullanıcı değer atayabileceği için değer atama işleminin senkronize yapılması gerekir. Aynı anda iki kullanıcı application değişkeninin değerini değiştirmeye kalkarsa hata meydana gelir. Bunu önlemek için Lock() metodu kullanılarak sadece bir kullanıcının değeri değiştirmesine izin verilir. Diğer kullanıcıların istekleri ilk kullanıcının işlemi bittikten sonra teker teker ele alınır. UnLock() metodu ile application nesnesi, başka taleplere cevap verebilmesi için serbest bırakılır.
Application nesnesi uygulama bazındaki değişkenleri saklamak için çok kullanışlıdır. Bellek performansını etkilemeyecek şekilde bir çok statik veri application değişkenler içerisinde saklanabilir.
Veritabanları (Database Support)
Web uygulamaları çok kullanıcılıdır. Uygulamanızda kullanıcıların bilgilerini, isteklerini saklamanız gerekebilir. Hatta uygulamanızın kendisi bile bir
veritabanında depolanmış bilgilere ihtiyaç duyabilir. (Örnek: Bir haber sitesinin haber arşivi) Bu gibi durumlarda verileri depolamak için veritabanı kullanmak kaçınılmazdır.
Uygulamanızda bir veritabanı kullanarak kullanıcıları birbirinden ayırt edebilir, işinizle ilgili bilgileri depolayabilirsiniz. Veritabanı kullanmak verileri yalın dosyalarda tutmaktan çok daha güvenli ve verimlidir. Diğer yandan veritabanını optimum şekilde tasarlamak zor bir iştir. İyi tasarlanmamış bir veritabanı hem uygulamanın kodlanmasını zorlaştırır hem de performansını düşürür.
Ferhat Nutku
[email protected]
Makale:
Asp.Net' te Durum Yönetimi - 2 ASP.NET Ferhat Nutku
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|