2013-07-22 16 views
2

在堆棧 溢出站點上,我們可以異步地看到以下更新。堆棧溢出如何異步顯示更新?

  1. 聲望改變
  2. 新問題,在問題清單
  3. 新評論添加添加等

按我的理解,它可以在XMLHttpRequest(XHR)請求來實現異步,也許在setInterval的幫助下。

Confusionions:在Firefox中,沒有XHR請求即將到來,即使這樣我可以異步地看到上述更改。

這是什麼類型的實現以及如何在ASP.NET MVC中完成?

回答

1

我想他們會使用類似SignalRWebSocket。 SignalR將在可用時利用WebSocket,然後回退到其他一些技術來實現同樣的目標。

+0

任何簡短的示例代碼,您可以分享嗎? –

+0

用Visual Studio中的Nuget Package Manager試試這個: - Install-Package Microsoft.AspNet.SignalR.Sample –

+0

也可以看看SignalR Github站點:https://github.com/SignalR/SignalR/tree/master/樣品 –

0

我最近回答了類似的問題: How do I display real-time information to the user?

正如Nathan Fisher說,你要考慮的WebSockets和SignalR。

關於您沒有看到Firefox中的XHR請求,請嘗試查找Websockets。在Chrome中,我可以在每個SO頁面上看到一個WebSocket。

Websockets

會注意到是處理信息的關於我的收件箱,我的名聲也當我在寫這個答案Nathan Fisher做編輯自己的崗位,這樣我就可以看到頁面處理也(我看到「此郵件已被編輯」)。

4

這令人印象深刻和美麗的東西是使用Ajax從客戶端到服務器的異步調用。

一個非常簡單的方法是使用jQuery Ajax進行異步調用的setInterval內尋找一個問題的「更新」(這是ID 17779628.的問題,我們可以在URL = P見)。所以,對服務器的調用可以傳遞這個ID和最後一次對服務器進行調用的TimeStamp(日期)。服務器然後將從TimeStamp發生的更新帶到DateTime.Now

我不確定堆棧的真正實現 溢出,但我已經做了很多這樣的東西。


另一個提示:

有一個改進。 ;) 現代瀏覽器包含WebSocket的實現。由於套接字是「點對點」而不是「客戶端 - 服務器」,所以現代瀏覽器不需要setInterval方法。相反,您可以在JavaScript中實現WebSocket打開,然後服務器可以在發生更新(您可以使用包含事件的設計模式)時主動發送更新。

看看CanIUse看看哪些瀏覽器支持WebSocket。


編輯

反正,我只是打開了代碼爲您服務。堆棧 溢出的JavaScript代碼對於JavaScript代碼使用singleton設計模式。只需在瀏覽器控制檯中查看StackExchange變量即可。這是JavaScript代碼的核心。正如你所看到的,整個API建立在這個StackExchange變量上。現在,搜索StackExchange.realtime.init('sockets.ny.stackexchange.com:80');

WebSocket initialization

然後,看看在StackExchange.realtime.init在控制檯執行。看起來他們支持使用WebSocket進行異步更新。這是很好的和現代的,但只支持新的瀏覽器版本。如果您需要保持向後兼容性,則可以同時支持WebSocket(用於新建)和Ajax實現(用於舊瀏覽器)。

Enter image description here

+0

爲CanIUse網站+1。我已經忘記了這件事情:) –

+0

sry,需要一段時間才能通過它。希望你明白。 –

+0

不需要匆忙=)。看看[這裏](http://stackoverflow.com/questions/5052543/how-to-fire-ajax-request-periodically)樣本和[這裏](http://irfandurmus.com/projects/ jquery-periodic-updater /)爲一個插件,承諾減輕你的生活。 – Minduca