You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:20:28