2011-12-28 154 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); 
    } 
}