【问题标题】:WCF Comet ImplementationWCF彗星实现
【发布时间】:2011-08-12 11:16:19
【问题描述】:

我有一个需要在 Web 客户端 (ASP.NET MVC) 上进行实时更新的需求。我可以扭转它的唯一方法是实现 COMET 技术(ServerPush/Reverse-AJAX)技术。

场景是: 用户A在不同的网站客户端保存消息。然后,用户 B 将自动获取 用户“A” 在不同浏览器中所做的更新。

我实际上完成了这个架构的解决方案: ASP.NET MVC - 在 WCF 上执行 jquery ajax(发布)请求(长池)。 WCF - 每隔 1 秒对数据库(SQL Server)进行轮询。如果新数据已添加到数据库中,轮询将中断,并在客户端返回数据。

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)]

【问题讨论】:

    标签: wcf comet


    【解决方案1】:

    我建议使用专用的实时服务器(即不要在 IIS 中托管 WCF 服务)或使用托管服务进行实时更新。正如Anders 所说,IIS 在处理多个长时间运行的并发请求方面并不是那么出色。

    我还建议您考虑使用一种解决方案,该解决方案使用WebSockets 并支持备用解决方案,例如 Flash、HTTP 流、HTTP 长轮询,然后可能还有轮询。 WebSockets 是客户端和服务器之间全双工双向通信的第一个标准化方法,最终将为任何此类问题提供更好的解决方案。

    目前,实现您自己的 Comet/WebSockets 实时解决方案肯定会是一项耗时的任务(您可能已经发现),尤其是在构建面向公众的应用程序时,该应用程序可以被具有大量不同的浏览器。

    考虑到这一点,XSockets 项目看起来非常有趣,SuperWebSocket 项目也是如此。

    我所知道的来自FrozenMountain 的.NET Comet 解决方案有一个用于IIS 的WebSync 服务器。还有PokeIn

    我整理了一份realtime web technologies 列表,可能也有用。

    【讨论】:

    • 我实际上研究了 WebSync,我知道它是为 MS Stack 提供的最好的 COMET 服务。我只是避免为我的网站购买 3rd 方 dll(服务),但有了这些,我想我可能需要好好考虑购买 WebSync 许可证以进行全双工通信,并且易于配置。
    • 如果您正在考虑第三方解决方案,那么我们(Pusher)还有一个.NET library,可以轻松集成到任何 .NET 应用程序(包括 ASP.NET 和 ASP.NET MVC)中。还有一篇关于使用它的文章here。如果您想自托管并且想要 Comet,而不是 WebSockets(尽管我推荐 WebSockets),那么 WebSync 提供了一个很好的解决方案。
    【解决方案2】:

    您不能在更新时发送事件而不是轮询数据库吗?这就是我实现 Pub/Sub 场景的方式,而且效果很好。

    【讨论】:

    • 顺便问一下,您有自托管的 WCF 服务还是 IIS 托管的服务?如果是后者你有问题,IIS 的并发线程级别非常低,15 左右,之后它会将请求排队,这在 pub/sub 场景中不起作用。
    • 是的,我是一个自托管的 WCF 服务(IIS 托管)。我尝试通过在 SQL Server 2008 中启用 Service Broker 服务来使用 SqlDependecy 对象,它工作正常,并将数据更改触发回客户端。但是,DBA 告诉我不要使用它,因为线程和开放服务侦听器有一些限制(未定义最大限制)。关于如何实施正确的 COMET 服务,您有什么想法可以分享吗?
    • 你能分享一下 WCF COMET 的具体实现方式吗?谢谢!
    猜你喜欢
    • 2011-12-28
    • 2010-11-01
    • 2013-02-09
    • 2012-07-03
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多