ASP.NET Core SignalR (四)【上】:在SignalR中使用 中心(hubs)
此为系列文章,对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 结束之前完成。
上下文对象
中心 类包含一个上下文对象,其包含了下列可以提供连接信息的一些属性:
Property | Description |
---|---|
ConnectionId |
获取连接的唯一ID,其由SignalR分配。每一个连接都会有一个连接ID. |
UserIdentifier |
获取用户身份,默认的,SignalR使用 与连接关联的ClaimsPrincipal 的 ClaimTypes.NameIdentifier 作为用户标识 |
User |
获取与当前用户关联的ClaimsPrincipal。
|
Items |
获取可用于在此连接的范围内共享数据的键/值集合。 数据可以存储在此集合中,它将在不同的中心方法调用中持久保存。 |
Features |
获取连接上的可用功能的集合。 目前,在大多数情况下不需要此集合,因此不会对其进行详细介绍。 |
ConnectionAborted |
获取在连接中止时通知的 CancellationToken 。 |
Hub.Context 也包含了如下的方法:
方法 | 描述 |
---|---|
GetHttpContext |
返回对于此连接的HttpContext对象,如果这个连接没有关联一个HTTP 请求,那么便会返回 null。对于HTTP 连接,你可以使用此方法来获取例如HTTP请求头以及查询字符串之类的信息。 |
Abort |
终止连接 |
客户端对象
Hub 类 具有一个 Clients 对象,其为了服务端与客户端之前的通信包含了如下属性:
属性 | 描述 |
---|---|
All |
在所有已连接的客户端上调用一个方法 |
Caller |
在调用中心方法的客户端上调用一个方法 |
Others |
在除过调用中心 方法的那个客户端之外的所有客户端上调用一个方法 |
Hub.Clients 同样也包含了如下方法:
Method | Description |
---|---|
AllExcept |
除过特定的连接外,在所有已连接的客户端上调用一个方法 |
Client |
在一个特定的已连接的客户端上调用一个方法 |
Clients |
在特定的已连接的客户端上调用一个方法 |
Group |
在特定分组的所有连接上调用一个方法 |
GroupExcept |
在一个特定分组除了特定连接之外的其他所有连接上调用一个方法 |
Groups |
在多个分组连接上调用一个方法 |
OthersInGroup |
在一个分组的连接上调用方法,而不包含调用 中心 方法的那个连接 |
User |
在一个特定用户关联的所有连接上调用方法 |
Users |
在多个特定用户关联的所有连接上调用方法 |
上表中的每一个属性都会返回一个带有SendAsync方法的对象。SendAsync
方法允许你提供客户端方法的名称和参数用以调用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南