2017-08-16 71 views
0

我有这个枢纽:如何从控制器获取连接ID?

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(); 

但上面发送给该组的所有用户。我如何才能将它发送给当前发出请求的用户?

注: 我从集线器外部调用该方法。

+0

现在我明白你在问什么了,但是恐怕在[这里]之前询问过了(https://stackoverflow.com/questions/17534505/call-hub-method-in-c-sharp-code ) – meJustAndrew

+0

[C#代码中的Call Hub方法]的可能重复(https://stackoverflow.com/questions/17534505/call-hub-method-in-c-sharp-code) – meJustAndrew

回答

0

要向特定客户端发送特定更新,您需要connectionId。你已经知道该小组是用于广播的。

由于您在独立控制器中从Hub外部访问,因此您无权访问当前的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(); 

这应该工作。