什么是 ASP.NET Core SignalR?

已完成

所有连接了 Internet 的应用程序都由服务器和客户端组成。 客户端依赖于服务器获取数据,而它们获取数据的主要机制是通过发出超文本传输协议 (HTTP) 请求来进行的。 某些客户端应用程序需要经常更改的数据。

ASP.NET Core SignalR 提供了一个 API,用于创建服务器到客户端远程过程调用 (RPC)。 RPC 从服务器端 .NET Core 代码中调用客户端上的函数。 支持多个平台,每个平台都有各自的客户端 SDK。 因此,RPC 调用所调用的编程语言可能会有所不同。

这有助于熟悉与 SignalR 关联的常见术语。 在本单元中,你将了解服务器应用程序中所需的 SignalR 组件,而不是客户端应用程序中所需的组件。 此外,你还将了解各种双工通信机制。 SignalR 封装了多个实时协议,消除了各个实现的复杂性。 有关详细信息,请参阅 ASP.NET Core SignalR 文档。

以下部分介绍了 SignalR 中使用的主要术语。

传输

SignalR 支持以下方法(或传输)来处理实时通信:

  1. WebSockets
  2. Server-Sent Events
  3. 长轮询

上面列出的传输的顺序表示其正常回退顺序。 换句话说,Websocket 优于 Server-Sent Events,而 Server-Sent Events 优于 Long Polling,但是这三种传输方式皆可用。 SignalR 会自动在服务器和客户端的能力范围内选择最佳的传输方法。 有关详细信息,请参阅 SignalR 传输协议的正式规范。

服务器

服务器负责公开 SignalR 终结点。 终结点映射到 HubHub<T> 子类。 服务器可存在于本地、云提供商(如 Azure)或 Azure SignalR 服务中。 服务器公开可以从客户端调用的中心方法以及客户端可以订阅的事件。 它们被视为远程过程。

集线器

在 SignalR 中,hub 用于在客户端和服务器之间进行通信。 中心是一种高级管道,允许客户端和服务器相互调用方法。 为此,SignalR 会自动跨计算机边界处理调度。 你可以将中心看作是所有连接的客户端和服务器之间的代理。

协议

SignalR 协议是通过任意基于消息的传输实现双向 RPC 的协议。 连接中的任何一方都可以对另一方调用程序,并且程序可以返回零个或多个结果或者返回错误。 SignalR 提供了两个内置的 hub 协议:

  • 基于 JSON 的文本协议,这是默认值。
  • 基于 MessagePack 的二进制协议,与 JSON 相比,MessagePack 通常会创建较小的消息。

若要使用 MessagePack 协议,服务器和客户端都需要选择加入以对其进行配置,并且服务器和客户端都必须支持它。 还有第三个中心协议,名为 BlazorPack,但它仅用于 Blazor-Server 应用程序。 在没有 Blazor-Server 托管模型的情况下,无法使用该协议。 有关详细信息,请参阅 SignalR Hub 协议的官方规范。

用户

系统中的用户是一个个体,但也可以是组的一部分。 消息可以发送到组,所有组成员都会收到通知。 单个用户可以从多个客户端应用程序进行连接。 例如,同一用户可以使用一个移动设备和一个 Web 浏览器,同时在这两个上获取实时更新。

一个组包含一个或多个连接。 服务器可以创建组,将连接添加到组,以及从组中删除连接。 组具有指定的名称,该名称充当其唯一标识符。 组充当范围界定机制来帮助定位消息。 也就是说,实时功能只能发送给已命名组中的用户。

连接

与中心的连接由唯一标识符表示,该标识符只有服务器和客户端知道。 每个 hub 类型都存在单个连接。 每个客户端都有一个到服务器的唯一连接。 也就是说,单个用户可以在多个客户端上表示,但每个客户端连接都有各自的标识符。

客户端

客户端负责通过 HubConnection 对象建立到服务器终结点的连接。 Hub 连接在每个目标平台中表示:

有关详细信息,请参阅 ASP.NET Core SignalR 支持的平台

当中心连接实例成功启动后,消息可以自由地双向流动。 用户可以自由地将通知发送到服务器,以及从服务器接收通知。 客户端是任何已连接的应用程序,例如 Web 浏览器、移动应用或桌面应用等。