"Session" nedir sorusuna verilebilecek ilk cevap Web sayfaları arasında "Veri Aktarımı" yapılmasını sağlayan oturum nesnesidir diyebiliriz. Session kullanıcılara ait verilerin ( Kullanıcı adı , şifre , IP Adresi gibi) sunucu üzerinde tutulmasını sağlayan yapıdır.Bu oturum nesnesi Server Side (Sunucu) tarafında benzersiz bir "SessionId" ile her Client(istemci) için ayı ayrı oluşturulur.Bu oluşturulan Session nesneleri Server(sunucu) üzerinde tutulur.Bildiğiniz üzere Cookie nesneleri de veri aktarımında kullanılır fakat Cookie'ler Client tarafındaki Browser üzerinde tutulurken, Session nesneleri Server tarafında tutulur ki bu yüzden güvenli bir yöntemdir.O yüzden önemli bilgiler şayet tutulacaksa Cookie üzerinde değilde Session nesnesi üzerinde tutulmalıdır.
Session nesnesine değer atanması;
Session nesnesine değer atanması;
Session["UserName"] = txtUser.Text;
Session nesnesinden değer okunması;
if (Session["UserName"] != null)
{
lblWelcome.Text = "Welcome : " + Session["UserName"];
}
Session üzerinde Dataset nesneside tutulabilir ve sayfalar arasında taşınabilir.Yalnız Dataset nesnesi kendi başına bile bellek sorunu yaşatabilirken, serverda N tane client için oluşturulan N adet session üzerinde ayrı ayrı tutulacağını düşünürsek oturum boyunca ciddi bellek sorunlarına sebep olabileceği unutulmamalıdır.
Session["DataSet"] = objDataSet;
if (Session["DataSet"] != null)
{
DataSet myDs = (DataSet)Session["DataSet"];
}
Session Üzerinde;
- Kullanıcı Adı, Şifresi,Kullanıcı Yetkileri, Oturum Açma Dili, Cient Ip'si, E-Ticaret Sitelerindeki Alış Veriş Sepeti İçerikleri (En Sağlam Yolu DB Tarafında Tutmaktır) gibi özellikler tutulabilir.
Unutulmaması gereken bir konu N tane Client sunucuya istekte bulunduğunda, Server tarafında N tane ayrı session nesnesi oluşturulur.Bu nesneler hiç bir zaman Client tarafına gönderilmez.Server side üzerinde bellekte tutulur.
Session Çalışma Modları
Session nesnesinin "In-Proc", "SQLServer" ve "StateServer" gibi 3 temel çalışma modu bulunmaktadır. Default olarak In-Proc modda çalışmaktadır.In-Proc mod üstte de anlattığımız gibi session nesnesinin IIS Server tarafında tutulduğu klasik yöntemdir.SQLServer mod session nesnesinin SQL Server üzerinde veritabanında tutulduğu, StateServer mod ise session nesnesinin IIS server üzerinde değilde farklı bir sunucu üzerinde tutulduğu yöntemdir.
Server Üzerindeki Session Nesnesi ile Client Nasıl Haberleşir?
- Web sunucusundan bir sayfa talep edildiğinde, server ilgili client için benzersiz bir SessionId ile yeni bir session nesnesi oluşturur.(Uniqe)
- Bu SessionId 120 bitlik bir sayı olup ASP.NET algoritmasıyla oluşturulur
- Daha sonra bu SessionId Client tarafına(kullanıcıya) gönderilir.Client tarafında browser üzerinde default bir Cookie üzerinde tutulur.Böylelikle aynı SessionId değeri hem Server tarafında, hem Client tarafında tutulmuş olur
- Bu noktadan sonra Client tarafından Server'a gönderilen her postback'te bu SessionId ile Server tarafındaki kendine ait oturum eşlenir.Yani Server, Client tarafından gelen SessionId ile kendi üzerindeki Session nesnelerinden hangisinin ilgili kullanıcıya ait olduğunu bu şekilde anlamaktadır.
- Server, kullanıcının browseri kapatıp kapatmadığını bilemez.Client browseri kapatmadığı sürece kendi cookie'si üzerdinde daha önce açtığı session'a ait SessionId değerini saklar ve her postbackte bu değer ile istekte bulunur.Şayet Client browseri kapatırsa, yeniden açtığında eski oturuma ait Cookie olmayacağından herhangi bir SessionId ile istekte bulunmayacağından, Server bunu yeni bir istek olarak değerlendirecek ve bu Client'e ait yeni bir Session açacaktır.Eski session ise timeout süresi dolduğunda, bu süre zarfında o SessionId ile herhangi bir istek gelmeyeceğinden otomatik olarak sonlandırılacaktır.
Peki cookie desteklemeyen browserlarda, veya Client tarafındaki browserin Cookie desteği kullanıcı tarafından kapatılırsa Session ile Client nasıl eşleşecektir?Yukarıda anlattığım üzere oturuma ait SessionId, client tarafındaki browser üzerinde Cookie ile tutulur.İlgili browserin cookie desteği yoksa veya kapatılmışsa Web.Config üzerindeki yapılacak bir kaç satırlık değişiklikten sonra oturuma ait SessionId, URL ile gidip gelecektir. Web.Config içindeki "SessionState" attributine ait "Cookieless" özelliği TRUE yapılırsa, SessionId link(URL) ile Client-Server arasındaki haberleşmeyi sağlayacak ve Server bu yapı sayesinde ilgili kullanıcıya ait Session nesnesini belirleyebilecektir.
<sessionState
...
cookieless="true"
timeout="20"
/>
Session Nasıl Sonlanır?
Session nesnelerinin sonlanması;
- Kullanıcının browser'i (tarayıcı) kapatması
- Session TimeOut süresinin dolması
- Server'in (sunucu) yeniden başlatılması
- Session'ın kapatılmaya zorlanması (kodsal olarak)
gibi durumlarda gerçekleşir.Session nesnelerinin timeout süreleri vardır ve bu süre default olarak 20 dk'dır.Eğer 20 dk içerisinde Client herhangi bir işlem yapmamışsa, hiç bir sayfa gezmemişse, server tarafında istekte bulunacak herhangi bir Postback hareketi oluşturmamışsa oturum sonlanacak, session düşecektir.
Session.timeout = 1; --> dk cinsinden belirlenen süredir.
Oturumun sonlanması sadece session timeout ile değil, kullanıcının browseri kapatmasıyla da gerçekleşir.Kullanıcı şayet tarayıcıyı kapatırsa, server tarafındaki session sonlanır. Web sayfasına giden ilk istekte session yeniden açılır.
Dikkat Edilmesi Gereken Nokta
Session nesnesinin Server üzerinde tutulduğundan bahsetmiştik.Dikkat edilmesi gereken nokta "Load Balancing" kullanan sistemlerde Session eğer In-Proc modda çalışıyorsa, sorun yasanabileceği konusudur. Çünkü Web Garden/Web Farm/Web Pool kullanan yapılarda birden fazla server bulunur ve clientin ilk istek gönderdiği server üzerinde Session nesnesi oluşturulur. Dolayısıyla bir sonraki istekte Load Balancer devreye girip, aşırı yük yoğunluğundan Cliente ait isteği başka bir server'a yönlendirirse bu server üzerinde ilgili SessionId ile bir session nesnesi olmayacağından hata alınır.
Bunun çözümü olarak Load Balancer kullanılan sistemlerde session In-Proc Modda değilde, StateServer veya SqlServer Modda çalıştırılıp session bilgileri değişmeyen başka bir ortamda tutulmalıdır.