代码之家  ›  专栏  ›  技术社区  ›  Rod

保持跟踪谁在网站上现在

  •  5
  • Rod  · 技术社区  · 15 年前

    我如何在我的网站上记录当前会话的数量?

    5 回复  |  直到 15 年前
        1
  •  2
  •   cHao    15 年前

    如果你只想知道是谁在浏览一个不起眼的丁克网站上的页面,一种方法是在应用程序范围内(或静态)列出最新的请求,以及请求的日期/时间。每当有人请求一个页面时,删除所有“旧”点击(超过X分钟),并附加(或更新)访客信息,日期/时间为现在,

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

    不管是哪种方式,要查看谁是“活跃的”,您需要浏览数据并找到上次访问时间不到X分钟的所有访问/用户,其中X是您认为合适的数字。20-60分钟通常就足够了。

        2
  •  0
  •   Eric Finn    15 年前

        3
  •  0
  •   Jemes    15 年前

    当用户第一次访问站点时,Session\u Start将向GlobalList添加一个条目。这将确保每个唯一的用户都能获得自己的条目(也可以处理恼怒的mous)。如果您愿意,一旦用户登录,您就可以更新GlobalList来设置用户信息(名称、ID等等)。

    接下来,让应用程序启动一个后台线程,该线程遍历全局列表并删除所有过期的项(基于您设置的阈值,LastRequestTime StartTime的时间跨度)。

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

        4
  •  0
  •   Daniel Dyson    15 年前

    会话StateStoreProvider : 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设置为当前日期时间减去站点上的会话超时。

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

    这将包括那些访问过您的站点然后直接离开的用户,但是无法判断他们是否还在,除非您的页面上有一个脚本,该脚本定期向服务器发送aJAX调用,说服务器仍然处于打开状态。我建议不要这样做,因为这样会增加流量,而且会浪费资源而没有实际收益。

        5
  •  0
  •   Chris Marisic    15 年前

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

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

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