Signalr 信号器如何在内部工作?

Signalr 信号器如何在内部工作?,signalr,Signalr,有人能让我知道Signal是如何以高水平的方式在内部工作的吗 我猜它正在使用Response.Flush刷新数据,并且在客户端,它正在以一定的间隔发送Ajax请求。是否正确?否,信号器是连接上的抽象。它在该连接上提供了两种编程模型(集线器和持久连接)。信号器有一个传输的概念,每个传输决定如何发送/接收数据以及如何连接和断开连接 信号机有一些内置的传输: 网袋 服务器发送事件 永久框架 长轮询 SignalR尝试选择服务器和客户端支持的“最佳”连接(您也可以强制它使用特定的传输) 这是高水平的。如

有人能让我知道Signal是如何以高水平的方式在内部工作的吗


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

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

信号机有一些内置的传输:

  • 网袋
  • 服务器发送事件
  • 永久框架
  • 长轮询
  • SignalR尝试选择服务器和客户端支持的“最佳”连接(您也可以强制它使用特定的传输)

    这是高水平的。如果您想了解每个传输是如何实现的,可以查看

    每个传输也有客户机代码:

    如果您特别询问长轮询传输的工作原理:

    它向正在异步等待信号响应的服务器发送ajax请求。当有信号或请求超时时,它从服务器返回并发送另一个请求,该过程继续。(我遗漏了一些关于客户端如何跟踪它所看到的内容以避免遗漏消息的细节)


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

    @davidfowl已经回答了大部分问题。然而,提供有关传输行为差异的更多细节,特别是WebSocket和其他传输之间的差异;以下是一些要点

    • WebSocket是在客户端和服务器之间建立真正持久的双向连接的唯一传输。但是,WebSocket仅受IIS 8或更高版本以及最新版本的Internet Explorer、Google Chrome和Mozilla Firefox的支持
    • 虽然服务器发送事件、永久帧和长轮询,但这三种方式都遵循单向通信,并且受到大多数浏览器的支持

    @dfowler最近对Scott Hansleman进行了一次采访,内容非常丰富。关于signal r架构及其工作原理的好文章我知道这是很久以前的事了,但也看到了David Fowler和Damian Edwards在2013年NDC上的这篇演讲,名为“用ASP.NET signal r进行掩护”,他们在那里构建了一个精简版的signal r live在舞台上。它的信息量很大。它是2.0之前的版本,但这不重要。你能告诉我它一次能支持多少个连接吗?关于信号器支持多少个连接取决于IIS的请求限制。可以使用配置条目或shell脚本来增加它。通常Signal在内存中缓存1000个ConnectionsN。如前所述,限制在服务器级别。Damnien Edwards(SignalR的共同创建者)已从单个10GB服务器获得150000个连接,但: