0

我用 asp.net 4.0 创建了一个网站,现在我需要计算连接到我网站的在线人数。我如何用 JQuery 做到这一点?

4

3 回答 3

2

也许改用谷歌分析?它是免费的,您不必编写任何代码,而且您从中获得的不仅仅是计数器——您将获得按浏览器、屏幕分辨率、地理位置等各种因素的细分。

于 2012-06-17T03:40:42.963 回答
2

基本上,您需要在您的页面上创建一个“心跳”,每隔 x 秒使用一个 ajax 调用和一个唯一的会话 ID 对服务器进行一次 ping 操作。在服务器上,您可以记录/计算这些 pings/id 并粗略估计(基于最后 x 秒),在任何给定时间有多少人在您的站点上。不要忘记在每次计数后重置您的计数器。

由于您使用的是 ASP.NET,因此您有几个不同的服务器端选项。有些人喜欢创建一个独立的 .aspx 页面,该页面读取通过查询字符串传递的参数并通过 ajax 调用它。就我个人而言,我会创建一个 Web 处理程序(.ashx),因为它们对于这样的东西特别有用。其他人会说“正确”的方式是使用简单的 ajax 调用来调用页面 webmethods。如果您使用的是 MVC,那就更容易了。只需设置一个控制器方法来读取一些查询字符串参数并向其发送请求。最终由您决定哪种方式最适合您的应用程序——它们都做同样的事情。

于 2012-06-17T03:41:54.757 回答
0

我会亲自制作一个处理程序(.ashx),但那是因为我对它们很满意。使用@ajax81 概述的心跳代码,但您将返回(在同一次调用中)活跃用户数。

  1. 为访问您页面的每个用户分配一个唯一的会话 ID。如果您使用的是 aspx 页面和会话状态,那么您几乎已经掌握了这一点。在 session_start 中,您将创建一个会话变量并为其分配一个唯一标识符(我将使用动态创建的 guid),将其存储在 Session["userguid"] 和一些持久存储中。最简单的方法是数据库中的一个简单表。

  2. 客户端脚本 (jquery ajax) 将向 foo.ashx 发送请求。它甚至可以是一个空请求。使用 jQuery setTimeOut 类型函数在每个页面上每分钟调用它。

  3. 在您的处理程序中,它会收到一个请求,找出它来自谁,并更新该特定用户的“最后更新”日期(您可以从 Session["userguid"].

  4. 浏览所有“活跃用户”表并删除 5 分钟左右未更新的表。

  5. 获取“活跃用户”的新计数并将其返回到客户端页面。然后,客户端页面可以以它选择的任何方式显示该数字。

这一切都未经检验,但理论应该是合理的。我只是没有时间为您编写完整的应用程序。;)

    void Session_Start(object sender, EventArgs e)
    {
        // Code that runs when a new session is started

        Guid sessionId = Guid.NewGuid();
        Session["sessionGuid"] = sessionId;
        // Write code to store this in a table -- "INSERT INTO myTable (sessionGuid, dateCreated, dateUpdated) VALUES (@sessionGuid, getdate(), getdate()) ; "

    }

在您的页面中:

$.ajax({
  url: "foo.ashx",
  context: document.body
}).done(function( data ) { 
  $(someobject).html(data);
});

foo.ashx 的代码:

    public void ProcessRequest(HttpContext context)
    {
        Guid sessionGuid = (Guid)context.Session["sessionGuid"];

        // Write code to update table "UPDATE myTable SET dateUpdated = getdate() where sessionId = @sessionGuid ; "

        // Write statement to delete all items older than x minutes "DELETE from myTable WHERE dateUpdated < dateadd(minute, -10, getdate()) ; "

        // Get cound of existing real users: "SELECT count(*) FROM myTable ;"

        // Return that value.

        context.Response.ContentType = "text/plain";
        context.Response.Write(YourValue);
    }
于 2012-06-17T05:26:23.270 回答