Musielak Marek

Posted on Friday, February 27, 2009 by Marek Musielak

EPiServer online users list

Working with the application which is edited by dozens of people makes the application harder to maintain. Have you ever thought about the people that are doing their job editing the site before you start deploy the new version of the application? I hadn't used to... until I got a lot of complaints from editors that lost their job. "I wanted to save what I'd wrote but I got 'service unavailable' message instead" they repined.

It made me look for the solution for this problem. Sure, I could do the new builds during the nights but what if the site is hosted by external company and you don't have access to the servers? You won't be able to force anyone from that company to stay in the office over night just to deploy the new version of the site.

The other solution would be to send emails to all editors saying that server will be restarted so they can can save all their work. This idea has only only small drawback - it assumes that editors check their emails frequently. I've already spent enough time maintaining sites to know that it barely happens.

Finally I found a solution that works fine for me. I use System.Web.Security.Membership to get all users that are logged in and deploy the new builds when no one but me is editing the site.

So lets go step by step with this solution. Firstly I created the web page that would be used to diplay active users. I put the repater on it:
<asp:Repeater ID="rptUsers" runat="server">
<td><%# ((MembershipUser)Container.DataItem).UserName %></td>
<td><%# ((MembershipUser)Container.DataItem).LastActivityDate.ToString("HH:mm:ss")%></td>

and overrode OnLoad method:
public partial class OnlineUsers : SimplePage
private static DateTime applicationStartTime;

public static DateTime ApplicationStartTime
set { applicationStartTime = value; }

protected override void OnLoad(EventArgs e)
if (!User.Identity.IsAuthenticated)

List<MembershipUser> users = new List<MembershipUser>();

foreach (MembershipUser user in Membership.GetAllUsers())
if (user.IsOnline && user.LastActivityDate > applicationStartTime)

users.Sort(delegate(MembershipUser u1, MembershipUser u2)
{ return u2.LastActivityDate.CompareTo(u1.LastActivityDate); });

rptUsers.DataSource = users;


On the beginning I though it would be enough to check MembershipUser.IsOnline property, but it turned out that when application is started all users are treated as online, cause MembershipUser.LastActivityDate is set to the time when application started. That's why I added applicationStartTime field that I set in Global.asax.cs file in Application_Start method and compare it with LastActivityDate property:
public class Global : EPiServer.Global
protected void Application_Start(Object sender, EventArgs e)
OnlineUsers.ApplicationStartTime = DateTime.Now;

And that's all. I can check whether my build would interrupt anyone's work. Remember, a happy customer is your walking advertisement. Lets try not to upset them unnecessarily ;)

Source code can be downloaded from here: source code

Shout it
Read More »

Related Posts:

2 Responses to EPiServer online users list

  1. stu dean
    March 16, 2009 at 4:37 PM
    Nice post Maras and definately something we should all be thinking about i.e. making our customers life better..

    Something along the same lines might be a message banner in the CMS letting editors know when the planned update is so not relying on them reading emails.. I guess this would need to update asynchronously so the guy in the rich text editor who hasn't refreshed the page still gets the message :)
  2. Oliver Southgate
    June 16, 2009 at 9:41 AM
    Very interesting post, I think this is something epiServer should look to build into a future release.

    a) Realtime notification within the system
    b) Planned editing outages, so you can plan deployments

Post a Comment