SignalR不适用于特定ID

时间:2017-01-19 13:58:22

标签: jquery asp.net asp.net-mvc signalr

我使用SignalR和MVC在用户访问网站时将通知推送给用户。只要我将通知发送给所有用户,它就可以工作,但是当我尝试隔离用户时,我什么也得不到。没有错误抛出任何一方,它只是默默地失败。

这是我的中心代码:

public class NotificationHub : Hub
{
    private readonly static IDictionary<int, string> _connections = new Dictionary<int, string>();

    public static void AddNotification(int userId, Notification notification)
    {
        if (notification != null)
        {
            string userConnectionId = null;

            _connections.TryGetValue(userId, out userConnectionId);

            //Send message only if the user is currently connected.
            if (userConnectionId != null)
            {
                IHubContext hub = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();

                hub.Clients.Client(userConnectionId)
                    .addNotification(
                        notification.ID, 
                        notification.ShowMessage(), 
                        notification.Link);
            }
        }
    }

    public override Task OnConnected()
    {
        if(_connections.ContainsKey(WebSecurity.CurrentUserId))
        {
            _connections[WebSecurity.CurrentUserId] = Context.ConnectionId;
        }
        else
        {
            _connections.Add(WebSecurity.CurrentUserId, Context.ConnectionId);
        }

        return base.OnConnected();
    }
}

这是我的JS代码:

var notificationConnection = $.connection.notificationHub;

notificationConnection.client.addNotification = function (id, message, link) {
    alert(message);
};

$.connection.hub.start().done(function () { });

连接ID似乎有问题,但我在SignalR页面上有一些例子:https://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections

修改:

只是澄清一下。如果我更换:

hub.Clients.Client(userConnectionId)
    .addNotification(
        notification.ID, 
        notification.ShowMessage(), 
        notification.Link);

with:

hub.Clients.All
    .addNotification(
        notification.ID, 
        notification.ShowMessage(), 
        notification.Link);

它有效。

所以问题似乎与这一行有关:hub.Clients.Client(userConnectionId)

我还确保在函数运行时填充userConnectionId,它就是。

1 个答案:

答案 0 :(得分:0)

您目前正在集线器内部获取集线器的实例,这不是必需的,可能会导致意外行为:

IHubContext hub = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();

hub.Clients.Client(userConnectionId)
                .addNotification(
                    notification.ID, 
                    notification.ShowMessage(), 
                    notification.Link);

...可以改为......

this.Clients.Client(userConnectionId)
                .addNotification(
                    notification.ID, 
                    notification.ShowMessage(), 
                    notification.Link);

此外,您的代码将以静默方式失败,因为当TryGetValue()返回null时,它甚至不会尝试发送通知。没有特别发生的错误。