任何人都可以让我知道SignalR如何以高水平的方式在内部工作?
我猜它正在使用 Response.Flush 刷新数据,并且在客户端它以一定的间隔发送Ajax请求 . 这是对的吗?
Response.Flush
不,SignalR是连接的抽象 . 它为您提供了两个通过该连接的编程模型(集线器和持久连接) . SignalR具有传输概念,每个传输决定数据的发送/接收方式以及连接和断开连接的方式 .
SignalR有一些内置传输:
WebSockets
服务器已发送事件
永远的框架
长轮询
SignalR尝试选择服务器和客户端支持的“最佳”连接(您也可以强制它使用特定的传输) .
这是高水平 . 如果要查看每个传输的实现方式,可以查看source code .
每个传输都有客户端代码:https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS
如果您询问长轮询运输如何运作:
它向服务器发送一个ajax请求,该服务器异步等待信号响应 . 当有信号或请求超时时,它从服务器返回并发送另一个请求并继续该过程 . (我留下了一些关于客户如何跟踪它所看到的内容以及它不会错过消息的细节)
希望这能回答你的大部分问题 .
@davidfowl已经回答了主要部分 . 但是,要提供有关传输行为差异的更多细节,特别是WebSocket和其他传输之间的差异;以下是一些要点 .
WebSocket是唯一一种在客户端和服务器之间 Build 真正持久的双向连接的传输 . 但是,WebSocket仅受IIS 8或更高版本以及Internet Explorer,Google Chrome和Mozilla Firefox的最新版本支持 .
虽然服务器发送事件,永久帧和长轮询,但这三者都遵循单向通信,并且大多数浏览器都支持这些通信 .
2 回答
不,SignalR是连接的抽象 . 它为您提供了两个通过该连接的编程模型(集线器和持久连接) . SignalR具有传输概念,每个传输决定数据的发送/接收方式以及连接和断开连接的方式 .
SignalR有一些内置传输:
WebSockets
服务器已发送事件
永远的框架
长轮询
SignalR尝试选择服务器和客户端支持的“最佳”连接(您也可以强制它使用特定的传输) .
这是高水平 . 如果要查看每个传输的实现方式,可以查看source code .
每个传输都有客户端代码:https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS
如果您询问长轮询运输如何运作:
它向服务器发送一个ajax请求,该服务器异步等待信号响应 . 当有信号或请求超时时,它从服务器返回并发送另一个请求并继续该过程 . (我留下了一些关于客户如何跟踪它所看到的内容以及它不会错过消息的细节)
希望这能回答你的大部分问题 .
@davidfowl已经回答了主要部分 . 但是,要提供有关传输行为差异的更多细节,特别是WebSocket和其他传输之间的差异;以下是一些要点 .
WebSocket是唯一一种在客户端和服务器之间 Build 真正持久的双向连接的传输 . 但是,WebSocket仅受IIS 8或更高版本以及Internet Explorer,Google Chrome和Mozilla Firefox的最新版本支持 .
虽然服务器发送事件,永久帧和长轮询,但这三者都遵循单向通信,并且大多数浏览器都支持这些通信 .