我找到的解决方案(或者说能想到的解决方案)需要为每个用户保留一个运行线程,以便他在收到消息后能够返回响应。当然,这根本无法扩展。
因此,我的问题是 - 您是否知道在ASP.NET中实现Comet的不同方式?这在IIS中可能吗?
由于Comet的持久连接特性,使用IIS扩展Comet任务存在挑战,但目前有一个团队正在研究Comet场景。此外,建议查看Aaron Lerch的博客,因为我认为他在ASP.NET方面做了一些早期的Comet工作。
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)。
免责声明: 我在开发此产品的公司工作。
我最近基于Clay Lenhart的一篇 文章,使用MVC 3异步控制器编写了一个简单的长轮询聊天服务器示例,源代码可以在BitBucket项目中获取。
您也可以使用我在AppHarbor上部署的示例,该示例是基于BitBucket项目中的代码。
此外,我还在我的博客文章中解释了这个项目,提供更多信息。
您也可以查看Light Streamer Demos。
WS-I组发布了一个名为"可靠安全配置文件"的东西,其中包括一个Glass Fish和.NET实现,显然它们之间可以很好地互操作。
幸运的是,可能还有一个Javascript实现。
还有一个使用HTTP Duplex的Silverlight实现。您可以将javascript连接到Silverlight对象,以在推送发生时获取回调。
同时也有商业付费版本可供选择。
我曾经很久以前使用过一个聊天网站,它使用了一个定制的http流服务器。出于好奇,我曾经复制过那个软件,而且我认为这很容易做到。但是,我永远不会尝试在IIS中实现类似的“无限请求”,特别是在ASP.NET中,因为这些请求会无限期地占用线程池线程(或IO线程,如果使用异步处理程序),这意味着您每台服务器只能处理线程池配置允许的数量。
如果我有一个强烈的合法需要这样的功能,我会诚实地为它编写一个定制的http服务器。
我知道这并没有真正回答你的问题,但我认为这个输入可能是相关的。
我认为Comet方法在不准备通过横向扩展Web服务器(通过添加更多的Web服务器到组合中)来扩展时,实际上并不可扩展。它的工作方式是针对每个用户会话保留一个TCP连接,这样服务器可以定期将内容推送到该连接中,以立即通知用户有关更改或活动。