WCF Comet实现

时间:2011-08-12 11:16:19

标签: wcf comet

我需要在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)]

2 个答案:

答案 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场景的方式,它运作得很好。