Sunday, February 22, 2009

HowTo Get Current Online Users Count and Infos with ASP.NET

Today I'll talking about getting current online users count and informations about them using ASP.NET and HttpModule.

Here is our OnlineUserInfo class
public class OnlineUserInfo
{
public String UserAgent { get; set; }
public String SessionId { get; set; }
public String IPAddress { get; set; }
public String UrlReferrer { get; set; }
public DateTime SessionStarted { get; set; }
public IPrincipal CurrentUser { get; set; }

public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("UserAgent = {0} | ", UserAgent);
sb.AppendFormat("SessionId = {0} | ", SessionId);
sb.AppendFormat("IPAddress = {0} | ", IPAddress);
sb.AppendFormat("UrlReferrer = {0} | ", UrlReferrer);
sb.AppendFormat("SessionStarted = {0}", SessionStarted);
return sb.ToString();
}
}


Here is our OnlineUserHttpModule

public class OnlineUsersModule : IHttpModule
{
private static Int32 _sessionTimeOut = 20; // Set Default to 20 Minutes
private static List _onlineUsers = null;

public static List OnlineUsers
{
get
{
CleanExpiredSessions();
return _onlineUsers;
}
}

private static void CleanExpiredSessions()
{
_onlineUsers.RemoveAll(delegate(OnlineUserInfo user)
{
return user.SessionStarted.AddMinutes(_sessionTimeOut) < _onlineusers =" new">();

// Get the Current Session State Module
SessionStateModule module = context.Modules["Session"] as SessionStateModule;

module.Start += new EventHandler(Session_Start);
}

private void Session_Start(object sender, EventArgs e)
{
HttpRequest Request = HttpContext.Current.Request;
HttpApplicationState Application = HttpContext.Current.Application;
HttpSessionState Session = HttpContext.Current.Session;

// Get Session TimeOut
_sessionTimeOut = HttpContext.Current.Session.Timeout;

Application.Lock();

OnlineUserInfo user = new OnlineUserInfo();

user.SessionId = Session.SessionID;
user.SessionStarted = DateTime.Now;
user.UserAgent = !String.IsNullOrEmpty(Request.UserAgent)
? Request.UserAgent : String.Empty;
user.IPAddress = !String.IsNullOrEmpty(Request.UserHostAddress)
? Request.UserHostAddress : String.Empty;
if (Request.UrlReferrer != null)
{
user.UrlReferrer = !String.IsNullOrEmpty(Request.UrlReferrer.OriginalString)
? Request.UrlReferrer.OriginalString : String.Empty;
}
else
{
user.UrlReferrer = String.Empty;
}
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
user.CurrentUser = HttpContext.Current.User;
}

// Add the New User to Collection
_onlineUsers.Add(user);
Application.UnLock();
}

public void Dispose()
{
}

#endregion
}


Here is a sample of Getting Informations using this HttpModule.
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(OnlineUsersModule.OnlineUsers.Count);

foreach (OnlineUserInfo user in OnlineUsersModule.OnlineUsers)
{
Response.Write(user.ToString());
}
}
}


Download Solution - OnlineUserInfos.zip

More

1 comment:

  1. Performance module for 4500 users in a web ?

    Sessions in SQL Server

    ReplyDelete