Stack Overflow如何异步显示更新?

时间:2013-07-22 03:46:49

标签: asp.net-mvc asp.net-mvc-4 xmlhttprequest

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

  1. 声誉变更
  2. 问题列表中添加了新问题
  3. 新评论等等。
  4. 根据我的理解,它可以在XMLHttpRequest(XHR)请求中异步完成,也许可以在setInterval的帮助下完成。

    Confusions :在Firefox中,没有XHR请求即将到来,即便如此,我也可以异步地看到上述更改。

    这是什么类型的实现?如何在ASP.NET MVC中完成?

3 个答案:

答案 0 :(得分:4)

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

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

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


另一个提示:

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

查看JavaScript以查看哪些浏览器支持WebSocket。


修改

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

WebSocket initialization

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

Enter image description here

答案 1 :(得分:1)

我想他们会使用SignalRWebSocket之类的东西。 SignalR将在可用时利用WebSocket,然后再采用其他一些技术来实现同样的目标。

答案 2 :(得分:0)

我最近回答了一个类似的问题: How do I display real-time information to the user?

Nathan Fisher所述,您需要查看Websockets和SignalR。

关于您在Firefox中没有看到XHR请求,请尝试查找Websockets。在Chrome中,我可以在每个转到的SO页面上看到一个Websocket。

Websockets

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