我要创建一个网站,我需要对网站用户进行统计,并始终在主页上显示。我对使用即用型模块不感兴趣。这是我已经做过的事情:
将Global.asax文件添加到我的项目
在Global.asax文件中编写以下代码段:
void Application_Start(object sender, EventArgs e)
{
Application["OnlineUsers"] = 0;
}
void Session_Start(object sender, EventArgs e)
{
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
Application.UnLock();
}
实际上它工作正常,但我发现了以下错误: - >即使用户关闭浏览器,也不会显示在线用户的实际数量 因为会话超时仍然存在!
是否有任何解决方案,但更改会话超时间隔?
答案 0 :(得分:3)
当服务器端会话超时时会触发Session_End事件,这是(默认)在最后一个请求被提供后20分钟。服务器不知道用户何时“导航”或“关闭浏览器”,因此无法对此采取行动。
答案 1 :(得分:3)
您可以使用onUserExit jQuery插件来调用某些服务器端代码并放弃会话。在文档就绪时激活onUserExit:
<script type="text/javascript">
jQuery(document).ready(function () {
jQuery().onUserExit({
execute: function () {
jQuery.ajax({
url: '/EndSession.ashx', async: false
});
},
internalURLs: 'www.yourdomain.com|yourdomain.com'
});
});
</script>
在EndSession.ashx中放弃会话和服务器端将调用Session_End:
public void ProcessRequest(HttpContext context)
{
context.Session.Abandon();
context.Response.ContentType = "text/plain";
context.Response.Write("My session abandoned !");
}
请注意,这不会涵盖所有情况(例如,如果用户通过任务管理器杀死浏览器)。
答案 2 :(得分:0)
不,需要时间才能更新,直到会话超时......
答案 3 :(得分:0)
这种方法的局限性在于服务器会认为用户已登录,除非会话实际结束;只有在会话超时配置中指定的分钟数过后才会发生。