4

我要创建一个网站,我需要统计在线用户并一直显示在主页上。我没有兴趣为其应用现成的模块。这是我已经做的:

将 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();
}

实际上它工作正常,但我发现了以下错误: --> 即使用户关闭浏览器,由于会话超时仍然存在,因此不会显示在线用户的真实数量!

除了更改会话超时间隔之外,有什么解决方案吗?

4

4 回答 4

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 !");
}

请注意,这不会涵盖所有情况(例如,如果用户通过任务管理器杀死浏览器)。

于 2012-05-07T12:19:50.270 回答
3

Session_End 事件在服务器端会话超时时触发,这是(默认)在最后一个请求被处理后 20 分钟。服务器不知道用户何时“离开”或“关闭浏览器”,因此无法对此采取行动。

于 2012-05-07T11:39:58.573 回答
0

这种方法的局限性在于,除非会话实际结束,否则服务器会认为用户已登录;仅当会话超时配置中指定的分钟数过去时才会发生。

检查这篇文章:http ://forums.asp.net/t/1283350.aspx

发现这个Online-active-users-counter-in-ASP-NET

于 2012-05-07T11:44:59.730 回答
0

不,在会话超时之前需要时间来更新...

于 2012-05-07T11:38:29.493 回答