在 Stack Overflow 网站上,我们可以看到以下异步更新。
- 声誉变化
- 问题列表中添加了新问题
- 添加了新评论等。
据我了解,它可以在XMLHttpRequest (XHR) 请求中异步完成,也许在 setInterval
.
困惑:在 Firefox 中,没有 XHR 请求到来,即使这样我也可以异步看到上述更改。
这是哪种实现,如何在ASP.NET MVC中完成?
在 Stack Overflow 网站上,我们可以看到以下异步更新。
据我了解,它可以在XMLHttpRequest (XHR) 请求中异步完成,也许在 setInterval
.
困惑:在 Firefox 中,没有 XHR 请求到来,即使这样我也可以异步看到上述更改。
这是哪种实现,如何在ASP.NET MVC中完成?
这个令人印象深刻和美丽的东西是使用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');
然后,看看StackExchange.realtime.init
你的控制台上的实现。他们似乎支持使用 WebSocket 进行异步更新。这是很好的和现代的,但只支持新的浏览器版本。如果您需要保持向后兼容性,您可以同时支持 WebSocket(对于新浏览器)和 Ajax 实现(对于旧浏览器)。
我最近回答了一个类似的问题: 如何向用户显示实时信息?
如前所述Nathan Fisher
,您需要研究 Websockets 和 SignalR。
如果您在 Firefox 中看不到 XHR 请求,请尝试寻找 Websockets。在 Chrome 中,我可以在我访问的每个 SO 页面上看到一个 Websocket。
请注意,它正在处理有关我的收件箱、我的声誉的信息,并且在我写这个答案的同时Nathan Fisher
对他的帖子进行了编辑,所以我可以看到页面也在处理这个问题(我看到“已对这个帖子”)。