ibcadmin 发表于 2015-7-16 10:22:27

ASP.NET在线会员实时显示统计

【转载,这篇教程实现方法并不是很好,而且说的是登录和注销统计用户,并不是访问页面就统计,而且一般人登录网站后是不会点击注销的,会直接关闭页面,这时候会牵扯到发送心跳包,不过这就复杂了,之所以转载这篇帖子,是给小网站及初学者看的】
在最近的学习中,参考其他资源,做了一个简单的在线人员显示的功能,总结了一下,思路如下:

1、定义一个全局的内存来作为在线人员列表

2、通过实时判断用户Session值,来判断某个用户的登录或离线

3、对于用户的上线和离线,通过添加用户到内存中,或删除内存中的用户列表中的用户来实现

下面是实现该功能的类:

public static class UserOnline
{
    /// <summary>
    /// 获取或设置在线列表
    /// </summary>
    public static Hashtable OnlineUserList
    {
      get
      {
            if (HttpContext.Current.Application["OnlineUserList"] == null)
            {
                Hashtable onlineUserList = new Hashtable();
                HttpContext.Current.Application["OnlineUserList"] = onlineUserList;
            }

            return (Hashtable)HttpContext.Current.Application["OnlineUserList"];
      }
      set
      {
            HttpContext.Current.Application["OnlineUserList"] = value;
      }
    }

    /// <summary>
    /// 添加在线成员
    /// </summary>
    public static bool OnlineUserList_Add(string key, string value)
    {
      try
      {
            if (OnlineUserList.Contains(key))
                OnlineUserList = value;
            else
                OnlineUserList.Add(key, value);
            return true;
      }
      catch
      {
            return false;
      }
    }

    /// <summary>
    /// 添加在线成员
    /// </summary>
    public static bool OnlineUserList_Add(string key)
    {
      string value = DateTime.Now.ToString();
      return OnlineUserList_Add(key, value);
    }

    /// <summary>
    /// 离线删除用户
    /// </summary>
    public static bool OnlineUserList_Delete(string key)
    {
      bool re = false;
      if (OnlineUserList.Contains(key))
      {
            Hashtable userList = OnlineUserList;
            userList.Remove(key);
            OnlineUserList = userList;
            return true;
      }
      return re;
    }

    /// <summary>
    /// 判断用户是否在线
    /// </summary>
    public static bool UserIsOnline(string adminName)
    {
      OnlineClearUserOutTimeInOnLineList();
      return OnlineUserList.Contains(adminName) ? true : false;
    }

    /// <summary>
    /// 删除超时在线用户
    /// </summary>
    public static void OnlineClearUserOutTimeInOnLineList()
    {
      int OnlineTimeOut = 20;
      Hashtable list = new Hashtable();
      Hashtable temList = new Hashtable();
      list = OnlineUserList;
      temList = new Hashtable(list);
      foreach (DictionaryEntry de in temList)
      {
            //删除超时
            DateTime onlineTime = Convert.ToDateTime(de.Value);
            TimeSpan timeSpan = DateTime.Now - onlineTime;

            //在线时间和当前时间间隔大于超时分钟数就删除(注:用户非法关闭浏览器)
            if (timeSpan.TotalMinutes >= (double)OnlineTimeOut)
            {
                list.Remove(de.Key);
            }

      }

      OnlineUserList = list;
    }

}


在用户登录成功的时候,添加改用户的惟一值到内存列表中

该用户的Session结束前进行删除即可。

卖烤地瓜的 发表于 2015-7-16 10:25:07

沙发{:3_41:}

wlqxm 发表于 2015-7-16 10:27:17

火前留名。。。
页: [1]
查看完整版本: ASP.NET在线会员实时显示统计