.NET Maui中使用SignalR向特定用户及群组发送通知的方法
使用SignalR向特定用户及群组发送通知的实现方案
一、向特定用户发送通知
要实现向特定用户推送,核心是建立用户标识与SignalR连接ID的关联,以下是具体实现步骤:
1. 改造Hub,记录用户-连接映射
修改MyHub,添加连接/断开时的逻辑,存储用户ID和对应ConnectionId的关系(内存字典仅做演示,生产环境建议用Redis等分布式缓存):
public class MyHub : Hub { // 内存存储用户-连接映射,生产环境替换为分布式存储 private static readonly Dictionary<string, string> UserConnections = new Dictionary<string, string>(); // 客户端连接时,接收用户ID并绑定映射 public async Task RegisterUser(string userId) { if (UserConnections.ContainsKey(userId)) { UserConnections[userId] = Context.ConnectionId; } else { UserConnections.Add(userId, Context.ConnectionId); } await Clients.Caller.SendAsync("UserRegistered", "用户绑定完成"); } // 断开连接时移除映射 public override async Task OnDisconnectedAsync(Exception? exception) { var userId = UserConnections.FirstOrDefault(kv => kv.Value == Context.ConnectionId).Key; if (!string.IsNullOrEmpty(userId)) { UserConnections.Remove(userId); } await base.OnDisconnectedAsync(exception); } // 发送给特定用户的方法 public async Task SendToUser(string userId, string message) { if (UserConnections.TryGetValue(userId, out var connectionId)) { await Clients.Client(connectionId).SendAsync("ReceiveMessage", message); } } }
2. Maui客户端连接时注册用户ID
在Maui后台服务的SignalR连接逻辑中,添加用户注册步骤(替换为实际业务中的用户唯一标识):
// 初始化并启动连接 await hubConnection.StartAsync(); // 注册当前用户ID,示例为"user_12345" await hubConnection.InvokeAsync("RegisterUser", "user_12345"); // 保留原有的消息接收逻辑 hubConnection.On<string>("ReceiveMessage", (message) => { BadgeNumber++; notification.SetNumber(BadgeNumber); notification.SetContentTitle(message); StartForeground(myId, notification.Build()); });
3. 控制台发送特定用户通知
修改控制台调用代码,指定目标用户ID:
// 向user_12345用户发送专属通知 await hubConnection.InvokeAsync("SendToUser", "user_12345", "仅你可见的通知内容");
二、向群组发送通知
群组推送适合给指定用户集合批量发消息,实现步骤如下:
1. Hub中添加群组管理方法
在MyHub中扩展群组的加入、退出和发送逻辑:
public class MyHub : Hub { // ... 保留之前的用户-连接映射代码 ... // 用户加入指定群组 public async Task JoinGroup(string groupName) { await Groups.AddToGroupAsync(Context.ConnectionId, groupName); await Clients.Caller.SendAsync("JoinedGroup", $"已加入群组:{groupName}"); } // 用户退出群组 public async Task LeaveGroup(string groupName) { await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName); await Clients.Caller.SendAsync("LeftGroup", $"已退出群组:{groupName}"); } // 发送给指定群组的方法 public async Task SendToGroup(string groupName, string message) { await Clients.Group(groupName).SendAsync("ReceiveMessage", message); } }
2. Maui客户端加入目标群组
在Maui连接SignalR后,调用加入群组的方法:
await hubConnection.StartAsync(); await hubConnection.InvokeAsync("RegisterUser", "user_12345"); // 加入"news_update"资讯群组 await hubConnection.InvokeAsync("JoinGroup", "news_update"); // 保留原有的消息接收逻辑 hubConnection.On<string>("ReceiveMessage", (message) => { BadgeNumber++; notification.SetNumber(BadgeNumber); notification.SetContentTitle(message); StartForeground(myId, notification.Build()); });
3. 控制台发送群组通知
修改控制台代码,指定目标群组名:
// 向news_update群组所有成员发送通知 await hubConnection.InvokeAsync("SendToGroup", "news_update", "群组通知:最新资讯已发布");
生产环境注意事项
- 内存字典
UserConnections会因应用重启丢失数据,建议用Redis等分布式存储持久化用户-连接映射。 - 若应用使用ASP.NET Core身份验证,可直接用
Clients.User(userId)推送,无需手动维护映射,只需确保客户端连接时携带身份凭证。
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

