Keeping ASP.NET Session Open / Alive Keeping ASP.NET Session Open / Alive asp.net asp.net

Keeping ASP.NET Session Open / Alive


I use JQuery to perform a simple AJAX call to a dummy HTTP Handler that does nothing but keeping my Session alive:

function setHeartbeat() {    setTimeout("heartbeat()", 5*60*1000); // every 5 min}function heartbeat() {    $.get(        "/SessionHeartbeat.ashx",        null,        function(data) {            //$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :)            setHeartbeat();        },        "json"    );}

Session handler can be as simple as:

public class SessionHeartbeatHttpHandler : IHttpHandler, IRequiresSessionState{    public bool IsReusable { get { return false; } }    public void ProcessRequest(HttpContext context)    {        context.Session["Heartbeat"] = DateTime.Now;    }}

The key is to add IRequiresSessionState, otherwise Session won't be available (= null). The handler can of course also return a JSON serialized object if some data should be returned to the calling JavaScript.

Made available through web.config:

<httpHandlers>    <add verb="GET,HEAD" path="SessionHeartbeat.ashx" validate="false" type="SessionHeartbeatHttpHandler"/></httpHandlers>

added from balexandre on August 14th, 2012

I liked so much of this example, that I want to improve with the HTML/CSS and the beat part

change this

//$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :)

into

beatHeart(2); // just a little "red flash" in the corner :)

and add

// beat the heart // 'times' (int): nr of times to beatfunction beatHeart(times) {    var interval = setInterval(function () {        $(".heartbeat").fadeIn(500, function () {            $(".heartbeat").fadeOut(500);        });    }, 1000); // beat every second    // after n times, let's clear the interval (adding 100ms of safe gap)    setTimeout(function () { clearInterval(interval); }, (1000 * times) + 100);}

HTML and CSS

<div class="heartbeat">♥</div>/* HEARBEAT */.heartbeat {    position: absolute;    display: none;    margin: 5px;    color: red;    right: 0;    top: 0;}

here is a live example for only the beating part: http://jsbin.com/ibagob/1/


If you are using ASP.NET MVC – you do not need an additional HTTP handler and some modifications of the web.config file. All you need – just to add some simple action in a Home/Common controller:

[HttpPost]public JsonResult KeepSessionAlive() {    return new JsonResult {Data = "Success"};}

, write a piece of JavaScript code like this one (I have put it in one of site’s JavaScript file):

var keepSessionAlive = false;var keepSessionAliveUrl = null;function SetupSessionUpdater(actionUrl) {    keepSessionAliveUrl = actionUrl;    var container = $("#body");    container.mousemove(function () { keepSessionAlive = true; });    container.keydown(function () { keepSessionAlive = true; });    CheckToKeepSessionAlive();}function CheckToKeepSessionAlive() {    setTimeout("KeepSessionAlive()", 5*60*1000);}function KeepSessionAlive() {    if (keepSessionAlive && keepSessionAliveUrl != null) {        $.ajax({            type: "POST",            url: keepSessionAliveUrl,            success: function () { keepSessionAlive = false; }        });    }    CheckToKeepSessionAlive();}

, and initialize this functionality by calling a JavaScript function:

SetupSessionUpdater('/Home/KeepSessionAlive');

Please note! I have implemented this functionality only for authorized users (there is no reason to keep session state for guests in most cases) and decision to keep session state active is not only based on – is browser open or not, but authorized user must do some activity on the site (move a mouse or type some key).


Whenever you make a request to the server the session timeout resets. So you can just make an ajax call to an empty HTTP handler on the server, but make sure the handler's cache is disabled, otherwise the browser will cache your handler and won't make a new request.

KeepSessionAlive.ashx.cs

public class KeepSessionAlive : IHttpHandler, IRequiresSessionState    {        public void ProcessRequest(HttpContext context)        {            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);            context.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));            context.Response.Cache.SetNoStore();            context.Response.Cache.SetNoServerCaching();        }    }

.JS:

window.onload = function () {        setInterval("KeepSessionAlive()", 60000)} function KeepSessionAlive() { url = "/KeepSessionAlive.ashx?";        var xmlHttp = new XMLHttpRequest();        xmlHttp.open("GET", url, true);        xmlHttp.send();        }

@veggerby - There is no need for the overhead of storing variables in the session. Just preforming a request to the server is enough.