想做在线人数统计,但发现在客户端关闭IE后并不能触发Session_End事件,以实现当前在线人数-1的目的。

解决方案 »

  1.   


    //防并发
    Application.Lock();
    //退出时Session减1
    Application["OnLineNum"]=(int)Application["OnLineNum"]-1;
    Application.UnLock();
    再就是Session有过期时间,可以把过期时间设置的短一点,方便看到效果。
      

  2.   

    Q: 但发现在客户端关闭IE后并不能触发Session_End事件
    ——————————————————————————————————————————
    A: 这个事件是在asp.net应用程序删除会话session环境时触发,例如在用户最后一次提交命令之后20多分钟之后,而不是在客户端关闭窗口时触发的。客户端管理窗口不会触发任何服务器事件。再ie浏览器上,也没有任何专为窗口关闭而设计的事件,事件onbeforeunload、onunload会在包括窗口关闭、url更新等多种事件情况下触发。你可以在数据库中记录每一个用户最后访问服务器的时间(在page_load中获取),然后在判断“在线”根据超时上限值来判断,例如超过1分钟即算(临时)离线。你还可以在页面上使用iframe或者Ajax方法异步请求服务器的某个页面以便刷新数据库中的最后访问时间。
      

  3.   

    我就是想实现关闭IE的同时马上销毁当前SESSION ,但发现Session_End(Object sender, EventArgs e)
    不执行。
    /*以下是我实现的代码*/
    protected void Application_Start(Object sender, EventArgs e)
    {
      Application.Lock();
      Application["usertotal"]=0;//访问总人数
      Application["useronline"]=0;//当前在线人数
      Application["maxonline"]=0;//历史最高在线人数
      Application["maxonlinetime"]=DateTime.Now.ToString();//历史最高在线发生时间
      Application.UnLock();
    }
     
    protected void Session_Start(Object sender, EventArgs e)
    {
      Application.Lock();
      int usertotal=(int)Application["usertotal"];
      int useronline=(int)Application["useronline"];
      int maxonline=(int)Application["maxonline"];
      usertotal++;
      useronline++;  if(useronline>maxonline)
       {
         maxonline=useronline;
         Application["maxonlinetime"]=DateTime.Now.ToString();//历史最高在线发生时间
       }   Application["usertotal"]=usertotal;//访问总人数
       Application["useronline"]=useronline;//当前在线人数
       Application["maxonline"]=maxonline;//历史最高在线人数
       Application.UnLock();
     }protected void Session_End(Object sender, EventArgs e)
    {
      Application.Lock();
      int useronline=(int)Application["useronline"];
      useronline--;
      Application["useronline"]=useronline;//当前在线人数
      Application.UnLock();
    }
      

  4.   

    超过sessionstate 的过期时间,就触发事件了,关闭浏览器没有对服务器有任何操作请求,
      

  5.   

    不操作数据库能实现退出IE时Session的及时销毁吗?
      

  6.   

    不能,上面各楼已经说清楚了,session必须在超时时间过了的时候发生,而不管你操不操作数据库
      

  7.   

    这个是不能做到的,因为HTTP是属于断开连接的协议,当你关闭IE时,IE不会发送一个请求到服务器说:“我被关闭了”。
    同样可以引申思考以下问题:当客户端断电的时候,IE还能发送请求到服务器说:“断电了" ???