ASP.NET 的 Comet 实现? [关闭]
Posted
技术标签:
【中文标题】ASP.NET 的 Comet 实现? [关闭]【英文标题】:Comet implementation for ASP.NET? [closed] 【发布时间】:2010-09-09 02:29:00 【问题描述】:我一直在寻找在浏览器中实现类似 gmail 的消息传递的方法,并得出了Comet 的概念。但是,我还没有找到一个好的 .NET 实现来允许我在 IIS 中执行此操作(我们的应用程序是用 ASP.NET 2.0 编写的)。
我找到的(或可能想到的)解决方案需要为每个用户留下一个正在运行的线程 - 这样它就可以在他收到消息后向他返回响应。当然,这根本无法扩展。
所以我的问题是 - 你知道以不同方式工作的 Comet 的 ASP.NET 实现吗? IIS甚至可能吗?
【问题讨论】:
我猜最初的 MS 支持的实现是 SignalR:hanselman.com/blog/… Azure 现在支持 Node.JS,很快 2003 上的 IIS 将得到支持。这意味着我们将能够在 IIS 中运行彗星服务器 (windowsazure.com/en-us/develop/nodejs) 【参考方案1】:由于 Comet 的持久连接性,Comet 很难通过 IIS 进行扩展,但现在有一个团队正在研究 Comet 方案。另请查看Aaron Lerch's blog,因为我相信他在 ASP.NET 中完成了一些早期的 Comet 工作。
【讨论】:
这个是实际实现的;根据 Anton 在下面的回复,查看 WebSync。 (frozenmountain.com/websync) 有人叫反向ajax吗?看看这个:pokein.codeplex.com MVC 异步控制器可以通过将等待卸载到非 IIS 工作线程来帮助解决 IIS 问题,请参阅great post by Clay Lenhart。另请参阅 BitBucket 上的Chat Server Example Project。【参考方案2】: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 缓存支持集群,但可以为几乎任何东西(Redis、NCache)编写自定义提供程序。
免责声明:我为开发此产品的公司工作。
【讨论】:
这里应该有一个免责声明,因为它是你的产品...... 当然,它是由我工作的公司生产的 :) 绝对不会试图隐藏任何东西。 @Anton - 不隐藏不等于公开。 @Anton 您能否详细说明它如何支持每个服务器节点多达 20k 个并发客户端连接?这些数字看起来,嗯..“太大了”。 我认为从 25,000 英尺的角度来看,从概念上询问 websync 是如何工作的并不明智。【参考方案3】:我最近使用基于 great article by Clay Lenhart 的 MVC 3 异步控制器编写了 simple example of a Long Polling Chat Server
您可以使用我根据BitBucket项目的源设置的example on a AppHarbor deployment。
另外,更多信息可从我的blog post explaining the project获得。
【讨论】:
我喜欢 AppHarbor 部署中的示例 '解释项目的博文' --> web.archive.org/web/20130328042214/http://… 谢谢!很高兴您喜欢这篇文章。【参考方案4】:实际上,使用 ASP.NET 创建支持 ajax 的网站有很多选择,但老实说,PokeIn 是创建彗星 ajax 支持的 Web 应用程序的最简单方法。它挽救了我公司的一个项目。
【讨论】:
【参考方案5】:您还可以查看Kaazing Enterprise Gateway,它已经发布了他们的 webSocket [html5] 网关的生产版本,它完全取代了彗星方式并启用了浏览器和应用程序服务器之间的全双工连接。
你也可以看看Light Streamer Demos
【讨论】:
【参考方案6】:我很久以前曾经使用过一个聊天网站,它使用了一个定制的 http 流服务器。实际上,出于纯粹的好奇心,我曾一度复制了该软件,我认为这很容易做到。我永远不会尝试在 IIS 中实现类似类型的“无限请求”,尤其是在 ASP.NET 中,因为请求会无限期地占用线程池线程(或 IO 线程,如果使用异步处理程序),这意味着您只能在您的线程池配置允许的范围内处理每个服务器的数量。
如果我对此类功能有强烈的合法需求,我会诚实地为它编写一个自定义 http 服务器。
我知道这并不能真正回答您的问题,但我认为输入可能是相关的。
【讨论】:
【参考方案7】:WS-I 小组发布了一个名为 "Reliable Secure Profile" 的东西,其中有一条玻璃鱼,.NET implementation 显然是 inter-operate。
运气好的话,还有一个Javascript 实现。
还有一个 Silverlight 实现,它使用 HTTP Duplex. 您可以在推送发生时通过 connect javascript to the Silverlight 对象获取回调。
还有commercial paid versions。
【讨论】:
在多个问题上连续大量发布完全相同的答案往往会导致一些问题...... (psst)【参考方案8】:我认为 Comet 方法不是真正可扩展的,除非您准备横向扩展网络场(通过添加更多网络服务器来混合)。它的工作方式是让每个用户会话都打开一个 TCP 连接,这样服务器就可以不时将内容推送到该连接中,以立即通知用户更改或活动。
【讨论】:
一切都只能垂直缩放到一个点,之后必须进行水平缩放。以上是关于ASP.NET 的 Comet 实现? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Comet/Reverse AJAX 的现代实现如何工作?任何稳定的 C# WCF 或 ASP.NET 实现?
Comet 现在是不是已经过时了 Server-Sent Events 和 WebSocket? [关闭]
是否有任何用于 ASP.NET MVC 应用程序的优秀开源 Comet Web 服务器?
Asp.net怎样实现点击连接跳转到另一页面后将本页面关闭?