Session State (Oturum Durumu) Özellikleri

Eyl 06, 2013
Session State(Oturum Durumu), Asp.Net sayfalarında her kullanıcı için özel olarak veri saklama ve bu verileri istenildiğinde çağırma amaçlı kullanılan yapıdır.HTTP(Hypertext Transfer Protocol, Hipermetin Aktarma Kuralı), Stateless(Durumsuz) bir protokoldür ve yapılan her yeni istek birbirinden bağımsızdır. Bu durumda sunucu bir önceki istekte ne gibi bilgilerin kullanıldığını veya saklandığını bilemez. Asp.Net ise Session State(Oturum Durumu) özelliği ile aynı tarayıcıdan gelen istekleri tanır ve isteklerin yaşam süreleri dolana kadar gelen istekleri saklar. Session State(Oturum Durumu) tüm Asp.Net uygulamalarında default(varsayılan) olarak gelmektedir.

Session State (Oturum Durumu) Ayarları

Oturum durumu ayarları web.config içinde system.web bölümü altında <sessionState> elementi içinde yapılır.

<sessionState mode="SQLServer" cookieless="true " regenerateExpiredSessionID="true " timeout="30" sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;" stateNetworkTimeout="30"/>

  • Mode : Session değerlerinin nerede depolanacağının belirtilmesini sağlar.
  • Cookieless : SessionID’lerin Cookie’lerde mi yoksa URL içinde mi gömülü olarak sunucu ve istemci arasında kullanılmasının ayarlanmasını sağlar.
  • regenerateExpiredSessionID : Zamanı geçmiş olan SessionID’lerin yeniden oluşturulup oluşturulmayacağını ayarlamak için kullanılır.
  • timeout : Sessionların yaşam süresinin ayarlanmasını sağlar. Dakika cinsinden ayarlanır (örn : 30 dk).
  • sqlConnetionString : Session verilerinin nereye kaydedileceğini gösteren, modun Sql seçilmesi durumunda ayarlanması gereken ve veritabanının yerinin gösterilmesini sağlayan bağlantı cümlesidir.

Ayrıca "Page Directive" bölümlerinde olan "EnableSessionState" ile de o sayfaya özel olarak "Session State" açılabilir, kapatılabilir veya sadece okunabilir duruma getirilebilir.

Zamanı Dolmuş Session(Oturum) Tanımlayıcılarını Yeniden Oluşturmak

Cookieless Session(Çerezsiz Oturum) değerleri yeniden getirilebilir. Bu yüzden istek zamanı bitmiş olan bir SessionID ile istek yapılırsa , yapılan istek aynı SessionID ile devam ettirilir ama bu davranış istenmeyen paylaşımlara sebebiyet verebilir. Eğer bir Cookieless(Çerezsiz) SessionID ölmüşse ve yeni bir tane üretilmemişse, aynı ID çoklu tarayıcı ortamında başka kullanıcıya da verilmiş olabilir ve böylece istenmeyen veri paylaşımı ortaya çıkar. Bu durumdan Cookieless SessionID’nin yeniden üretilmesi sağlanarak kurtulunur. Onun içinde "regenerateExpiredSessionId" özelliğinin "true" yapılması gerekmektedir. Bu sayede zamanı bitip ölmüş olan SessionID yerine başka ve benzersiz bir SessionID değeri üretilmiş olur.

Session Modes (Oturum Türleri)

  • Off (Kapalı)
  • In-proc
  • State Server
  • SQL Server
  • Custom (Özel)

Off (Kapalı)

Oturum (Session) işlemlerinin gerçekleşmediği bölümdür.

<system.web>
  <sessionState mode="Off" ></sessionState>
</system.web>

Oturum türünün “Off (Kapalı)” olması isteniyorsa, üzerinde çalışılan projenin web.config dosyasında yukarıdaki değişiklikler yapılır.

In-proc (In-process)

Bu tür ASP.Net uygulamalarının varsayılanı olarak atanmış değeridir. In-proc türündeki oturumlarda kullanıcıların oturum bilgileri uygulamanın bulunduğu sunucuların belleklerinde tutulmaktadır. Performansa dayalı Web uygulamaları için uygun bir oturum türüdür ancak uygulamanın bulunduğu sunucunun herhangi bir nedenden dolayı yeniden başlaması durumunda oturumlara ait bilgiler silinmektedir. Bu da In-proc oturum türünün önemli bir dezavantajıdır.

<system.web>
  <sessionState mode="InProc" ></sessionState>
</system.web>

Oturum türünün “In-proc (In-process)” olması isteniyorsa, web.config dosyasında yukarıdaki değişikliğin gerçekleştirilmesi gerekmektedir.

Avantajları

  • Oturuma ait veriler uygulamanın bulunduğu sunucunun bellekleri üzerinde tutulduğu için bu verilere hızlı bir şekilde ulaşım mümkündür.
  • Bu oturum türünde verileri saklamak için verilerin serileştirilmesine gerek yoktur.
  • Uygulaması kolaydır, View State uygulamalarıyla benzerdir.

Dezavantajları

  • Uygulamanın ya da uygulamanın bulunduğu sunucunun yeniden başlatılması durumunda bütün oturum bilgileri silinir.
  • Oturum bilgileri sunucunun belleklerinde bulunduğu için oturumda bulunan kişi sayısının artması verilere erişim performansını olumsuz etkiler.
  • Web Bahçeleri (Web Garden) – Web Çiftlikleri (Web Farm) uygulamaları için uygun değildir.

State Server (Out-process)

State Server türü, Web uygulamasının bulunduğu sunucudan farklı bir sunucuda bulunur IIS’ten bağımsızdır ve tek başına çalışabilen Windows Uygulamaları kullanır. Bu oturum türü aspnet_state.exe tarafından yönetilir. State Server Web uygulamasının bulunduğu sunucuda da çalışabilir ancak Web uygulamasının çalıştığı ortamdan farklı bir bölgede çalışmaktadır. Böylece uygulamanın yeniden başlatılması durumunda oturum bilgileri korunur. Serileştirme gibi dezavantajları da vardır, oturum sahibi kişinin tekrar oturumu açması durumunda farklı bir süreç işlenir. Bu da bilgiye erişim zorluğuna ve maliyetin artmasına neden olur.

<system.web>
  <sessionState mode="StateServer" stateConnectionString="127.0.0.1:42424"
   timeout="30">
  </sessionState>
</system.web>

Oturum türünün "State Server (Out-process)" olması için uygulamanın web.config dosyasında yukarıdaki değişiklikler bulunmalıdır.

Avantajları

  • Oturum bilgileri IIS’ten bağımsız tutulur, böylece Web uygulamasında herhangi bir sorun oluşması durumunda kullanıcıların oturum bilgileri sorunsuz bir şekilde saklanır.
  • Web Bahçeleri (Web Garden) – Web Çiftlikleri (Web Farm) uygulamaları için uygundur.

Dezavantajları

  • Serileştirme ve seriyi bozma gibi durumlardan dolayı işlem süreci yavaştır.
  • State Server’ın sürekli açık olması gerekmektedir.

SQL Server

SQL Server, oturum türleri arasında en güvenli ve güvenilebilir olanıdır. Bu oturum tipinde, kullanıcıların oturum bilgileri serileştirilir ve SQL sunucunun veritabanında saklanır. Bu türün ana dezavantajı, oturuma ait bilgilerin depolanması sırasında serileştirme ve seriyi bozma gibi yöntemlerin kullanılmasıyla sunucuya ekstra yük oluşturmasıdır. Web Çiftlikleri (Web Farm) uygulamaları için en uygun türdür.

<system.web>
  <sessionState mode="SQLServer" timeout="30">
  </sessionState>
</system.web>

 

Oturum türünün “SQL Server” olması istendiği durumda uygulamanın web.config dosyası yukarıdaki şekilde güncellenmiş olmalıdır.

Avantajları

  • Oturum bilgileri IIS’in tekrar başlatılmasından etkilenmez.
  • En güvenilir ve güvenli oturum yönetimine sahiptir.
  • Veriler ortalanarak tutulur, böylece diğer uygulamalar tarafından da bu verilere kolayca erişilebilir.
  • Web Garden (Web Bahçeleri) – Web Farm (Web Çift) uygulamaları için uygundur.

Dezavantajları

  • İşlem süresi uzundur.
  • Tutulan veriler serileştirilirken ve seri bozarken ana uygulamaya yük olur.
  • Oturum bilgileri ana uygulamadan farklı bir ortamda tutulduğu için SQL sunucunun sürekli çalışması ve veri iletişimine hazır halde bulunması gerekmektedir.

Custom(Özel)

SessionIDManager sınıfından kalıtım alarak ve CreateSessionID ve Validate metodlarını override ederek özel SessionID’ler yazılabilir ve bunların doğrulaması yapılabilir. Veya SessionIDManager sınıfını, istenilen sınıfa ISessionIDManager arayüzünden kalıtım almak şartı ile tamamen değiştirilebilir ve özel sınıf oluşturulabilir.

Uygulama:

Session State(Oturum Durumu) özelliği ile bir Web sitesine giriş yapmış kullanıcının bilgileri, o sitede kaç kullanıcının giriş yaptığı gibi bilgiler tutulabilir. Bu özelliklere örnek olarak 3 sayfadan oluşan bir site aşağıdaki gibi tasarlanmıştır.

Kullanıcı sayfaya giriş yaptıktan sonra kullanıcı adını yazıp Session Ekle düğmesine bastığında o kullanıcı için bir Session(Oturum) oluşturulur. Kullanıcı adı oturumunun kimlik bilgisine atılır ve burada saklanır. Kullanıcı için bir Session ID oluşturulur.

Sayfada bulunan ziyaretçi sayısı ise projenin Global.ascx sayfasında gerekli değişiklikler yapılarak elde edilebilir. Bir oturum açıldığında ziyaretçi sayısını bir artıracak ve bir oturum kapandığında sayıyı bir azaltacak bir yapıda olmalıdır.

Default.aspx.cs 

protected void Page_Load(object sender, EventArgs e)
{
        Response.Write("Ana sayfaya hoşgeldiniz.");
        lblZiyaretciSayisi.Text = Application["ZiyaretciSayisi"].ToString();
        lblSessionId.Text = Session.SessionID.ToString();

        if (Session["Kimlik"] != null)
            lblSession.Text = Session["Kimlik"].ToString();
}

protected void  btSessionEkle_Click(object sender, EventArgs e)
{
        Session["Kimlik"] = tbSession.Text;
        lblSession.Text = Session["Kimlik"].ToString();
}

Sayfa2.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
        Response.Write("Sayfa 2'ye hoşgeldiniz.");
        lblZiyaretciSayisi.Text = Application["ZiyaretciSayisi"].ToString();
        lblSession2.Text = Session["Kimlik"].ToString();
        lblSessionId.Text = Session.SessionID.ToString();
}

Sayfa3.aspx.cs

protected void Page_Load(object sender, EventArgs e)

        Response.Write("Sayfa 3'e hoşgeldiniz.");
        lblZiyaretciSayisi.Text = Application["ZiyaretciSayisi"].ToString(); 
        lblSession3.Text = Session["Kimlik"].ToString();
        lblSessionId.Text = Session.SessionID.ToString();


Global.ascx

void Session_Start(object sender, EventArgs e) 
{
        if (Convert.ToInt32(Application["ZiyaretciSayisi"]) == 0)
            Application["ZiyaretciSayisi"] = 1;
        
        else 
        {
            int deger = Convert.ToInt32(Application["ZiyaretciSayisi"]);
            deger += 1;
            Application["ZiyaretciSayisi"] = deger; 
        }
}
    
void Session_End(object sender, EventArgs e)
{
    int deger = Convert.ToInt32(Application["ZiyaretciSayisi"]);
    deger -= 1;
    Application["ZiyaretciSayisi"] = deger;

Yukarıdaki kod parçaları ile oluşturulan sitede kullanıcı adı ile bir oturum oluşturulmakta, bu kullanıcı adına ait SessionID ve sayfada o an kaç ziyaretçi olduğunu göstermektedir. Sayfalar arasında geçiş yapılsa dahi oturum kendini kapatmayacaktır ve her sayfada aynı kullanıcı adı ve aynı SessionID gösterilecektir.

Sayfanın URL'inde kullanıcıya ait SessionID tutulabilir. Bunun için projenin web.config dosyasında cookieless özelliğinin açık olması gerekmektedir.

<system.web>
    <sessionState mode="InProc" timeout="1" cookieless="true"></sessionState>
</system.web>