Sunucu Tabanlı Durum Yönetimi Seçenekleri
İlk makalemizde istemci tabanlı durum yönetimini anlatmıştık. Bu makalemizde, sunucu tabanlı durum yönetimine ait 3 seçeneğin üzerinde duracağız;
- Application state
- Session state
- Profile Properties
Sunucu tabanlı durum yönetimi ile istemci tarafındaki durumu korumak için gönderilen bilgi azalır. Ancak sunucunun kaynaklarını kullanma maliyetini ortaya çıkartır.
Application State
ASP.Net uygulaması bazında değerlerin saklanabilmesine olanak sağlar. Application state, web uygulamasının bütün sayfalarından erişilebilir olan global bir depolama mekanizmasıdır. HTTPApplicationState sınıfının bir örneğinde saklanmak istenen veriler tutulabilir. ASP.NET uygulaması, IIS çalıştıkça application değişkenlerini kullanabilir. Tarayıcı kapatıldığında bile uygulamaya özgü değişkenler bellekte kalır. Application state sunucunun belleğinde tutulur. Bilgiye ulaşmak ve kaydetmek veritabanına kaydetmekten daha hızlıdır. Session state gibi tek bir kullanıcının oturumuna özgü değildir. Bütün kullanıcılar ve bütün oturumlar ile ilgilidir. Bu yüzden application state genellikle kullanıcılar arasında değişmeyen küçük miktardaki verileri tutmak için kullanılır. HttpApplicationState nesnesi uygulamaya gelen ilk request ile yaratılır. Bu sınıfa HttpContext sınıfının Application property’sinden erişilebilir. Application state verisine aynı anda birden çok thread tarafından ulaşılabilir. Bu yüzden application state verisini güncellerken bunun thread-safe olarak yapıldığına emin olunmalıdır. Lock ve UnLock metodları ile veri bütünlüğü korunabilir.
Application State’in kullanımına siteye ziyaret eden kullanıcı sayısını belirleyen basit bir örnek verelim.
void Application_Start { Application["activeVisitors"] = 0; } void Session_Start(object sender, EventArgs e) { if (Application["activeVisitors"] != null) { Application.Lock(); int visitorCount = (int)Application["activeVisitors"]; Application["activeVisitors"] = visitorCount++; Application.UnLock(); } } |
Session State
ASP.Net session state, aynı tarayıcıdan gelen istekleri belirli bir zaman aralığı çerçevesinde tanır ve bu session süresince sessiona saklanmış olan değerleri tutmaya devam eder. Eğer uygulamayı farklı kullanıcılar kullanıyor ise her kullanıcı oturumunun farklı bir session state’i olacaktır. Ayrıca bir kullanıcı uygulamayı kapatıp daha sonra tekrar açtığında o anki oturumu da ilk oturumdan farklı olacaktır. Bir istemci sunucuya sayfa isteğinde bulunduğunda, sunucu istemciye bir SessionID atar ve SessionIDyi istemciye gönderir. İstemcideki web tarayıcısı kapatılana kadar, veya oturum sona erdirilene kadar bu SessionId sunucuda saklanır. Sunucu sessionID’yi kullanarak istemcilerini birbirinden ayırır. Varsayılan olrak bütün ASP.Net uygulamaları için ASP.Net session state açıktır.
Session Değişkenleri
Session değişkenleri bir SessionStateItemCollection nesnesinde tutulurlar. Bu nesneye HttpContext.Session property’sinden ulaşılabilir. Bir ASP.Net sayfasında, o anki session değişkenlerine ise Page nesnesinin Session property’sinden ulaşılabilir. Session değişkenleri koleksiyonda değişkenlerin adı veya integer index ile indexlenerek tutulurlar. Aşağıda session değişkenlerinin yaratılması ve değerlerinin set edilmesi ile ilgili bir örnek gösterilmiştir.
Session["Ad"] =txtAd.Text; Session["Soyad"] = txtSoyad.Text; |
Sessionlar benzersiz bir belirleyici ile birbirlerinden ayırt edilirler. Bu belirliyici SessionID propertysidir. Sayfaya gelen her istek için, tarayıcının gönderdiği bir sessionID’sinin olup olmadığı incelenir. Eğer bir sessionID yoksa, ASP.Net yeni bir session başlatır. Ve isteğe verilen cevapta o sessionın sessionID’si gönderilir.
Aynı sessionID ile istek yapılmaya devam edildiği sürece session aktif sayılır. Eğer istekler arasındaki süre time-out süresini geçerse, o session sonlandırılmış sayılır. Eski bir sessionId değeriyle yapılan bir istekte yeni bir session’ın açılır.
Session Timeout
Her session’ın bir timeout değeri vardır. Varsayılan olarak bu değer 20 dakikaya set edilmiştir. Eğer sayfa timeout süresi boyunca her hangi bir istek almazsa, ASP.Net kullanıcının uygulamadan çıktığını varsayar, session sona erdirir ve End event’ini tetikler. Bu sunucunun kullanılmayan sessionları temizlemesine ve yeni isteklere yer açmasına olanak sağlar. Timeout değeri aşağıdaki örnekte de görülebileceği gibi web.config dosyasından veya koddan değiştirilebilir. Verilen timeout değeri dakika cinsindendir.
<sessionState timeout="60" /> Session.Timeout = 60; |
Profile Properties
Asp.Net kullanıcıya özel verileri saklamak için profile properties özelliğini sunar. Bu özellik session state’e benzer, farkı ise kullanıcının session’ı sona erdiğinde profil bilgisinin kaybolmamasıdır. Bu özellik bir ASP.Net profili kullanır. Bu profil her bir kullanıcıya özel olarak saklanır. ASP.Net profili, kendi veritabanımızı yaratmadan kullanıcı bilgilerini kolaylıkla yönetmemizi sağlar.
Profile Properties özelliğini kullanmamız için bir profile provider yapılandırılmalıdır. ASP.Net’in profil bilgisini SQL veritabanında saklayabilmek için SqlProfileProvider classı vardır. Ayrıca özel bir formatta profil bilgisini yaratıp xml dosya gibi özel bir depolama mekanizmasına saklayan kendi profil provider sınıfımızı yaratabiliriz. Profile properties uygulamanın belleğinde durmadığı için IIS’in yeniden başlatılması gibi durumlarda verisini kaybetmez. Aşağıdaki bir profil değerinin nasıl saklanacağı ve web.config’de o property’nin nasıl tanımlandığı gösteren bir örnek yer almaktadır.
Profile.PostalCode = txtPostalCode.Text; |
<profile> <properties> <add name="PostalCode" /> </properties> </profile> |
Referanslar
Yorumlar
Yorum Gönder