确定ASP.NET站点的“活动”用户数

时间:2009-03-26 14:12:57

标签: asp.net statistics web-traffic

在ASP.NET网站上,有哪些技术可用于跟踪在任何给定时间点登录到网站的用户数量?

例如,我可以生成一个显示如下内容的报告:

        10:00am  11:00am  12:00pm  1:00pm  2:00pm ....
 3/25      25      32       45      40      37
 3/26      31      38       50      57      40
 3/27      28      37       46      35      20
 etc. 

编辑:不,我们没有使用ASP.NET成员资格提供程序,它使用基于本地/ hacky会话的方法来确定用户是否处于“登录”状态。

9 个答案:

答案 0 :(得分:8)

网站是否将用户登录?如果是,那么您可以在每次请求新页面时更新用户表中的“上次访问”字段,然后每小时更新一次SQL查询,该查询可以抓取在最后一个内容中具有“上次访问”时间戳的所有人15分钟左右(假设目前在网站上)。

如果您没有人登录,您可以通过IP地址而不是用户名轻松地进行操作。但是,使用此方法,您可能会遇到一些代理问题(即来自同一公司网络的多个用户可能都来自单个IP地址,因此它们只计算为总计中的一个用户),但这应该是最小的。 / p>

答案 1 :(得分:3)

这取决于您的网站。如果您使用ASP.Net成员资格提供程序,则有一种方法:Membership.GetNumberOfUsersOnline(),它可以告诉您有多少登录用户。我相信还有性能指标。登录用户的概念是指在x可配置的最后x分钟内执行某些操作的用户。

如果您想了解有多少活动,您还可以使用效果计数器来跟踪传入的请求。

修改

您知道SQL ASP成员资格提供程序通过在数据库中的字段上记录活动日期来实现此目的。它只是在x分钟内查询所有活动。

我添加了一个客户端轮询功能,它每隔2分钟就会到达我们的服务器,所以当用户坐在页面上时,我知道即使没有活动,他们也在那里。这也让我强迫用户退出系统,提供一种方法传递其他系统消息。真好。

答案 2 :(得分:2)

如果使用SQL Server进行会话存储(即<sessionState>模式是web.config中的“SQLServer”),则无法在 global.asax中使用依赖Session_End的解决方案,因为永远不会调用该方法。

但是,假设 SQL代理正确运行 DeleteExpiredSessions 作业(默认情况下应该在安装SQL状态时运行),您只需运行以下SQL反对会议Db:

SELECT COUNT(SessionId) FROM ASPStateTempSessions

答案 3 :(得分:1)

我认为我过去使用的是Global.asax函数,主要围绕Session_Start和Session_End,使用Start增加计数,然后由于会话超时而结束有点棘手。如果您对计算的准确程度并不十分关注,那么您可以在这里停下来。

如果没有,那么你可能会使用javascript onUnload事件与某种ajax请求的组合来使会话无效并减去用户。该事件必须查看用户是否实际离开了该页面,或者只是访问该网站上的另一个页面。

无论如何,从那里开始。我记得与ASP站点有关,因此肯定有一些关于这种方法的信息。

答案 4 :(得分:1)

ASP.NET性能对象中有 Sessions Active 性能监视器统计信息,您可以跟踪所有实例或单个应用程序。您可以通过管理工具效果或通过 WMI 以编程方式访问这些统计信息。

一个非常基本的PowerShell脚本,可以获得这样的计数器:

(Get-WmiObject Win32_PerfRawData_ASPNET_ASPNETApplications SessionsActive).SessionsActive

过滤器应该能够获取特定网站的统计信息。

答案 5 :(得分:1)

On Global.asax

protected void Application_Start(object sender, EventArgs e)
        {
            Application["SessionCount"] = 0;
        }

        protected void Session_Start(object sender, EventArgs e)
        {
            Application.Lock();
            Application["SessionCount"] = Convert.ToInt32(Application["SessionCount"]) + 1;
            Application.UnLock();
        }

        protected void Session_End(object sender, EventArgs e)
        {
            Application.Lock();
            Application["SessionCount"] = Convert.ToInt32(Application["SessionCount"]) - 1;
            Application.UnLock();
        }

在您想要的页面上获取应用程序[&#34; SessionCount&#34;]

答案 6 :(得分:0)

首先将会话超时设置为1分钟。

创建一个简单的heartbeat.aspx页面,其中没有HTML内容,仅包含以下javascript代码:

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

这将每30秒重新请求一次,并使会话保持活动状态。

将heatbeat.aspx页面放在隐藏的框架中。

要获取用户数,只需使用Session.Start中的静态计数器和Global.asax中的Session_End事件来获取会话数。

答案 7 :(得分:0)

如果您正在使用InProc会话状态,则可以在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

要访问网络表单上的值就是这么简单

Dim Count as Integer = Application("ActiveSessionCount")

答案 8 :(得分:0)

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; }
}

ActiveUsers的调用添加到global.asax中的方法中(例如,BeginRequest,AcquireRequestState)。