SignalR 如何在内部工作?
Posted
技术标签:
【中文标题】SignalR 如何在内部工作?【英文标题】:How SignalR works internally? 【发布时间】:2011-12-10 01:27:24 【问题描述】:谁能告诉我 SignalR 在内部是如何以高级方式工作的?
我猜它正在使用Response.Flush
刷新数据,并且在客户端它以特定间隔发送 Ajax 请求。对吗?
【问题讨论】:
@dfowler 最近接受了 Scott Hansleman 的采访,内容非常丰富hanselminutes.com/291/…。 关于signal r架构及其工作原理的好文章lostechies.com/erichexter/2012/11/05/…asp.net/signalr/overview/getting-started/… 我很久以前就知道了,但是microsoftvirtualacademy.com/Content/… 另请参阅 David Fowler 和 Damian Edwards 在 NDC 2013 上的演示文稿,名为“Under the Covers with ASP.NET SignalR”,他们在舞台上构建了一个精简版 SignalR。这是非常有用的。它是 2.0 之前的版本,但这并不重要。 vimeo.com/68383353 【参考方案1】:不,SignalR 是对连接的抽象。它为您提供了两种基于该连接的编程模型(集线器和持久连接)。 SignalR 有一个传输的概念,每个传输决定如何发送/接收数据以及如何连接和断开连接。
SignalR 有一些内置传输:
-
WebSockets
服务器发送事件
永远的框架
长轮询
SignalR 尝试选择服务器和客户端支持的“最佳”连接(您也可以强制它使用特定的传输)。
这是高级别的。如果你想了解每个传输是如何实现的,可以查看source code。
还有每个传输的客户端代码: https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS
如果您特别询问长轮询传输的工作原理:
它向异步等待信号响应的服务器发送一个 ajax 请求。当有信号或请求超时时,它从服务器返回并发送另一个请求并继续该过程。 (我遗漏了一些关于客户端如何跟踪它所看到的内容以便它不会错过消息的细节)
希望这能回答您的大部分问题。
【讨论】:
你能告诉我它一次可以支持多少个连接吗? Signalr 将支持多少连接取决于 IIS 的请求限制。可以使用配置条目或 shell 脚本来增加它。通常 Signalr 在内存中缓存 1000 个连接。 如前所述,限价反弹是在服务器级别。 Damnien Edwards(SignalR 的共同创建者)已经从单个 10GB 服务器获得了 150,000 个连接:twitter.com/DamianEdwards/status/486642486350061568【参考方案2】:@davidfowl 已经回答了大部分内容。但是,为了提供有关传输行为差异的更多详细信息,特别是 WebSocket 和其他传输之间的差异;以下是一些要点。
WebSocket 是唯一一种在客户端和服务器之间建立真正持久的双向连接的传输方式。但是,WebSocket 仅受 IIS 8 或更高版本以及最新版本的 Internet Explorer、Google Chrome 和 Mozilla Firefox 支持。 虽然服务器发送事件、永久帧和长轮询,但所有这三个都遵循单向通信,并且受到大多数浏览器的支持。【讨论】:
以上是关于SignalR 如何在内部工作?的主要内容,如果未能解决你的问题,请参考以下文章