11

我在 MVC 3 中有一个应用程序,我希望将 WebSockets(回退到 Comet)添加到它。

我进行了一些研究,发现彗星部分非常简单,我宁愿自己做。只需要 AsyncControllers 和一些非常简单的 js 就可以处理那些长期存在的 ajax 请求。

现在,在 WebSocket 的情况下,事情开始变得肮脏。我查看了一些库,但它们似乎大多设置了自己的 Web 服务器(因此需要另一个主机或端口),并在那里监听 ws 协议请求。例如SuperWebSocket就是这种情况,起初它看起来不错,但出现了“我是 Web 服务器”的问题(这当然很好,但我宁愿避免)。

然后我查看了“PingIt”或类似的东西,我现在找不到链接..,但我确实在另一台计算机上有源代码。这个确实在 mvc 的端点上运行,但我不太喜欢它处理事情的方式,比如它需要一个 IDisposable 对象并通过反射器创建一个在客户端呈现的 JavaScript 片段,这是非常污染的他们图书馆的名字,我真的不感兴趣,而且感觉很多东西都被扔进了我可能希望的地方,这违背了我对页面应该如何呈现的看法(特别是现在我正在研究 MVC,这几乎意味着我可以编写干净、不显眼的 html 页面)。

基本上我想要的是我的端点是这样的:

domain.com/rt/comet
domain.com/rt/socket

而不是

domain.com/rt/comet
domain.com:81/

那么:是否可以在 asp.net MVC 应用程序的控制器内的端点上接收 websocket 连接(并进行握手和任何需要做的事情),而不是在某处设置 tcplistener?

这也将帮助我让我的彗星代码更接近我的 websocket 代码

我应该说我对整个 comet/websockets 的事情非常陌生,所以我对协议的了解并不多(或任何),我确实了解如何使彗星工作,但在 websockets 中并不了解,尽管我'已经阅读并理解了基本知识以了解其要点。

另外:请让我知道我的要求是否离题

4

3 回答 3

18

只是同意评论并提供一些链接。SignalR 是要走的路。

网站:http ://signalr.net/和http://www.asp.net/signalr

代码:https ://github.com/SignalR/SignalR

努盖特:Install-Package Microsoft.AspNet.SignalR -pre

好的起点:

来自其中一位创作者的视频:http: //vimeo.com/43659069 <--[大量信息!]

于 2012-07-11T05:32:48.737 回答
4

作为 WebSockets 上此线程的参考点 - 我希望您注意,乍一看,WebSockets 看起来是显而易见的选择。该 API 旨在通过单个 TCP 套接字在浏览器和服务器之间提供双向通信通道。它已被 IETF 标准化,最新的 Chrome、Firefox、IE 和 Opera 浏览器都支持 WebSockets。它旨在通过减少 HTTP 消息开销来最小化带宽开销。那么,有什么不喜欢的呢?

就像任何感知到的灵丹妙药一样,事情并不总是它们看起来的那样。存在很多问题:

浏览器支持:截至 2012 年 6 月,目前使用的浏览器中只有 47.64% 实际支持 WebSockets http://caniuse.com/websockets - 这意味着,无论 WebSockets 看起来多么好,您仍然需要第二个“后备”解决方案来支持广大网民。而且由于大多数“后备”解决方案都涉及 Flash,因此您在 iOS 和其他移动设备上仍然不走运。

从这篇博客文章中了解更多关于现实中的 WebSockets:HTML5 WebSockets 网关和服务器是实时数据推送的灵丹妙药吗

浏览器支持更新:截至 2019 年 5 月,目前使用的浏览器中有96.77%实际支持 WebSockets http://caniuse.com/websockets

于 2012-07-23T22:22:41.513 回答
1

我进行了一些研究,发现彗星部分非常简单,我宁愿自己做。只需要 AsyncControllers 和一些非常简单的 js 就可以处理那些长期存在的 ajax 请求。

抱歉,没那么容易。不同的浏览器以不同的方式运行,并使用不同的技术表现更好 - XMLHttpRequest、XDomainRequest、ActiveX 对象、Multpart 替换、Long-Polling、Streaming。正因为如此,而且这些解决方案没有明确的规范,Comet 只是一个 hack。服务器发送事件 (EventSource API) 和 WebSockets 的设计初衷是提供从服务器向客户端推送数据的最有效和标准化的方式,更重要的是,WebSockets 被设计用于客户端之间的实时双向通信和一个服务器。

现在,在 WebSocket 的情况下,事情开始变得肮脏。我查看了一些库,但它们似乎大多设置了自己的 Web 服务器(因此需要另一个主机或端口),并在那里监听 ws 协议请求。例如 SuperWebSocket 就是这种情况,起初它看起来不错,但出现了“我是 Web 服务器”的问题(这当然很好,但我宁愿避免)。

Windows Server 8 将原生支持 WebSockets。在此之前,您需要使用单独的“Web 服务器”,例如XSockets或 SuperWebSockets(您已经引用过)。还有Alchemy WebSocketsFleck

但是因为微软正在推动SignalR向前发展,它最有可能获得充分的牵引力,甚至成为标准 ASP.NET MVC 堆栈的一部分(它可能已经计划好了,我在 MS 方面有点落后了)。SignalR 具有 WebSocket 支持(或具有模块),并将处理支持用户浏览器的传输机制的回退。

有关自托管解决方案(还有更多 .NET/IIS 选项)的更多信息,请查看这些自托管实时服务

我非常有兴趣了解 IIS 在处理数千个持久连接时如何扩展 - 它是否已针对 Windows Server 8 重新编写?多久之后您需要引入负载均衡器并进行水平扩展?如果这不是您有兴趣担心的事情,那么我会考虑托管实时服务

于 2012-07-11T14:27:33.770 回答