如果发送到 Client.Caller,SignalR 内容不会更新

SignalR Content dont update if send to Client.Caller

您好,感谢您阅读本文。

这是我的NotificationHub.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);

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

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

我如何 return 将 totalNewMessages 仅返回给特定用户?

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

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

同时查看 parameterized queries to prevent sql injection. There's a handy documentation for what you're trying to achieve here