钱行慕

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

统计

ASP.NET Core SignalR (六):在SignalR中管理用户和分组

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

       SignalR 允许消息被发送给关联给特定用户的所有连接,以及命名的连接分组。

SignalR中的用户

       SignalR 允许你将消息发送给关联给特定用户的所有连接。默认情况下,SignalR使用与连接关联的来自于ClaimsPrincipal 的ClaimTypes.NameIdentifier作为用户标识。对于一个SignalR app 来说,一个单独的用户可以具有多个连接。比如,一个用户可以在其桌面上被连接,也可以在他的iPhone上连接。每一个设备都有一个独立的连接。但是它们都关联到一个相同的用户。如果消息被发送给这个用户,那么所有关联到这个用户的连接都会收到这个消息。可以通过你的 Hub 类的Context.UserIdentifier 属性来获取到这个连接的用户标识。

       通过将用户标识传递给你的 Hub 类中的 User 函数来给特定的用户发送消息,如下示例所示:

       注意,用户标识是大小写敏感的。

public Task SendPrivateMessage(string user, string message)
{
    return Clients.User(user).SendAsync("ReceiveMessage", message);
}

SignalR中的分组

      一个分组是关联到一个名称的连接的集合。消息可以被发送给一个分组中的所有连接。如果要发送给一个或者多个连接,分组是我们推荐的方式,这是因为分组是被应用程序管理的。一个连接可以是多个分组的成员。这使得分组对于像聊天程序这样的情形来说,是理想的选择,在这种情形下,每个聊天室都表示为一个分组。通过 AddToGroupAsync 和 RemoveFromGroupAsync 方法,连接可以被添加到一个分组,或者从一个分组中移除。

复制代码
public async Task AddToGroup(string groupName)
{
    await Groups.AddToGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
}

public async Task RemoveFromGroup(string groupName)
{
    await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
}
复制代码

       当一个连接重连时,分组成员不会被保存。当一个连接被重新建立时,它需要再次加入分组。要对分组的成员进行计数是不可能的,这是因为如果应用程序被扩展到多个服务器,此信息是不可用的。

       在使用分组时,为了保护对资源的访问,可以使用 ASP.NET Core 的  authentication and authorization 功能。当用户凭证对于分组是有效的时,如果你仅添加用户到分组中,那么发送给这个分组的消息仅仅会发送到授权用户。然而,分组并不是一个安全的特性。验证声明具有分组所不具有的特性,比如过期,撤销。如果一个用户对分组的访问许可被撤销了,你需要手动2的检测到它,并将其从分组中移除。

      注意,分组名称是大小写敏感的。

相关资源

posted on   钱行慕  阅读(2717)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示