2

在 Stack Overflow 网站上,我们可以看到以下异步更新。

  1. 声誉变化
  2. 问题列表中添加了新问题
  3. 添加了新评论等。

据我了解,它可以在XMLHttpRequest (XHR) 请求中异步完成,也许在 setInterval.

困惑:在 Firefox 中,没有 XHR 请求到来,即使这样我也可以异步看到上述更改。

这是哪种实现,如何在ASP.NET MVC中完成?

4

3 回答 3

4

这个令人印象深刻和美丽的东西是使用Ajax从客户端到服务器的异步调用。

一个非常简单的方法是使用jQuery Ajax在 setInterval 中进行异步调用以搜索问题的“更新”(这是 ID 为 17779628 的问题。我们可以在URL =P 上看到)。因此,对服务器的调用可以传递此 ID 和最后一次调用服务器的时间戳(日期)。然后,服务器将 TimeStamp 发生的更新带到DateTime.Now.

我不确定 Stack Overflow 的真正实现,但我已经做了很多这样的事情。


另一个提示:

有一个改进。;) 现代浏览器包含WebSocket的实现。由于套接字是“点对点”而不是“客户端-服务器”,因此现代浏览器不需要使用 setInterval 的方法。相反,您可以在JavaScript中实现 WebSocket 打开,然后服务器可以在更新发生时主动发送更新(您可以使用包含事件的设计模式)。

查看CanIUse以了解哪些浏览器支持 WebSocket。


编辑

无论如何,我只是为你打开了代码。Stack Overflow 的 JavaScript 代码对 JavaScript 代码使用单例设计模式。只需查看StackExchange浏览器控制台中的变量即可。这就是这里 JavaScript 代码的核心。如您所见,有一个基于此变量的完整API 。StackExchange现在,搜索StackExchange.realtime.init('sockets.ny.stackexchange.com:80');

WebSocket 初始化

然后,看看StackExchange.realtime.init你的控制台上的实现。他们似乎支持使用 WebSocket 进行异步更新。这是很好的和现代的,但只支持新的浏览器版本。如果您需要保持向后兼容性,您可以同时支持 WebSocket(对于新浏览器)和 Ajax 实现(对于旧浏览器)。

在此处输入图像描述

于 2013-07-22T04:15:49.047 回答
1

我想他们会使用SignalRWebSocket之类的东西。SignalR 将在可用时利用 WebSocket,然后回退到许多其他技术来实现相同的目标。

于 2013-07-22T03:49:23.357 回答
0

我最近回答了一个类似的问题: 如何向用户显示实时信息?

如前所述Nathan Fisher,您需要研究 Websockets 和 SignalR。

如果您在 Firefox 中看不到 XHR 请求,请尝试寻找 Websockets。在 Chrome 中,我可以在我访问的每个 SO 页面上看到一个 Websocket。

网络套接字

请注意,它正在处理有关我的收件箱、我的声誉的信息,并且在我写这个答案的同时Nathan Fisher对他的帖子进行了编辑,所以我可以看到页面也在处理这个问题(我看到“已对这个帖子”)。

于 2013-07-22T03:58:34.553 回答