asp.net session 在 mode="StateServer"  怎么实现在线统计。
因为这个模式不执行Session_End事件

解决方案 »

  1.   

    Session退出时实现人数统计不准确。非法关机或关闭IE不会执行
    要记录用户日志和操作时间,再用定时器刷新计算用户
    已经有固定时间没有活动的用户,然后删除
      

  2.   

    /// <summary>
    /// OnLine 的摘要说明
    /// </summary>
    public class OnLine
    {
        private int OFFLINEDIFF;
        private int REMOVEDIFF;
        public OnLine()
        {
            ///多少分钟不活动的用户从在线列表中删除
            OFFLINEDIFF = 5;
            ///多少秒执行一次删除不活动用户
            REMOVEDIFF = 30;        if (System.Web.HttpContext.Current.Application["DataTalbeOnline"] == null)
            {
                this.CashTableInit();
            }
        }    public void CheckOnline(string UserId,string UserName)
        {
            //从Application获取数据表、获取UserId
            DataTable dtOnline;
            dtOnline = (DataTable)System.Web.HttpContext.Current.Application["DataTalbeOnline"];        //数据表中是否有我的记录
            DataRow drFind = dtOnline.Rows.Find(UserId);
            if (drFind != null)
            {
                drFind["LastActiveTime"] = DateTime.Now;
            }
            else
            {
                DataRow drNew = dtOnline.NewRow();
                drNew["UserId"] = UserId;
                drNew["UserName"] = UserName;
                drNew["LastActiveTime"] = DateTime.Now;
                drNew["LoginTime"] = DateTime.Now;            dtOnline.Rows.Add(drNew);
            }        //如果没有人正在执行删除且离上次删除的时间间隔超过设定值
            TimeSpan tsRemove = DateTime.Now - Convert.ToDateTime(GetApplication("LastRemove"));
            if (tsRemove.Seconds > REMOVEDIFF && this.GetApplication("Removing").ToString() == "n")
            {
                //锁定,我正在删除过期用户
                System.Web.HttpContext.Current.Application.Lock();
                SetApplication("Removing", "y");
                System.Web.HttpContext.Current.Application.UnLock();
                //不知道Rows.Count是否随循环减少,如果是效率就大于foreach且这里不能使用foreach
                for (int i = 0; i < dtOnline.Rows.Count; i++)
                {
                    DataRow drDel = dtOnline.Rows[i];
                    TimeSpan ts = DateTime.Now - Convert.ToDateTime(drDel["LastActiveTime"]);
                    if (ts.Minutes > OFFLINEDIFF)
                    {
                        dtOnline.Rows.Remove(drDel);
                    }
                }            //我删完了,Response.Write("好累") ;
                System.Web.HttpContext.Current.Application.Lock();
                SetApplication("Removing", "n");
                SetApplication("LastRemove", DateTime.Now.ToString());
                System.Web.HttpContext.Current.Application.UnLock();
            }        //把被我揉腻完了的数据表放回Application
            dtOnline.AcceptChanges();
            System.Web.HttpContext.Current.Application.Lock();
            System.Web.HttpContext.Current.Application["DataTalbeOnline"] = dtOnline;
            System.Web.HttpContext.Current.Application.UnLock();
        }
        private string GetApplication(string apcname)
        {
            return System.Web.HttpContext.Current.Application[apcname].ToString();
        }
        public void SetApplication(string apcname, string apcvalue)
        {
            System.Web.HttpContext.Current.Application[apcname] = apcvalue;
        }
        /// <summary>
        /// 创建表
        /// </summary>
        public void CashTableInit()
        {
            DataTable dt = new DataTable("OnlineTalbe");
            dt.Columns.Add("UserId", typeof(string));
            dt.Columns.Add("UserName", typeof(string));
            dt.Columns.Add("LastActiveTime", typeof(DateTime));
            dt.Columns.Add("LoginTime", typeof(DateTime));
            dt.Columns["UserId"].Unique = true;
            dt.PrimaryKey = new DataColumn[] { dt.Columns["UserId"] };        System.Web.HttpContext.Current.Application["DataTalbeOnline"] = dt;
            System.Web.HttpContext.Current.Application["LastRemove"] = DateTime.Now.ToString();
            System.Web.HttpContext.Current.Application["Removing"] = "n";
        }
    }
      

  3.   

    只是用DataTable做一个存储体,不保存记录的~
      

  4.   

    DataTable dt = (DataTable)System.Web.HttpContext.Current.Application["DataTalbeOnline"];
      

  5.   

    Application["counter"].ToString ()
      

  6.   

    先定义一个global.asax
    <%@ Application Language="C#" %><script runat="server">    void Application_Start(object sender, EventArgs e) 
        {
            // 在应用程序启动时运行的代码
            Application["YZTonline"] = 0;
        }
        
        void Application_End(object sender, EventArgs e) 
        {
            //  在应用程序关闭时运行的代码    }
            
        void Application_Error(object sender, EventArgs e) 
        { 
            // 在出现未处理的错误时运行的代码    }    void Session_Start(object sender, EventArgs e) 
        {
            // 在新会话启动时运行的代码
            Session.Timeout = 5; //设置Session的有效时间,可根据需要修改
            
            Application.Lock();
            Application["YZTonline"] = Convert.ToInt32(Application["YZTonline"]) + 1;
            Application.UnLock();    }    void Session_End(object sender, EventArgs e) 
        {
            // 在会话结束时运行的代码。 
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
            // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 
            // 或 SQLServer,则不会引发该事件。
            Application.Lock();
            Application["YZTonline"] = Convert.ToInt32(Application["YZTonline"]) - 1;
            Application.UnLock();
        }
           
    </script>
      

  7.   

    调用页面当前线人<span class="STYLE5"><%=Application["YZTonline"]%></span>人
      

  8.   

    我的就是用的这个,可是
    我的session model="StateServer"  是不执行Session_End(object sender, EventArgs e) 
    事件
      

  9.   

    我的就是用的这个,可是 
    我的session mode="StateServer"  是不执行Session_End(object sender, EventArgs e) 
    事件
      

  10.   

    换个session mode看看,楼主好像不是用传统方法啊
      

  11.   


    顶下·· application保存状态·
      

  12.   

    在BasePage或每个页中加入(new OnLine()).CheckOnline()即可。要获得数据表使用DataTable dt = (DataTable)Application["DataTalbeOnline"]
      

  13.   

    显示人数的页面:(new OnLine()).CheckOnline();
    DataTable dt = (DataTable)Application["OnlineTalbe"];
    Label1.Text="总共"+(dt.Rows.Count).ToString()+"人在线";
      

  14.   


    (new OnLine()).CheckOnline();  这里面的参数是什么。
        public void CheckOnline(string UserId, string UserName)
      

  15.   

    当用户 关闭页面之后 执行SESSION.ABANDON()就会强制调用 Session_End()