Durum Yönetimi (state management) amacıyla kullanılan Session nesnesi server taraflı olandır. Client taraflı olan durum yönetim nesnesi Cookie'lerdir. Öncelikle Session nedir? Ne işe yarar? kısaca bundan bahsedelim ve cookie ile arasındaki farklara değindikden sonra kullanımını bir uygulama üzerinde görelim.
Session:
Bir oturum nesnesidir. Ziyaretçiler bir web sunucusundan herhangi bir sayfayı talep ettiğinde, sunucu bilgisayarlar gelen ziyaretçilerin herbirine ayrı ayrı oturumlar başlatır. Peki bu farklı oturumları nasıl birbirinden ayırt etmektedir? Şöyle ki Asp.net sunucularında oturum sahiplerini tanıyabilmek için özel bir algoritma ile oluşturulan tanımlayıcı bir değer kullanılır. Bu tanımlayıcı değerlere SessionID denilmektedir. İşte ziyaretçiler bu SessionID değerlerine göre bir birbirinden ayırt edilmektedir.
Session nesneleri yardımıyla kullanıcılara ait oturum bilgileri sayfalar arasında taşınabilmektedir. Tabiki bu bilgi taşıma olayı sonsuza kadar değildir. Bu süre Session'a atanan oturum süresi boyunca devam etmektedir. Session'ın son bulması için sadece belirlenen bu oturum süresinin dolmasıda gerekmez. Kullanıcı eğer geçerli olan tarayıcıyı kapatırsa oturumu otomatik olarak son bulacaktır. Ya da sunucu bilgisayarda oluşabilecek sorunlardan dolayıda oturumlar son bulabilir. Sessionda kullanıcıya ait pek çok bilgi tutulabilir (Örn. Kullanıcının adı, soyadı, şifresi, ip adresi vs.) Genel olarak Session nesnesinin kullanımına verilebilecek en güzel örnek alışveriş siteleridir. Burada kullanıcının sepetine ait olan bilgiler session'da tutulup site içerisinde sayfalar arasında taşınabilmektedir.
Cookie:
Cookie'lerde ise bu şekilde bir oturum sonlanması söz konusu değildir. Çünkü Cookie'ler istek yapılan sunucu bilgisayar tarafından bizim HDD mize bırakılan küçük .txt dosyalarıdır. Bu .txt dosyalarının içerisinde aynen sessionda olduğu gibi sunucunun bizi tanıması için gerekli olan bilgiler saklanmaktadır. Ve sadece bu kodu tanımlayan web sunucusu tarafından okunabilir. Fakat bu Cookie'deki bilgiler yönetici konumuna sahip kişilere ait kullanıcı adı ve parola bilgileride olabilir. Session'da bu bilgiler server bilgisayarda saklandığı için herhangi bir problem oluşturmuyordu. Fakat cookie'de ise bu bilgiler kullanıcıların bilgisayarlarında saklandığı için güvenlik noktasında sıkıntı oluşturmaktadır. Eğer kötü niyetli bir kişi yönetici konumundaki birinin cookie'sini çalıp kendi cookie'si ile değiştirirse çok da hoş bir sonuç çıkmaz ortaya. Bundan dolayı oturum yönetimlerinden session nesnesinin kullanımı daha sağlıklı ve güvenlidir.

Şimdi bu session olayını bir resim üzerinde görelim.

12_11_2010_d1.jpg

Evet resimde ifade etmeye çalıştığım gibi. Client (istemci bilgisayar) Server'dan (sunucu bilgisayar) bir talepde bulunur ve sunucu bilgisayardan kendisine bu talep doğrultusunda bir oturum açılır ve bir SessionID atanır. Oturum süresi boyunca da bu SessionID değerine göre tanınır.

Şimdi bu anllatığımız session olayını bir örnek üzerinde uygulayalım.

Default.aspx
Sayfamızın tasarımı aşağıdaki gibi olacak.
12_11_2010_d2.jpg

Amacımız textboxlara girilen kullanıcı adı ve şifre değerlerini session nesnesi aracılığı ile tutmak.
Burada ne gerçekleşicek?
Session Yaz
Biz textboxlara gerekli değerleri girdiğimiz zaman bu değerleri session'a yazdıracağız.
Session Oku
Az önce yazmış olduğumuz değerleri okutup listbox üzerinde göstereceğiz. Bu okuma işlemi sırasında otomatik olarak atanan sessionID değerinide listbox'da göstereceğiz.
Session Aktar
Burada ise kullanıcının session bilgilerini aynı oturum içerisinde iken bir başka sayfaya taşıyacağız. Bunun içinde projemize bir tane daha Web Form ekliyoruz ve üzerine üç tane label atıyoruz. Bu labellarda atanmış olan SessionID, Kullanıcı Adı ve Şifre bilgilerini göstereceğiz.

Evet şimdi gerekli işlemleri yapmamızı sağlayacak olan kodlarımızı her bir butonun click eventine yazıyoruz. Ve sayfamızın kod kısmının görüntüsü aşağıdaki gibi olacaktır.

Default.aspx.cs

protected void ButtonSessionYaz_Click(object sender, EventArgs e)

    {

        // TextBox lardan gelen değerleri Session'a atıyoruz.

        Session["KullaniciAdi"] = TextBox1.Text;
        Session["Sifre"] = TextBox2.Text;

        // Burada oturumun geçerlilik süresini belirliyoruz. Ben 1 dk olarak belirledim.

        Session.Timeout = 1;

         // Listbox'ı temizleyip. Session'ın yazıldığını belirtiyoruz.

        ListBox1.Items.Clear();
        ListBox1.Items.Add("Session yazıldı.");

   }

     protected void ButtonSessionOku_Click(object sender, EventArgs e)

     {

         // listbox'ı temizliyoruz.

         ListBox1.Items.Clear();

         // Burada ziyaretçiye SessionID atamış oluyoruz ve SessionID değerini listbox üzerinde gösteriyoruz. Bunu Session nesnesinin SessionID özelliği ile yaptık. Bu SessionID atama işlemini sayfanın Page_Laod'ında da yapabilirdik ve ilgili bir nesne üzerinde gösterebilirdik.

         ListBox1.Items.Add("SessionID değeri: " + Session.SessionID.ToString());

        // Burada Sessionlar'a değer ataması yapılmadan okuma yapılmaya çalışıldığında uyarı verdiriyoruz. Eğer Session Yazma işlemi yapıldıktan sonra session okuması yapılıyorsa atanmış olan değerleri listboxda gösteriyoruz.

        if (Session["KullaniciAdi"] == null)
              ListBox1.Items.Add("Session'lar boş. Değer giriniz.");

        else

        {  
            ListBox1.Items.Add("Kullanıcı Adınız: " + Session["KullaniciAdi"].ToString());
            ListBox1.Items.Add("Şifreniz: " + Session["Sifre"].ToString());

        } 

     }

     protected void ButtonSessionAktar_Click(object sender, EventArgs e)

     {

         // Burada ise kulanıcının oturum bilgileri olan SessionID, Kullanıcı Adı ve Şifre bilgilerini başka bir sayfaya taşıyoruz.

        Session["KullaniciAdi"] = TextBox1.Text;
        Session["Sifre"] = TextBox2.Text;
        Response.Redirect("Default2.aspx");

     }


Default2.aspx.cs

protected void Page_Load(object sender, EventArgs e)

    {

        // Burada SessionID, Kullanıcı Adı ve Sifre degerlerinin Default.aspx sayfasında da barındırıldığını görebiliyoruz. Mevcut olan oturum bilgilerini labellara yazdırdık.

        Label1.Text = "SessionID değeri: "+Session.SessionID.ToString();       
        Label2.Text = "Kullanıcı Adınız: "+Session["KullaniciAdi"].ToString();
        Label3.Text = "Şifreniz: "+Session["Sifre"].ToString();

    }

Şimdi projemizi çalıştırıp örneğimizi test edebiliriz. Projemizi çalıştırıp gerekli bilgileri textbox'a girdikten sonra Session Yaz butonuna tıkladığımızda listboxda Session yazıldı mesajının eklendiğini görebiliriz.

12_11_2010_d3.jpg

Şimdi de Session Oku butonuna basarak yazılmış olan Session değerlerinin ve SessionID numarasının listbox'a aktarıldığını görebiliriz. Aşağıda olduğu gibi.

12_11_2010_d4.jpg

Evet SessionID, girilen Kullanıcı Adı ve Şifre bilgilerinin session'dan okunarak listbox'a aktarıldığını görmüş olduk.
Şimdi de bu bilgilerin sayfalar arasında taşınmasına bakalım. Bunun içinde Session Aktar butonuna tıklıyoruz ve ekran görüntümüz aşağıdaki gibi olacaktır.

12_11_2010_d5.jpg

Evet aynı oturum içerisinde iken Session bilgilerinin bir başka sayfa olan Default2.aspx sayfasına aktarıldığını görmüş olduk.
Asp.net ortamında Session işlemleri temel olarak bu şekilde yapılıyor. Birde Session nesnesine ait bazı mode'lar bulunmakta. Bu mode'lar ile Sessionun tam olarak nerede saklanacağını belirtiyoruz. Fazla detayına girmeden kısaca bahsetmek istiyorum.
Öncelikle bu Session'a ait mode ayarlarını web.config dosyamız altında gerçekleştiriyoruz. Ve <sessionState mode=" "></sessionState> elemanını kullanarak yapıyoruz. mode=" " yazan kısma kullanmak istediğimiz mode ifadesini giriyoruz. Bu eleman <system.web></system.web> boğumunun içine yazılarak kullanılır. Aşağıdaki şemada session nesnesine ait mode'lar gösteriliyor.

12_11_2010_d6.jpg

Kısaca bunları açıklayalım.

InProc:
Varsıylan mode InProc dur. Bu mode'da session, Asp.net uygulamalarını çalıştran worker Process'de tutulur. Yani oturum değişkenleri site ile aynı bellek alanlarında bulunur. En hızlı saklama yöntemi bu olmasına karşın bir şekilde Worker Process ya da IIS uygulama havuzu sonlanırsa oturum değişkenleri de kaybolur. Örneğin uygulama havuzu için ayırdığınız bellek miktarı dolar ve uygulama havuzu tekrar başlarsa o anda sayfada bulunan tüm kullanıcıların oturum değişkenleri kaybolur.
StateServer
:
Bu mode'da oturum değişkenleri, iis ve wp den farklı bir uygulamada depolanır. Yani InProc dan farklı olarak, iis veya wp sonlansa dahi oturum değişkenleri kaybolmaz. Ancak sessiona attığınız objelerin serialise edilebilmesi kuralı InProc mode'una göre daha katıdır.
SQLServer:
Bu mode'da oturum değişkenleri bir Sql sunucusunda bulunur. Bu mode InProc kipine göre yavaş ama güvenirliği açısından etkili bir yöntemdir.
Custom: Yukarıda belirtilen kipler dışında oturum değişkenleri özel bir sağlayıcıda barındırılacaksa bu yöntem kullanılmalıdır.

Evet arkadaşlar bu yazımda Asp.net ile Session işlemlerinin nasıl yapıldığına ve Session nesnesine ait olan mode'lara değindik. Faydalı olacağını umuyorum..
Hepinize Kolay Gelsin. İyi Çalışmalar.

SessionUygulama.rar

kategoriler:  AspNet |