Determining an 'active' user count of an ASP.NET site

后端 未结 9 2072
南旧
南旧 2021-01-01 01:36

On an ASP.NET site, what are some techniques that could be used to track how many users are logged in to the site at any given point in time?

So for example, I could

相关标签:
9条回答
  • 2021-01-01 02:05

    First set Session timeout for 1 minute.

    Create a simple heartbeat.aspx page with no HTML content just the following javascript code:

    <html>
      <head>
      <script language="javascript">
      function reloadPage()
      {
        window.navigate("heartbeat.aspx");
      }
      </script>
      </head>
    <body onload="window. setTimeout(‘reloadPage()’, 30000)">
    </body>
    </html>
    

    This will re-request itself every 30 seconds and keep session alive.

    Put heatbeat.aspx page in a hidden frame.

    To get user count just get session count by using static counter in Session_Start and Session_End events in Global.asax.

    0 讨论(0)
  • 2021-01-01 02:09

    If you are using InProc session state, you can do it like this in global.asax

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        Application("ActiveSessionCount") = 0
    End Sub
    
    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
        Application("ActiveSessionCount") += 1
    End Sub
    
    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
        Application("ActiveSessionCount") -= 1
    End Sub
    

    To access the value on a web form is just as simple

    Dim Count as Integer = Application("ActiveSessionCount")
    
    0 讨论(0)
  • 2021-01-01 02:09
    public class ActiveUsers
    {
        private static List<LastUserActivity> users;
        private static object syncroot = new object();
        private static DateTime lastPruned;
    
        public static int SessionLength = 20;
    
        static ActiveUsers()
        {
            users = new List<LastUserActivity>();
            lastPruned = DateTime.UtcNow;
        }
    
        public void RecordUserActivity(int userId)
        {
            lock (syncroot)
            {
                var user = users.FirstOrDefault(x => x.UserId == userId);
                if (user == null)
                {
                    user = new LastUserActivity() { UserId = userId };
                    users.Add(user);
                }
                user.UtcTime = DateTime.UtcNow;
    
                if (lastPruned.AddMinutes(5) < DateTime.UtcNow)
                {
                    Prune();
                    lastPruned = DateTime.UtcNow;
                }
            }
        }
    
        private static void Prune()
        {
            users.RemoveAll(x => x.UtcTime.AddMinutes(SessionLength) < DateTime.UtcNow);
        }
    
        public int GetActiveUsers()
        {
            return users.Count;
        }
    }
    public class LastUserActivity
    {
        public int UserId { get; set; }
        public DateTime UtcTime { get; set; }
    }
    

    Add a call to ActiveUsers into a method in global.asax (eg. BeginRequest, AcquireRequestState).

    0 讨论(0)
  • 2021-01-01 02:12

    I think what I've used in the past was the Global.asax functions mainly centering around the Session_Start and Session_End, increasing a count with the Start, and then the end is a bit tricky because of the session timeout. If you are not concerned a lot with how exactly accurate the count is then you can stop here.

    If not then you'd probably use a combination of the javascript onUnload event with some sort of ajax request to invalidate the session and subtract the user. The event would have to see if the user was actually leaving the page or just going to another page on the site.

    Anyway, start there. I remember having to do with ASP sites so there is definately some information out there on this method.

    0 讨论(0)
  • 2021-01-01 02:13

    If using SQL Server for Session storage (i.e. <sessionState> mode is "SQLServer" in web.config), you can't use a solution that relies on Session_End in global.asax, as the method will never be called.

    However, assuming that SQL Agent is running the DeleteExpiredSessions job correctly (which it should be by default when SQL State was installed), you can just run the following SQL against the Session Db:

    SELECT COUNT(SessionId) FROM ASPStateTempSessions
    
    0 讨论(0)
  • 2021-01-01 02:14

    Does the website log the user in? If it does, then you can update a "Last Visit" field in the user table every time they request a new page, and then every hour, just do a SQL query that grabs everybody who has a "Last Visit" timestamp within the last 15 minutes or so (assumed to currently be on the site).

    If you're not having people log in, you could just as easily do it by IP address instead of username. With this method, though, you may run into some proxy issues (ie multiple users from the same corporate network may all come from a single IP address, so they only count as one user in your totals), but that should be minimal.

    0 讨论(0)
提交回复
热议问题