Ana içeriğe atla

ASP.Net Durum Yönetimi – Bölüm 2 (State Management)

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
Özlem KARAGEDİK

Yorumlar

Bu blogdaki popüler yayınlar

UML ve Modelleme – Bölüm 4 (Class (Sınıf) Diyagramları)

Bir önceki makalemizde UML modellemede kullanılan ilk diyagram olan Use Case diyagramını incelemiştik. Bu makalemizde nesne tabanlı programlamada kullanılan sınıflar ve sınıfların arasındaki ilişkileri modelleyebileceğimiz diyagramlar olan Class(Sınıf) diyagramlarını inceleyeceğiz. UML’de sınıflar, nesne tabanlı programlama mantığı ile tasarlanmıştır. Sınıf diyagramının amacı bir model içerisinde sınıfların tasvir edilmesidir. Nesne tabanlı uygulamada, sınıfların kendi özellikleri (üye değişkenler), işlevleri (üye fonksiyonlar) ve diğer sınıflarla ilişkileri bulunmaktadır. UML’de sınıf diyagramlarının genel gösterimi aşağıdaki gibidir. Şekil 1. Class Diyagram Şekil1’de görüldüğü üzere bir dikdörtgeni 3 parçaya bölüyoruz. En üst bölüm sınıf adını, orta kısım özellik listesini (üye değişkenler) ve en son kısım, işlev listesini (üye fonksiyonlar) göstermektedir. Çoğu diyagramlarda alt iki bölüm çıkarılır. Genelde tüm özellik ve işlevler gösterilmemektedir. Ama

Yazılım Maliyet Tahmineleme Tecrübeleri

Yazılım mühendisliğinde maliyet hesabı her zaman problem olmuştur. "Bu iş kaç Adam/Gün tutar?" sorusuyla sıkça karşılaşıyoruz. Adam/gün veya Adam/ay ölçütleri bir kaynağın/kişinin belirtilen zaman dilimindeki iş gücü anlamına gelir. Tabi bu noktada yine kafa karışıklıkları başlar. 6 A/G'lik bir işi hızlandıralım diye 2 kişi ile yapmaya çalışsak ve kaynak/kod, modül, altyapı, insan vb. her bir şeyi bir kenara bıraksak, matematiksel basit formülle 6/2=3 A/G'de biter? Gerçek hayat böyle değil, öncelikle bunu anlamamız lazım. Hep şu örnek verilir; "Aynı bebeği 2 kadın birlikte daha kısa sürede doğurur mu?" Eğer bunun cevabı "Evet" ise (veya bir gün böyle bir durum ortaya çıkarsa), yazımı değiştirmem gerekecek:) Mevzu gerçekten derin...Maliyet hesabı; bulunduğunuz firmanın yazılım süreçlerini hangi methodlarla uyguladığına, ilgili işin o dönemdeki aciliyetine, (şirket yönetiminin baskısına:)) vb. bir çok duruma bağlı olabilir. Örneğin; bizim firmada e

UML ve Modelleme – Bölüm 3 (Use Case Diyagramlar)

Önceki iki makalemizde ( 1 , 2 ) UML’e genel olarak değinip ve modellemede kullanacağımız dokuz diyagram hakkında bilgiler vermiştik. Bu makalemizde Use Case diyagramından detaylı bahsedeceğiz. Öncelikle, genel Use case diyagramının tanımını hatırlayalım. “Bir kullanıcı ve bir sistem arasındaki etkileşimi anlatan senaryo topluluğudur.” Ivar Jacobson Senaryo tanımı için der ki: “Aktörle sistem arasında gerçekleştirilen, sonucunda aktöre farkedilir getirisi/ faydası oluşan etkileşimli diyalogdur. ” UML Use Case Diyagramları  sistemin işlevselliğini açıklamak amacıyla kullanılır. Sistemin birbirinden ayrı özelliklerinin detaylarını göstermekten ziyade, Use Case Diyagramlar, tüm mevcut işlevselliği göstermek için kullanılabilir. Buradaki en önemli noktalardan biri,   Use Case Diyagramlar temelde sequence diyagram ve akış diyagramlarından farklıdır. Use Case diyagramlar dört ana elemandan oluşmaktadır. Aktörler , Sistem (Proje kapsamını belirtir) , Use Caseler ve bunlar ara