我需要在Web客户端(ASP.NET MVC)上进行实时更新。我可以转向的唯一方法是实现 COMET 技术(ServerPush / Reverse-AJAX)技术。
场景是: 用户A 在不同的网站客户端中保存邮件。然后,用户B 将自动获取用户“A”在其他浏览器中所做的更新。
我实际上通过这种架构完成了解决方案: ASP.NET MVC - 在WCF上执行了jquery ajax(post)请求(long-pooled)。 WCF - 对数据库(SQL Server)进行一些轮询,间隔为1秒。如果已将新数据添加到数据库,则轮询将中断,并在客户端上返回数据。
WCF COMET方法伪代码:
private Message[] GetMessages(System.Guid userID)
{
var messages = new List<Message>();
var found = false;
/* declare connection, command */
while (!found )
{
try
{
/* open connection - connection.Open(); */
/* do some database access here */
/* close connection - connection.Close(); */
/* if returned record > 0 then process the Message and save to messages variable */
/* sleep thread : System.Threading.Thread.Sleep(1000); */
found = true;
}
finally
{
/* for sure, incase of exception */
/* close connection - connection.Close(); */
}
}
return messages.ToArray();
}
我的担忧和问题是:在WCF中进行轮询技术的最佳方法(1秒间隔)?
原因:我最大限度地使用了数据库连接池,我希望这项技术没有问题。
注意:这是一个多线程实现,使用下面的WCF给定属性。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall), ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = true)]
答案 0 :(得分:4)
我建议使用专用的实时服务器(即不在IIS中托管WCF服务)或使用托管服务进行实时更新。正如Anders所说,IIS在处理多个长时间运行的并发请求方面并不是那么出色。
我还建议您使用一个使用WebSockets的解决方案来支持回退解决方案,例如Flash,HTTP流式传输,HTTP长轮询以及可能的轮询。 WebSockets是客户端和服务器之间第一个全双工双向通信的标准化方法,最终将为任何此类问题提供更好的解决方案。
目前实现自己的Comet / WebSockets实时解决方案绝对是一项耗时的任务(正如您可能已经发现的那样),尤其是在构建面向公众的应用程序时,用户可以访问多个不同的浏览器。
考虑到这一点,XSockets项目与SuperWebSocket项目一样非常有趣。
我知道的.NET Comet解决方案来自FrozenMountain,它有一个用于IIS的WebSync服务器。还有PokeIn。
我编制了一份可能也很有用的realtime web technologies列表。
答案 1 :(得分:0)
而不是轮询数据库,而不是在更新时发送了一个事件?这就是我实现Pub / Sub场景的方式,它运作得很好。