确定';主动';ASP.NET站点的用户计数

确定';主动';ASP.NET站点的用户计数,asp.net,statistics,web-traffic,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 3

在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成员资格提供程序,它使用一种基于本地/黑客会话的方法来确定用户是否处于“登录”状态。

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

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

编辑 正如您所知,SQLASP成员资格提供程序通过在数据库中的字段上记录活动日期来实现这一点。当您在x分钟内查询所有活动时,它将被删除


我添加了一个客户端轮询功能,它每2分钟访问一次我们的服务器,所以当用户坐在页面上时,我知道他们在那里,即使没有活动。这也让我强迫用户离开系统,提供了一种传递其他系统消息的方法。有点不错

该网站是否让用户登录?如果是这样,那么您可以在用户每次请求新页面时更新用户表中的“Last Visit”字段,然后每小时执行一次SQL查询,获取在过去15分钟左右(假设当前在站点上)内具有“Last Visit”时间戳的所有人


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

我认为我过去使用的是Global.asax函数,主要围绕会话开始和会话结束,随着开始增加计数,然后由于会话超时,结束有点棘手。如果你不太关心计数的准确程度,那么你可以到此为止

如果不是这样,那么您可能会使用javascript onUnload事件与某种ajax请求的组合来使会话无效并减去用户。事件将必须查看用户是否真的离开了该页面,或者只是转到站点上的另一个页面


不管怎样,从那里开始。我记得我必须使用ASP站点,因此肯定有一些关于此方法的信息。

在ASP.NET性能对象中有活动会话的性能监视器统计信息,您可以跟踪所有实例或单个应用程序。您可以通过管理工具访问这些统计信息→ 性能,或通过WMI编程

获取此类计数器总数的非常基本的PowerShell脚本:

(Get-WmiObject Win32_PerfRawData_ASPNET_ASPNETApplications SessionsActive).SessionsActive

筛选器应该能够获取特定站点的状态。

第一次设置会话超时1分钟

创建一个没有HTML内容的简单heartbeat.aspx页面,只需使用以下javascript代码:

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

函数重载页面()
{
导航(“heartbeat.aspx”);
}
这将每30秒重新请求一次,并使会话保持活动状态

将heatbeat.aspx页面置于隐藏框中


要获取用户计数,只需在Global.asax中的session\u Start和session\u End事件中使用静态计数器即可获取会话计数。

如果您使用的是InProc session state,可以在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
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();
        }
访问web表单上的值也很简单

Dim Count as Integer = Application("ActiveSessionCount")

如果将SQL Server用于会话存储(即web.config中的
模式为“SQLServer”),则不能使用依赖于global.asax中的
会话结束的解决方案,因为该方法永远不会被调用

但是,假设SQL代理正在正确运行DeleteExpiredSessions作业(安装SQL状态时默认为该作业),则可以针对会话数据库运行以下SQL:

SELECT COUNT(SessionId) FROM ASPStateTempSessions
公共类ActiveUsers
{
私有静态列表用户;
私有静态对象syncroot=新对象();
私有静态日期时间最后修剪;
公共静态int会话长度=20;
静态ActiveUsers()
{
用户=新列表();
lastPruned=DateTime.UtcNow;
}
public void RecordUserActivity(int userId)
{
锁定(同步根)
{
var user=users.FirstOrDefault(x=>x.UserId==UserId);
if(user==null)
{
user=new LastUserActivity(){UserId=UserId};
用户。添加(用户);
}
user.UtcTime=DateTime.UtcNow;
if(lastPruned.AddMinutes(5)x.UtcTime.AddMinutes(SessionLength)
将对
ActiveUsers
的调用添加到
global.asax
中的方法中(例如BeginRequest、AcquisiteRequestState)。

在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
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();
        }

在您想要的页面上获取应用程序[“SessionCount”]

,如果该网站面向公众,则会有AOL和军方等大型代理。添加“上次访问”字段并经常更新该字段可能是我们在该项目中最终采用的方法。谢谢你的邀请