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

时间:2015-03-10 12:10:22

标签: c# signalr

您好,感谢您阅读本文。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我曾经遇到过这个问题。我通过根据登录用户

返回消息来实现它
string userName = HttpContext.Current.User.Identity.Name;
return context.Clients.User(userName).RecieveNotification(totalNewMessages);

同时查看parameterized查询以防止sql注入。有关您正在尝试实现的内容的方便文档here