如何从控制器获取连接ID?

时间:2017-08-16 13:30:56

标签: c# signalr

我有这个中心:

public class NotificationHub : Hub<INotificationHub>
{
    private readonly static ConnectionMapping<User> connections = new ConnectionMapping<User>();

    public override Task OnConnected()
    {
        var user = GetUser();
        connections.Add(user, Context.ConnectionId);

        Groups.Add(Context.ConnectionId, user.GroupId.ToString());

        return base.OnConnected();
    }

    public string GetConnectionId(User user)
    {
        return connections.GetConnections(user).First();
    }

    private User GetUser() {}
}

在控制器中我正在做:

var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();

context.Clients.Groups(user.GroupId.ToString()).Notify();

但以上内容会发送给该组的所有用户。如何将其发送给当前发出请求的用户?

注意: 我在集线器外面调用这个方法。

1 个答案:

答案 0 :(得分:0)

要将特定更新发送到特定客户端,您需要connectId。如你所知,该小组正在进行广播。

由于您在单独的控制器中从集线器外部进行访问,因此您无权访问当前的Context.ConnectionId。

但是,由于您确实拥有hubContext,如果您可以使用以下内容保存要发送更新的用户的connectionId,则可以向特定连接发送更新:

   context.Clients.Client(connectionid).Notify()

在您的情况下,将GetConnectionId设为静态:

    public static string GetConnectionId(User user)
    {
      return connections.GetConnections(user).First();
    }

然后,将通知发送给用户的特定连接:

    var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
    context.Clients.Groups(NotificationHub.GetConnectionId(user)).Notify();

这应该有效。