ASP.NET的Comet实现?

104
我一直在寻找在浏览器内实现类似Gmail的消息传递的方法,并接触到了Comet的概念。然而,我还没有找到一个好的.NET实现,可以让我在IIS中使用它(我们的应用程序是用ASP.NET 2.0编写的)。
我找到的解决方案(或者说能想到的解决方案)需要为每个用户保留一个运行线程,以便他在收到消息后能够返回响应。当然,这根本无法扩展。
因此,我的问题是 - 您是否知道在ASP.NET中实现Comet的不同方式?这在IIS中可能吗?

12
我猜测最初由微软认可的实现是SignalR:http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx - user423430
Node.JS现在已经在Azure上得到支持,很快2003年的IIS也将得到支持。这意味着我们将能够在IIS中运行彗星服务器(http://www.windowsazure.com/en-us/develop/nodejs/)。 - makerofthings7
8个回答

44

由于Comet的持久连接特性,使用IIS扩展Comet任务存在挑战,但目前有一个团队正在研究Comet场景。此外,建议查看Aaron Lerch的博客,因为我认为他在ASP.NET方面做了一些早期的Comet工作。


9
这实际上已经实现了,可以查看Anton在下面回复中提到的WebSync。(http://www.frozenmountain.com/websync/) - Jerod Venema
3
有人称之为"反向Ajax"吗?看看这个链接:http://pokein.codeplex.com - Zuuum
4
MVC异步控制器可以通过将等待操作转移到非IIS工作线程来帮助解决IIS问题。请参阅Clay Lenhart的这篇优秀文章。此外,还可以在BitBucket上查看聊天服务器示例项目 - Jacob

33

WebSync 是一个符合标准的可扩展Comet服务器,可直接集成到IIS/.NET管道中。 它也作为托管服务按需提供。

官方支持每个服务器节点最多20,000个并发客户端连接,但个别测试已经看到高达50,000个。 在1,000-5,000个并发客户端的情况下,消息吞吐量最优,单个节点可传递高达300,000条/秒的消息。

它包括客户端支持JavaScript、.NET/Mono、iOS、Mac OS X、Java、Silverlight、Windows Phone、Windows Runtime和.NET Compact,服务器端支持.NET/Mono和PHP。

使用SQL Server或Azure Caching支持群集,但可以为几乎任何内容编写自定义提供程序(Redis,NCache)。

免责声明: 我在开发此产品的公司工作。


17
这里应该有一份免责声明,因为这是你的产品... - Sam Saffron
9
当然,这是我们公司生产的 :) 我们绝不会有任何隐瞒。 - Anton
1
@Anton - 不隐瞒并不等同于披露。 - D'Arcy Rittich
1
@Anton 你能详细说明一下它如何支持每个服务器节点高达20k个并发客户端连接吗?这些数字看起来...“太大了”。 - Pacerier
1
我不认为询问WebSync在概念上的内部工作方式是否明智——当然是从25,000英尺的高度来看。 - Shawn J. Molloy

15

我最近基于Clay Lenhart的一篇 文章,使用MVC 3异步控制器编写了一个简单的长轮询聊天服务器示例,源代码可以在BitBucket项目中获取。

您也可以使用我在AppHarbor上部署的示例,该示例是基于BitBucket项目中的代码。

此外,我还在我的博客文章中解释了这个项目,提供更多信息。


我喜欢在AppHarbor部署方面的示例。 - guaike
“博客文章解释该项目” --> https://web.archive.org/web/20130328042214/http://jacob4u2.posterous.com/mvc-3-long-polling-comet-chat-example - jaybro
谢谢!很高兴你喜欢这篇文章。 - Clay Lenhart

4

实际上,使用ASP.NET创建支持Ajax的网站有很多选择,但说实话,PokeIn是创建支持comet ajax的Web应用程序最简单的方法。它曾经拯救了我公司的一个项目。


3
您也可以查看Kaazing Enterprise Gateway,它发布了其WebSocket [HTML5]网关的生产版本,完全取代了Comet方式,并在浏览器和应用服务器之间启用了全双工连接。

您也可以查看Light Streamer Demos


1

4
在短时间内在多个问题中批量发布完全相同的答案往往会引起一些警报... - Marc Gravell
2
(psst) - user1228

1

我曾经很久以前使用过一个聊天网站,它使用了一个定制的http流服务器。出于好奇,我曾经复制过那个软件,而且我认为这很容易做到。但是,我永远不会尝试在IIS中实现类似的“无限请求”,特别是在ASP.NET中,因为这些请求会无限期地占用线程池线程(或IO线程,如果使用异步处理程序),这意味着您每台服务器只能处理线程池配置允许的数量。

如果我有一个强烈的合法需要这样的功能,我会诚实地为它编写一个定制的http服务器。

我知道这并没有真正回答你的问题,但我认为这个输入可能是相关的。


0

我认为Comet方法在不准备通过横向扩展Web服务器(通过添加更多的Web服务器到组合中)来扩展时,实际上并不可扩展。它的工作方式是针对每个用户会话保留一个TCP连接,这样服务器可以定期将内容推送到该连接中,以立即通知用户有关更改或活动。


6
所有事物只能垂直扩展到一定程度,之后必须进行水平扩展。 - Anton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接