Session`ın zaman aşımına girmesini engelleme
Bildiğiniz üzere, sitemizi ziyaret eden her kullanıcı için bir Session (Oturum) açılır.
Bu session bilgisi, eğer kullanıcı yeni bir sayfayı ziyaret etmezse belirli bir süre sonunda sona erer (timeout).
Bildiğiniz üzere, sitemizi ziyaret eden her kullanıcı için bir Session (Oturum) açılır. Bu session bilgisi, eğer kullanıcı yeni bir sayfayı ziyaret etmezse belirli bir süre sonunda sona erer (timeout).
Biz bu timeout süresini web.config içerisinden ayarlayabiliriz:
<configuration>
<system.web>
<sessionState timeout="20"></sessionState>
</system.web>
</configuration>
Ancak, bazı durumlarda kullanıcının tarayıcı penceresini kendisi kapatmadan oturumun sona ermemesini isteyebiliriz. (Daha teknik bir ifadeyle, session'ın timeout'a düşmesini istemeyebiliriz.)
Bu durumda yapmamız gereken şey; belirli bir periyotla server bazlı kodumuzu çağıran (.aspx ya da .ashx) çağıran ufak bir javascript kodu eklemek.
Server bazlı kodumuz çağrıldığında session timeout sayacı sıfırlanır. Dolayısıyla session ımız hiç timeout a düşmez.
JS kodu:
<script type="text/javascript"> function KeepSessionAlive(){ var rand = Math.floor((Math.random() * 100000000000) + 1); console.log('OK'); var img = new Image(1,1); img.src = '/includes/KeepSessionAlive.aspx?' + rand; } window.setInterval(KeepSessionAlive,10000); </script>
Kodumuz her 10 sn de bir defa KeepSessionAlive adlı metodu çağırıyor. KeepSessionAlive metodunda ise hayali bir Image nesnesi oluşturulup resim kaynağı olarak bir .aspx dosyasını atıyoruz.
.aspx dosyasında ise şu kodları kullanabilirsiniz:
protected void Page_Load(object sender, EventArgs e) { Response.ExpiresAbsolute = DateTime.Now.AddDays(-1.0); Response.Expires = -1; Response.CacheControl = "no-cache"; Header.Controls.Add(new HtmlMeta { Name = "Cache-Control", Content = "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0, timeout=0, max=993" }); Header.Controls.Add(new HtmlMeta { Name = "Pragma", Content = "no-cache" }); Header.Controls.Add(new HtmlMeta { Name = "Expires", Content = DateTime.Now.AddMonths(-1).ToString("R") }); Response.Cache.SetAllowResponseInBrowserHistory(false); Response.Cache.SetExpires(DateTime.Now.AddDays(-1.0)); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); }
Tabii siteye giren kullanıcı sayısı kadar server hafızasında yer işgali olacaktır. Dikkatli kullanmak lazım :)
Herkese iyi kodlamalar.
#session #timeout