/// 说明
    /// CUser:用户信息类,字段包括UserID、Username、以及其他一些个人信息
    /// COnlineInfo:在线信息类,字段包括:用户ID、会话ID、登入IP、登入时间
    /// COnlineEvent:用户登入登出记录,包括字段:用户ID、会话ID、登入IP、登入时间、登出时间、在线时长(单位:分钟)
    /// 以上为下面代码中用到的一些实体类
    /// <summary>
    /// 用户在线情况管理
    /// </summary>
    public static class OnlineManager
    {
        /// <summary>
        /// SessionID对应的在线信息
        /// </summary>
        private static Dictionary<string, COnlineInfo> _OnlineInfos = new Dictionary<string, COnlineInfo>();        /// <summary>
        /// 用户对应的SessionID
        /// </summary>
        private static Dictionary<string, string> _UserSessions = new Dictionary<string, string>();        private static string _Key = "UserID";
        
        //当服务重启以后把数据库里记录用户在线的信息读取出来
        //可以避免服务重启以后用户需要重新登陆
        internal static void Start()
        {
            List<COnlineInfo> onlineInfos = DAL.Account.Account.GetAllOnlineInfos();
            if (onlineInfos != null)
            {
                foreach (COnlineInfo onlineInfo in onlineInfos)
                {
                    _OnlineInfos.Add(onlineInfo.SessionID, onlineInfo);
                    _UserSessions.Add(onlineInfo.UserID, onlineInfo.SessionID);
                }
            }
        }        internal static void Stop()
        {
        }        /// <summary>
        /// 登入
        /// </summary>
        /// <param name="user"></param>
        public static bool Login(CUser user)
        {
            bool isOk = true;            try
            {
                string userID = user.UserID;
                HttpContext.Current.Session.Add(_Key, userID);
                string sessionID = HttpContext.Current.Session.SessionID;                COnlineInfo onlineInfo = new COnlineInfo();
                onlineInfo.UserID = userID;
                onlineInfo.LoginTime = DateTime.Now;
                onlineInfo.IP = "";
                onlineInfo.SessionID = sessionID;
                _OnlineInfos.Add(sessionID, onlineInfo);                _UserSessions.Add(userID, sessionID);                //把用户在线的信息存到数据库中
                DAL.Account.Account.InsertOnlineInfo(onlineInfo);
            }
            catch
            {
                isOk = false;
            }            return isOk;
        }        /// <summary>
        /// 登出
        /// </summary>
        /// <param name="user"></param>
        public static bool LogOut(CUser user)
        {
            //string sessionID = HttpContext.Current.Session.SessionID;
            HttpContext.Current.Session.Abandon();
            HttpContext.Current.Session.Remove(_Key);            string userID = user.UserID;
            if (_UserSessions.ContainsKey(userID) == false)
                return false;            bool isOK = false;
            string sessionID = _UserSessions[userID];
            _UserSessions.Remove(userID);
            if (_OnlineInfos.ContainsKey(sessionID) == true)
            {
                COnlineInfo onlineInfo = _OnlineInfos[sessionID];
                COnlineEvent onlineEvent = new COnlineEvent();
                onlineEvent.UserID = onlineInfo.UserID;
                onlineEvent.SessionID = onlineInfo.SessionID;
                onlineEvent.IP = onlineInfo.IP;
                onlineEvent.LoginTime = onlineInfo.LoginTime;
                onlineEvent.LogoutTime = DateTime.Now;
                TimeSpan span = onlineEvent.LogoutTime - onlineEvent.LoginTime;
                onlineEvent.OnlineDuration = span.Days * 24 * 60 + span.Hours * 60 + span.Minutes + span.Seconds / Convert.ToDouble(60.0);                _OnlineInfos.Remove(sessionID);                isOK = DAL.Account.Account.InsertOnlineEvent(onlineEvent);
            }            return isOK;
        }        /// <summary>
        /// 获取当前的用户
        /// </summary>
        public static CUser CurrentUser
        {
            get
            {
                return GetCurrentUser();
            }
        }        private static CUser GetCurrentUser()
        {
            string sessionID = HttpContext.Current.Session.SessionID;
            if (_OnlineInfos.ContainsKey(sessionID) == false)
                return null;            COnlineInfo onlineInfo = _OnlineInfos[sessionID];
            CUser user = DAL.Account.Account.GetUserByUserID(onlineInfo.UserID);
            return user;
        }
    }

解决方案 »

  1.   


     public static class OnlineManager
    一个类带有static,意味着什么呢?---简单封装而已,继承、多态与他无关
      

  2.   

    因为是为现在做的项目写的 所以没有更远的考虑 需要的话 以后可以改
    以前没写过这东西 也没用过session 所以想请各位指点一下
      

  3.   

    谢谢指教 
    因为是为现在做的项目写的 所以没有更远的考虑 需要的话 以后可以改
    以前没写过这东西 也没用过session 所以想请各位指点一下 看看上面的代码用session来实现用户登入登出是否正确 有没有什么问题
    谢谢支持