我使用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,它就是。
答案 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
时,它甚至不会尝试发送通知。没有特别发生的错误。