现在跟踪谁在网站上

时间:2010-08-13 14:23:11

标签: asp.net asp.net-mvc

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

5 个答案:

答案 0 :(得分:2)

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

注意,对于一个非常繁忙的网站,这可能是一个坏主意。一个更具伸缩性的解决方案是在用户表中有一个“上次访问”列,并在用户请求页面时更新。但这对跟踪匿名/未登录用户没有帮助。

无论哪种方式,要查看谁“活跃”,您都会浏览数据并查找所有访问次数/用户的最后访问时间少于X分钟前,其中X是您觉得合适的数字。 20-60分钟通常足够好。

答案 1 :(得分:0)

一种非常简单的方法是跟踪每个用户的上一个活动。在没有活动一段时间后,您说该用户不再有效。

答案 2 :(得分:0)

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

RE:当会话结束时,您仍然应该访问会话本身或至少访问来自sender属性或eventargs属性的会话标识符。这将为您提供一种通过使用会话标识符将asp.net会话与用户相关联的简便方法。您可以通过在调试中启动应用程序并在即时窗口中轻松测试这一点.Doad.Abandon();以编程方式触发此事件,以查看可以调试的实时代码。

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

答案 3 :(得分:0)

您可以做的一件事是实现自己的 SessionStateStoreProvider http://msdn.microsoft.com/en-us/library/ms178587.aspx

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

RemoveItem

可替换地:

如果您使用的是 ASP.NET成员资格提供程序,则可以使用以下内容查询数据库:

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

您可以将@ActiveSince设置为当前DateTime减去您网站上的会话超时。

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

这将包括已访问您网站然后立即离开的用户,但无法确定他们是否仍在那里,除非您的网页上有一个脚本定期向服务器发送aJAX调用说它仍然是开放的。我建议不要这样做,因为它会增加流量,而且浪费资源而没有真正的收益。

答案 4 :(得分:0)

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

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

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

如果要在WebFarm场景中部署它,则必须将列表移动到数据库中。