ASP.NET Core SignalR ,四【上】:在SignalR中使用 中心

此为系列文章,对MSDN ASP.NET Core SignalR 的官方文档进行系统学习与翻译。其中或许会添加本人对 ASP.NET Core 的浅显理解。

什么是SignalR 的 中心

SignalR hubs API 使你能够从服务端调用已连接的客户端的方法。在服务端代码,你可以定义被客户端调用的方法。而在客户端,你可以定义从服务端调用的方法。SignalR负责使得实时服务端到客户端以及客户端到服务端的通信成为可能的场景之后的所有事情。

配置SignalR 中心

SignalR 中间件需要一些服务,其通过调用 services.AddSignalR 来进行配置。

services.AddSignalR();

当为ASP.NET Core app 添加了 SignalR 功能时,通过调用endpoint.MapHub 来设置SignalR路由,其位于Startup.Configure 方法中的app.UseEndpoints 回调中。

app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<ChatHub>("/chathub");
});

创建以及使用 中心(hubs)

通过声明一个继承自 Hub 的类来声明一个中心,并为这个新建的类添加公共的方法。客户端可以调用被定义为public 的方法。

public class ChatHub : Hub
{
    public Task SendMessage(string user, string message)
    {
        return Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

你可以指定返回类型以及参数,包括复杂的类型以及数组,如同你在任何C#方法中所做的那样。SignalR会处理在你的参数以及返回值中的复杂对象的序列化以及反序列化的。

注意:中心(hubs)是瞬变的(transient) 。

  • 不要在 中心 类的属性中存储状态。每一个 中心 方法的调用都是在一个新的 中心 实例上进行的。
  • 当调用依赖于 中心 保存活动的异步方法时,请使用await。举个例子,形如这样的方法调用Clients.All.SendAsync(...) 如果其在没有await 的情况下被调用,那么其会失败,这是因为 中心 方法 会在 SendAsync 结束之前完成。

上下文对象

中心 类包含一个上下文对象,其包含了下列可以提供连接信息的一些属性:

PropertyDescription
ConnectionId获取连接的唯一ID,其由SignalR分配。每一个连接都会有一个连接ID.
UserIdentifier获取用户身份,默认的,SignalR使用 与连接关联的ClaimsPrincipalClaimTypes.NameIdentifier 作为用户标识
User获取与当前用户关联的ClaimsPrincipal。

Items数据可以存储在此集合中,它将在不同的中心方法调用中持久保存。
Features目前,在大多数情况下不需要此集合,因此不会对其进行详细介绍。
ConnectionAborted获取在连接中止时通知的 CancellationToken

Hub.Context 也包含了如下的方法:

方法描述
GetHttpContext返回对于此连接的HttpContext对象,如果这个连接没有关联一个HTTP 请求,那么便会返回 null。对于HTTP 连接,你可以使用此方法来获取例如HTTP请求头以及查询字符串之类的信息。
Abort终止连接

客户端对象

Hub 类 具有一个 Clients 对象,其为了服务端与客户端之前的通信包含了如下属性:

属性描述
All在所有已连接的客户端上调用一个方法
Caller在调用中心方法的客户端上调用一个方法
Others在除过调用中心 方法的那个客户端之外的所有客户端上调用一个方法

Hub.Clients 同样也包含了如下方法:

MethodDescription
AllExcept除过特定的连接外,在所有已连接的客户端上调用一个方法
Client在一个特定的已连接的客户端上调用一个方法
Clients在特定的已连接的客户端上调用一个方法
Group在特定分组的所有连接上调用一个方法
GroupExcept在一个特定分组除了特定连接之外的其他所有连接上调用一个方法
Groups在多个分组连接上调用一个方法
OthersInGroup在一个分组的连接上调用方法,而不包含调用 中心 方法的那个连接
User在一个特定用户关联的所有连接上调用方法
Users在多个特定用户关联的所有连接上调用方法

上表中的每一个属性都会返回一个带有SendAsync方法的对象。SendAsync 方法允许你提供客户端方法的名称和参数用以调用。