SignalR如何在内部工作?


160

谁能让我知道SignalR如何在内部进行高水平的工作?

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


13
@dfowler最近接受了Scott Hansleman的采访,内容非常丰富hanselminutes.com/291/…
2012年

1
关于信号R架构,以及如何好文章它的工作原理lostechies.com/erichexter/2012/11/05/... asp.net/signalr/overview/getting-started/...
马赫什

我很早以前就知道了,但是microsoftvirtualacademy.com/Content/…–
lordkain

1
还可以在David Fowler和Damian Edwards在NDC 2013上看到的这个演讲,名为“ ASP.NET SignalR的幕后花絮”,他们在舞台上现场搭建了精简版SignalR。非常有用。它是2.0之前的版本,但这无关紧要。vimeo.com/68383353
约翰B

Answers:


241

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

SignalR有一些内置的传输器:

  1. Web套接字
  2. 服务器发送事件
  3. 永远的框架
  4. 长时间轮询

SignalR尝试选择服务器和客户端支持的“最佳”连接(您也可以强制其使用特定的传输)。

那是高水平。如果要查看每种传输的实现方式,可以查看源代码

每个传输也都有客户端代码:https : //github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS

如果您询问长轮询传输特别如何工作:

它将ajax请求发送到正在异步等待信号响应的服务器。当有信号或请求超时时,它从服务器返回并发送另一个请求,然后过程继续。(我遗漏了一些有关客户端如何跟踪所见内容的详细信息,因此不会丢失消息)

希望这能回答您的大部分问题。


3
您能告诉我一次可以支持多少个连接吗?
Farhad-Taran

1
Signalr将支持多少个连接取决于IIS的请求限制。可以使用配置条目或shell脚本来增加它。通常,Signaler在内存中缓存1000个connectiosn。
Thanigainathan 2014年

1
如前所述,限价反弹是在服务器级别。Damnien Edwards(SignalR的共同创建者)虽然从单个10GB服务器获得了150,000个连接: twitter.com/DamianEdwards/status/486642486350061568
LDJ 2014年

这个问题的任何答案stackoverflow.com/q/40906789/3565879
Technacron


5

@davidfowl已经回答了大部分。但是,要提供有关传输行为差异的更多详细信息,尤其是WebSocket和其他传输之间的行为差​​异;以下是几点。

  • WebSocket是唯一在客户端和服务器之间建立真正的持久性双向连接的传输方式。但是,只有IIS 8或更高版本以及Internet Explorer,Google Chrome和Mozilla Firefox的最新版本才支持WebSocket。
  • 服务器发送事件,永久帧和长轮询时,所有这三个都遵循单向通信,并且大多数浏览器都支持。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.