请问在关闭IE时如何能触发Session_End事件?(想做个在线人数统计) 想做在线人数统计,但发现在客户端关闭IE后并不能触发Session_End事件,以实现当前在线人数-1的目的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //防并发Application.Lock();//退出时Session减1Application["OnLineNum"]=(int)Application["OnLineNum"]-1;Application.UnLock();再就是Session有过期时间,可以把过期时间设置的短一点,方便看到效果。 Q: 但发现在客户端关闭IE后并不能触发Session_End事件——————————————————————————————————————————A: 这个事件是在asp.net应用程序删除会话session环境时触发,例如在用户最后一次提交命令之后20多分钟之后,而不是在客户端关闭窗口时触发的。客户端管理窗口不会触发任何服务器事件。再ie浏览器上,也没有任何专为窗口关闭而设计的事件,事件onbeforeunload、onunload会在包括窗口关闭、url更新等多种事件情况下触发。你可以在数据库中记录每一个用户最后访问服务器的时间(在page_load中获取),然后在判断“在线”根据超时上限值来判断,例如超过1分钟即算(临时)离线。你还可以在页面上使用iframe或者Ajax方法异步请求服务器的某个页面以便刷新数据库中的最后访问时间。 我就是想实现关闭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();} 超过sessionstate 的过期时间,就触发事件了,关闭浏览器没有对服务器有任何操作请求, 不操作数据库能实现退出IE时Session的及时销毁吗? 不能,上面各楼已经说清楚了,session必须在超时时间过了的时候发生,而不管你操不操作数据库 这个是不能做到的,因为HTTP是属于断开连接的协议,当你关闭IE时,IE不会发送一个请求到服务器说:“我被关闭了”。同样可以引申思考以下问题:当客户端断电的时候,IE还能发送请求到服务器说:“断电了" ??? jQuery $.messager.show 显示数据 google地图的API问题 【求助】用TreeView获取磁盘目录,当点击节点或者子节点获取磁盘目录的完整目录! 求一正则表达式,过滤HTML标签,只留下A标记和A标记中的内容 datagrid中用循环变量调用Compute方法出错,请高手帮助阿!!!急。。。 想自己写个C#的在线HTML编辑器 关于登录和注销的问题 存储过程的问题? mvc执行存储过程如何获取以数据库某个字段为索引的所有数据 在datagrid 中如何让某列的数据只显示固定的长度? 如何实现查询条件保留??? OnLoad和Page_Load的区别
//防并发
Application.Lock();
//退出时Session减1
Application["OnLineNum"]=(int)Application["OnLineNum"]-1;
Application.UnLock();
再就是Session有过期时间,可以把过期时间设置的短一点,方便看到效果。
——————————————————————————————————————————
A: 这个事件是在asp.net应用程序删除会话session环境时触发,例如在用户最后一次提交命令之后20多分钟之后,而不是在客户端关闭窗口时触发的。客户端管理窗口不会触发任何服务器事件。再ie浏览器上,也没有任何专为窗口关闭而设计的事件,事件onbeforeunload、onunload会在包括窗口关闭、url更新等多种事件情况下触发。你可以在数据库中记录每一个用户最后访问服务器的时间(在page_load中获取),然后在判断“在线”根据超时上限值来判断,例如超过1分钟即算(临时)离线。你还可以在页面上使用iframe或者Ajax方法异步请求服务器的某个页面以便刷新数据库中的最后访问时间。
不执行。
/*以下是我实现的代码*/
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();
}
同样可以引申思考以下问题:当客户端断电的时候,IE还能发送请求到服务器说:“断电了" ???