2011-12-28 192 views
4

(當然,甚至可以在.Net中使用)。如何在服務器端事件中註冊客戶端事件偵聽器?

最終,我想完成的是一個基於AJAX的消息傳遞系統。 我已經有一個消息數據庫表和一個ASPX添加新消息(並宣佈舊消息不再相關)。

當前消息傳遞系統每15秒鐘輪詢一次服務器,並重新提取當前消息集。

我所希望做的是: 在$(文件)。就緒(),註冊,對於服務器端事件監聽一個ajax回調函數(例如,MessagesUpdated) 表中插入/更新,火MessagesUpdated服務器端。

這樣,無論何時更新表(或添加新記錄),任何偵聽的客戶端都知道新數據可用,然後可以重新輪詢服務器。

理想情況下,我還想將新數據作爲事件參數提供(以最大限度地減少重新輪詢數據庫)。

我可以在其他語言中找到類似這樣的參考,但我找不到任何實際的代碼示例來啓動我。

假設通過.Net可以做到這一點,任何人都可以幫助我開始呢?

我正在使用2.0框架。 另外,雖然我添加了VB.Net標記,但我可以很好地閱讀C#,所以請隨時以任一種語言發佈。

在此先感謝!

皮特

回答

3

看看長輪詢。基本上它是在AJAX請求上設置一個很長的超時時間。客戶端然後等待服務器響應。這比每隔幾秒發送一次請求要高效得多。

How to do a long polling client in C#?

+0

這是Facebook的工作方式在牆上的更新上,我相信。 – 2011-12-28 18:19:13

+0

謝謝大家的建議!經過廣泛的研究,並給予我的可用服務器,我相信長輪詢是要走的路(服務器將不支持WebSockets,並且SignalR降級到長輪詢,當服務器不支持WebSockets時)。 – pete 2011-12-29 14:53:31

+0

Facebook(甚至twitter,Hotmail也是)每隔幾秒鐘輪詢一次服務器。這樣就容易多了。你可以使用小提琴來自己檢查。他們不必擔心訂閱者和發佈者。他們獲得了超過50萬臺服務器,因此規模不成問題。他們可以完成用戶/發佈者模型,但他們沒有。 – 2012-10-16 19:29:46

0

HTML5的WebSockets介紹了爲解決這一問題,但支持是稀疏。如果你使用它,你需要一個後備,這可能是長期投票mrtsherman描述。

1

對於現代瀏覽器,您可以使用websockets打開到服務器的連續連接,通過該連接服務器可以通知服務器端事件。在沒有websockets支持的瀏覽器中,您需要使用mrtsherman的答案中提到的長輪詢。

0

我懷疑它可以與.NET 2.0協同工作,但是如果你能解決這個問題,你應該檢查出SignalR。 SignalR是一個完整的客戶端和服務器端解決方案,客戶端使用JS,後端使用ASP.NET來創建這些類型的應用程序。有一個很好的總結here

從博客文章直接引用:

在客戶

$(function() { 
// Proxy created on the fly 
var chat = $.connection.chat; 

// Declare a function on the chat hub so the server can invoke it 
chat.addMessage = function (message) { 
    $('#messages').append('<li>' + message + '</li>'); 
}; 

$("#broadcast").click(function() { 
    // Call the chat method on the server 
    chat.send($('#msg').val()); 
}); 

// Start the connection 
$.connection.hub.start(); 
}); 

而服務器

public class Chat : Hub 
{ 
    public void Send(string message) 
    { 
     // Call the addMessage method on all clients 
     Clients.addMessage(message); 
    } 
} 
相關問題