SignalR 内容在发送到 Client.Caller 时不会更新

本文关键字:Caller 更新 Client SignalR | 更新日期: 2024-11-08 03:34:33

您好,感谢您阅读本文。

这是我的通知中心.cs

public class NotificationHub : Hub
{
    private static readonly ConcurrentDictionary<string, User> Users = new ConcurrentDictionary<string, User>(StringComparer.InvariantCultureIgnoreCase);
    private static List<User> UserList = new List<User>();
    Int16 totalNewMessages = 0;
    string UserID;
    [HubMethodName("check")]
    public Task Check(string id)
    {
        string profileId = id; //Context.QueryString["id"];
        string connectionId = Context.ConnectionId;
        var user = Users.GetOrAdd(profileId, _ => new User
        {
            ProfileId = profileId,
            ConnectionIds = id
        });
        lock (user.ConnectionIds)
        {
            Groups.Add(connectionId, user.ProfileId);
        }
        return base.OnConnected();
    }
    [HubMethodName("sendNotifications")]
    public Task SendNotifications(string id)
    {
        UserID = id;
        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
        {
            string query = "SELECT NotificationNumber FROM [dbo].[NotificationStatus] WHERE UserID=" + UserID;
            connection.Open();
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                command.Notification = null;
                DataTable dt = new DataTable();
                SqlDependency dependency = new SqlDependency(command);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                if (connection.State == ConnectionState.Closed)
                    connection.Open();
                var reader = command.ExecuteReader();
                dt.Load(reader);
                if (dt.Rows.Count > 0)
                {
                    totalNewMessages = Int16.Parse(dt.Rows[0]["NotificationNumber"].ToString());
                }
            }
        }
        User CurrentUser = UserList.FirstOrDefault(i => i.ProfileId == UserID);
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
        //return context.Clients.All.RecieveNotification(totalNewMessages);
        return context.Clients.Client(Users.Values.FirstOrDefault(i => i.ProfileId == UserID).ConnectionIds).RecieveNotification(totalNewMessages);
    }
    private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            NotificationHub nHub = new NotificationHub();
            nHub.SendNotifications(UserID);
        }
    }
}

这两条线是我想关注的。

//return context.Clients.All.RecieveNotification(totalNewMessages);
        return context.Clients.Client(Users.Values.FirstOrDefault(i => i.ProfileId == UserID).ConnectionIds).RecieveNotification(totalNewMessages);

如果我使用第一行,它将 totalNewMessages 返回给网站上的所有人,但我只想返回给请求它的用户。

第二行是我尝试将 totalNewMessages 返回给特定用户,但它不起作用。

如何将总新消息仅返回给特定用户?

SignalR 内容在发送到 Client.Caller 时不会更新

不久前我遇到了这个问题。我通过根据登录的用户返回消息来使其工作

string userName = HttpContext.Current.User.Identity.Name;
return context.Clients.User(userName).RecieveNotification(totalNewMessages);

还要研究参数化查询以防止 sql 注入。这里有一个方便的文档,说明您要实现的目标