2010-08-13 114 views
5

我将如何跟踪我网站上当前会话的数量?现在跟踪谁在网站上

+5

部分取决于您对活动的定义。我们可能正在讨论当前会话次数,或上个月登录或X-days内实际贡献者。请提供更多关于您想要衡量的内容的信息。 – kbrimington 2010-08-13 14:27:12

回答

2

如果你只是想知道谁在通过一个小小的rinky-dink网站上的页面进行查看,一种方法是拥有最新请求的应用程序范围(或静态)列表以及请求的日期/时间。每当有人请求一个页面时,删除所有“旧”点击(大于X分钟),并附加(或更新)访问者的信息,现在的日期/时间,

请注意,对于真正繁忙的网站,这可能是一个坏主意。一个更具可扩展性的解决方案是在用户表中创建一个“上次访问”列,并在用户请求页面时进行更新。但是这对跟踪匿名/未登录的用户无效。无论哪种方式,要查看谁是“活跃”,可以浏览数据并找到上次访问时间少于X分钟前的所有访问/用户,其中X是您认为合适的某个数字。 20-60分钟通常足够好。

0

一个非常简单的方法是跟踪每个用户的最后一次活动。经过一段时间没有活动,你说这个用户不再活跃。

0

一种简单的方法是编写一个小的http模块(或者甚至利用global.asax)来管理何时创建会话,何时会话结束以更新所有当前活动用户的集合或数据库表以及当会话结束时删除记录。

RE:会话结束后,你仍可以正常访问会话本身或从任何发件人财产或财产EventArgs的最起码的会话标识符。这将为您提供一种使用会话标识符将asp.net会话关联到用户的简单方法。您可以通过在调试中启动应用程序并在即时窗口中执行Session.Abandon()轻松地进行测试。以编程方式触发此事件,以便您可以使用可以调试的实时代码来查看它。

注意我并不是100%确定使用sender/args,但是你应该能够直接在global.asax SessionEnd中访问会话本身,只要这样做。Session仍然可用(确保不使用HttpContext.Current.Session,因为上下文不存在)。

+0

试过了,它不能很好地工作。当会话以超时结束时,会话结束后您将获得会话结束事件,因此您不知道哪个会话结束。 – 2010-08-13 15:39:08

0

有一两件事你可以做的是实现自己的SessionStateStoreProviderhttp://msdn.microsoft.com/en-us/library/ms178587.aspx

在你执行的GetItem的,你会更新自己的当前会话数据,并在您的removeItem实现集合,你可以访问ASP .NET会话数据,因此您可以在以常规方式删除ASP.NET会话之前从您的集合中删除该项目。您可以查询您的集合以查看当前活动的会话。

RemoveItem

或者:

Create Procedure dbo.GetCurrentUsers 
@ActiveSince DateTime 
AS 
    SELECT U.UserId, U.UserName, M.Email 
    FROM aspnet_Users U 
    INNER JOIN aspnet_membership M ON M.UserId = U.UserId 
    WHERE U.LastActivityDate > @ActiveSince 
GO 

你会设置:

如果您使用的是ASP.NET成员资格提供,你可以沿着东西线查询数据库@ActiveSince是当前的DateTime减去您的网站上的会话超时。

var sessionState = (System.Web.Configuration.SessionStateSection) 
       ConfigurationManager.GetSection("system.web/sessionState"); 
DateTime activeSince = DateTime.Now.AddMinutes(0 - sessionState.Timeout.TotalMinutes); 

这将包括谁拥有了你的网站,然后用户留下直线距离,但没有告诉他们是否仍然存在,除非你有你的网页上的脚本,定期发送Ajax调用的方式到服务器说它仍然是开放的。我会建议不要这样做,因为它会增加流量,并且浪费资源而没有真正的收益。

0

我会在Global.asax中处理这个问题。将Session_Start添加到包含要跟踪的数据的应用程序全局列表(即User,SessionId,StartTime,LastRequestTime)。

当用户第一次访问该站点时,Session_Start将向GlobalList添加一个条目。这将确保每个独特的用户都获得它自己的条目(处理令人讨厌)。如果你愿意,一旦用户登录,你可以更新GlobalList来设置用户信息(姓名,ID等等)。

接下来,让Application_Start启动一个后台线程,通过全局列表并删除任何过期的项目(根据您设置的任何阈值,LastRequestTime-StartTime的TimeSpan)。

如果你想在WebFarm场景中部署它,那么你必须将列表移动到你的数据库。