ASP.NET Session Kullanımı
Session’ın kelime anlamı oturumdur.Her hangi bir ziyaretçi sitemize ilk girdiği anda, o ziyaretçiyle ilgili Session başlatılmış olur.Ziyaretçimizle ilgili bir bilginin başka bir sayfada elde edilmesini istiyorsak Sessionları kullanabiliriz.Server taraflı çalışan Sessionlar, bir sayfada aldıkları bilgileri diğer sayfada kaybetmezler.Session değerlerini sayfalar arasında taşımamıza gerek yoktur.O bilgiler oturum aktif olduğu sürece hafızada kalırlar.Ziyaretçi sayfalarımızı dolaşırken oluşturulan Session nesnesi, ya bizim belirleyeceğimiz ya da önceden sunucu tarafından belirlenen zaman aşılınca sona erer.
Şimdi Default.aspx ve Deneme.aspx adında iki sayfa hazırlayalım.Default.aspx sayfasında birer TextBox ve Button nesneleri olsun.Button nesnesine tıklandığı zaman TextBox’a yazılan değer, oluşturulacak Session nesnesine aktarılsın ve Deneme.aspx sayfasında Session’a yazılan bu değeri okuyalım.
---Default.aspx--- protected void Button1_Click(object sender, EventArgs e) { Session.Add("Deger", TextBox1.Text); }
---Deneme.aspx--- protected void Page_Load(object sender, EventArgs e) { Response.Write(Session["Deger"].ToString()); }
Eğer TextBox’ımıza “Gençay” değerini girip Button nesnemize tıklarsak, ardından Deneme.aspx sayfasını açarsak karşımızda “Gençay” yazdığını göreceğiz.Default.aspx ve Deneme.aspx sayfaları arasında bir veri taşımasında uğraşmadığımız halde Session nesnesi TextBox’a girilen değeri taşımamıza yardımcı oldu.
Şimdi şöyle bir soru sorabilirsiniz.”Server’da bir tane Session nesnesi oluşturuluyorsa eğer, Ahmet ile Zeynep aynı anda siteye ziyaretçi olduklarında ve TextBox’a “Ahmet” veya “Zeynep” yazdıklarında Session nesnesinin değeri sürekli değişmeyecek mi? 🙂 Yani Ahmetin Session bilgileri Zeynepte ya da tam tersi durum, Zeynep’in Session bilgileri Ahmet’te gözükme olasılığı yok mu? “. Tabi siz soruyu daha kısa şekilde sorabilirsiniz 🙂
Bu sorunun cevabı hayır yok.Çünkü, SessionID özelliği sayesinde sunucu, iletişim içierinde olduğu istemcileri birbirinden ayırabilir.Yani, bir web sitesinden talepte bulunan binlerce kullanıcıyı birbirinden ayırt etmek için SessionID özelliği kullanılır.Sunucu istemciye(client) bir SessionID atar.Her istemcinin kendine özel SessionID’si olacaktır.İstemcilere atanan SessionID’yi öğrenmek için aşağıdaki kod yardımcı olacaktır.
Response.Write(Session.SessionID);
Yukarıdaki gibi SessionID öğrenilebilir.Yeni bir tarayıcı penceresi açıp aynı sayfaya yönlendirdiğimizde, yukarıdaki kodun yazdığı SessionID’nin tamamen değiştiğini göreceksiniz.
Bu yüzden dolayı Ahmet ile Zeynep’in istemcileri SessionID sayesinde aynı Session bilgilerini tutmayacaktır.
Farklı bir yol olarak aşağıdaki şekilde de kullanım yapabiliriz.
---Default.aspx--- protected void Button1_Click(object sender, EventArgs e) { Session["Deger"] = TextBox1.Text; }
---Deneme.aspx--- protected void Page_Load(object sender, EventArgs e) { Response.Write(Session["Deger"].ToString()); }
Yukarıdaki yöntemde olduğu gibi,Default.aspx sayfasında TextBox nesnesine girilen değeri Session nesnesine set edebilir ve set ettikten sonra Deneme.aspx sayfasında o değeri okuyabiliriz.
Session nesnelerinde sadece tek bilgi tuttuğumuzu zannetmeyiniz.Şimdi Default.aspx sayfasını aşağıdaki gibi düzenleyelim.
Yukarıda gördüğünüz gibi Ad ve Soyad alanlarını Default.aspx sayfasında girip, Button nesnesine tıkladığımız zaman bu değerleri Session nesnelerine kaydettirelim.Deneme.aspx sayfasında da bu Session nesnelerinin değerleri okutalım.
---Default.aspx--- protected void Button1_Click(object sender, EventArgs e) { Session.Add("Ad",TextBox1.Text); //Server belleğinde, Sessionlar içinde ismi Ad olan bir Session nesnesi eklendi. Session.Add("Soyad",TextBox2.Text); //Server belleğinde, Sessionlar içinde ismi Soyad olan bir Session nesnesi eklendi. }
---Deneme.aspx--- protected void Page_Load(object sender, EventArgs e) { Response.Write(Session["Ad"].ToString()); Response.Write(Session["Soyad"].ToString()); }
Yukarıdaki kodları derleyip çalıştırdığınızda, Default.aspx sayfasında Ad ve Soyad değerlerini girip Button nesnesine tıklarsanız eğer,Deneme.aspx sayfasında girilen değerleri göreceksiniz.
Bir Session nesnesi, oturum sonlandığında iptal ediliyor.Browser’ın kapatılması sonucu ya da belirlenen bir sürenin aşılması durumda Session nesnesi iptal edilebilir.
Eğer Session nesnesinin süresi belirtilmemişse, varsayılan olarak 20 dk Session nesnesi var olacaktır.Tabi bu 20 dk, sitemize giren kullanıcının hiç bir etkinlik yapmadığı süre zarfınca geçerlidir.
Sitemize giren her kullanıcı için oluşturulacak Session nesnesinin yaşam süresini kendiniz ayarlamak istiyorsanız, TimeOut özelliğini kullanmalısınız.
—Session.TimeOut = Dakika—
Session.Timeout = 1; //Session nesnesi 1 dakika sonra silinecektir.
Sonraki yazılarımda görüşmek üzere …
İyi çalışmalar..
MAKALENDE HATA VAR
Nesne başvurusu bir nesnenin örneğine ayarlanmadı.
Açıklama: Geçerli web isteği yürütülürken işlenmemiş özel durum oluştu. Lütfen hata ve kod içinde kaynaklandığı yer hakkında daha fazla bilgi almak için yığın izlemesini gözden geçirin.
Özel Durum Ayrıntıları: System.NullReferenceException: Nesne başvurusu bir nesnenin örneğine ayarlanmadı.
Kaynak Hatası:
Satır 12: protected void Page_Load(object sender, EventArgs e)
Satır 13: {
Satır 14: Response.Write(Session[“renk”].ToString());
Satır 15: Response.Write(“” + Session.SessionID);
Satır 16: }
HATASI ALIYORUM…..
Merhaba Mustafa,
Makalemde hata olup olmadığından önce, yazdığınız programda “renk” adında bir Session nesnesi oluşturdunuz mu?
Örneğin,
komutunu çalıştırmadan önce aşağıdaki gibi “renk” isminde bir Session alanı oluşturup değerini vermeniz gerekiyor.
Hani haberiniz var mı bilmiyorum ama Session’dan bir değişken isminden değer çağırmak istiyorsanız öncelikle o değişken isminde değeri oluşturmanız gerekmektedir.
Hiç hoş olmayan “MAKALENDE HATA VAR” gibi bir yargıyla yaklaşımda bulunmanızdan önce araştırıp ya da üslubuyla sorunu detaylandıracak şekilde yaklaşımda bulunmanız daha samimi ve içtenlik katardı.
Saygılarımla..
mustafa makalede değil sende hata var!
hatta;
MUSTAFA SENDE HATA VAR!
Öyle ama değil mi Mert 🙂
Öcelıkle merhabalar, benim veritabanımda müşteri ve ona bağlı sipariş tablolarım var. Client te yapılan olayları session kaydedip sonra bu sessiondaki dataları ilgili tablolara aktarılması gerekir veya tam tersi ilgili tabloadakı datayı sessiona kaydedip sonra bu sessiondaki datayı clientde sunucaz. Doğru mu anlamış strateji bu olmalı değil mi? Bir de ayrıca veritabanımda müşternın bir CustomerID si var peki ben bu CustomerID ile ilgili session nasıl eşleştirebilirm? Ahmet in SessionID si sabit mi yani farklı ip lere sahip konumlarda da bu sabit ona atanmış SessionID yı mı kullanıyor.
Merhaba,
Çok karışık soru sormuşsunuz 🙂 Elden geldiğince cevaplamaya çalışayım;
Öncelikle birinci sorunuzu değerlendirelim;
Oturum işlemlerinde kullanıcıdan alınan bilgiler ile yapılan kontroller doğrultusunda kullanıcı bilgileri Session’a atılmaktadır. Yani burada Session oturum kontrolü sağlayan bir araçtır. Dediğiniz gibi clientta yapılan tüm olayları önce Session’a daha sonra veritabanına şeklinde ya da bu mantığın tersinde bir kullanım şart değildir. Bu şekilde performans ve maliyet açısından olumsuz durum söz konusu olmakla beraber yapısal açıdan da çok büyük bir yanlışlık icra edilmiş olacaktır.
İkinci sorunuza gelirsek eğer;
Session’da ki bir veri ile tablodaki veri arasında olsa olsa mantıksal bir ilişki söz konusu olabilir. Örneğin; “3” id değerine sahip bir müşteriyi siz Session’a atarsanız eğer bu müşteriyle ilişkili herhangi bir veriye gene “3” id değeri sayesinde erişebilir ve işlemlerinizi gerçekleştirebilirsiniz. SessionID dediğiniz gibi kişiye özeldir ve o anda kim için oluşturulduysa o siteye dünya girse başkasına o SessionId değerinde bir değer oluşturulmayacaktır.
Sorunuzu anladığım kadarıyla cevaplandırmaya çalıştım.
İyi çalışmalar.
Merhaba peki session yani oturumu süresiz olarak açık tutmak istiyorsak napmamız lazım
Salamlar Hocam , ben jwt tokeni sessionda kullanmak isdiyorum amma browser kapatildigi teqdirde session siliniyor, Hocam ben tokeni nerede saklasam daha iyi olur? ben isdiyorumki gelen sefer browser acaraq sitemize girdikde ,tokenden kullanarak kendi hesabima daxil ola bilim. onceden tesekkurler.
Merhaba,
Local storage’a koyabilirsiniz.
Ayrıca bu adresteki makaleyi incelemenizi tavsiye ederim.
Kolay gelsin.
Cavabladiginiz ucun cok-cok tesekkurler ederim Hocam
Session’ın alternatifi var mıdır?
Aşağıdaki konulara göz atabilirsin :
HocamMerhaba bitirme projem için Login islemi icin action filter kullandım ve burda session olusturdum.
brda belirtmiş olduğum “Login Mi” keyini valuesi kullanıcıId me ait.
KullanıcıId alış şeklimden bahsetmek gerekirse viewdan post sekliyle controllera dönüyor girilen bilgilerle veritabanında eşleşirse Login işlemi başlıyor ve sessiona girilen kullanıcının KullanıcıId si atanıyor.
Soruma gelicek olursam :D… Login Mi keyinin valuesini kullanmam gerekiyor farklı yerlerde, mesela yapılacak yorum için bir kullanıcıId gerekiyor burda kullanıcıId belirtmeyi bu şekilde düşünüyorum. Lütfen yardımcı olun bana bu konuda yoksa halim duman… derdimi anlamayıp farklı kanallardan iletişime geçmeyi isterseniz mail üzerinden istediğiniz her bilgiyi ulaştırabilirim hocam. https://www.linkedin.com/in/dogukanonay/ iletişime geçmek isterseniz burayıda kullanabilirsiniz. Biraz emri vaki gibi olmamıştır umarım videolardan tanıdğım samimiyetinize dayanarak bu kadar samimi yazabildim :))