【问题标题】:How SignalR works internally?SignalR 如何在内部工作?
【发布时间】:2011-12-10 01:27:24
【问题描述】:

谁能告诉我 SignalR 在内部是如何以高级方式工作的?

我猜它正在使用Response.Flush 刷新数据,并且在客户端它以特定间隔发送 Ajax 请求。对吗?

【问题讨论】:

标签: signalr


【解决方案1】:

不,SignalR 是对连接的抽象。它为您提供了两种基于该连接的编程模型(集线器和持久连接)。 SignalR 有一个传输的概念,每个传输决定如何发送/接收数据以及如何连接和断开连接。

SignalR 有一些内置传输:

  1. WebSockets
  2. 服务器发送事件
  3. 永远的框架
  4. 长轮询

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 支持。
  • 虽然服务器发送事件、永久帧和长轮询,但所有这三个都遵循单向通信,并且受到大多数浏览器的支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-19
    • 2019-01-13
    • 2010-10-14
    • 2013-09-28
    • 2012-08-01
    • 2018-02-10
    • 2014-09-29
    • 2011-03-18
    相关资源
    最近更新 更多