2017-08-16 73 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(); 

這應該工作。