Reputation: 927
I'm to create a website for which I need to count the online users and show it on the home page all the time. I'm not interested to apply ready-to-use modules for it. Here is what I have already done:
Adding a Global.asax file to my project
Writing the following code snippet in the Global.asax file:
void Application_Start(object sender, EventArgs e)
{
Application["OnlineUsers"] = 0;
}
void Session_Start(object sender, EventArgs e)
{
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
Application.UnLock();
}
Actually it works fine but I have found the following bug: --> Even if the user close the browser, the real count of online users is not shown since the session timeout is still alive!
Is there any solution but changing the session timeout interval?
Upvotes: 4
Views: 8288
Reputation: 20693
You could use onUserExit jQuery plugin to call some server side code and abandon the session. Activate onUserExit on document ready :
<script type="text/javascript">
jQuery(document).ready(function () {
jQuery().onUserExit({
execute: function () {
jQuery.ajax({
url: '/EndSession.ashx', async: false
});
},
internalURLs: 'www.yourdomain.com|yourdomain.com'
});
});
</script>
And in EndSession.ashx abandon the session and server side Session_End will be called :
public void ProcessRequest(HttpContext context)
{
context.Session.Abandon();
context.Response.ContentType = "text/plain";
context.Response.Write("My session abandoned !");
}
note that this will not cover all cases (for example if user kills browser trough task manager).
Upvotes: 3
Reputation: 77866
It's the limitation of this approach that server will think user is logged in unless the session ends actually; which will happen only when the number of minutes has passed as specified in the session timeout configuration.
Check this post: http://forums.asp.net/t/1283350.aspx
Found this Online-active-users-counter-in-ASP-NET
Upvotes: 0
Reputation: 39284
The Session_End event fires when the server-side session times out, which is (default) 20 minutes after the last request has been served. The server does NOT know when the user "navigates away" or "closes the browser", so can't act on that.
Upvotes: 3