2012-05-15 30 views
6

Làm thế nào để có được khách hàng connectionId/ClientId bên ngoài của Hub .. Tôi đã cố gắng làm như sau:Nhận connectionId ngoài Hub, SignalR

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

Nhưng trong bối cảnh đối tượng không có chẳng hạn như clientId.

Trả lời

4

Bạn có thể triển khai IConnected/IDisconnect trên Hub và theo dõi khách hàng theo cách thủ công ví dụ trong cơ sở dữ liệu, sau đó kéo lại danh sách khi cần. Ví dụ bên dưới là từ số SignalR Wiki

public class Status : Hub, IDisconnect, IConnected 
{ 
    public Task Disconnect() 
    { 
     return Clients.leave(Context.ConnectionId, DateTime.Now.ToString()); 
    } 

    public Task Connect() 
    { 
     return Clients.joined(Context.ConnectionId, DateTime.Now.ToString()); 
    } 

    public Task Reconnect(IEnumerable<string> groups) 
    { 
     return Clients.rejoined(Context.ConnectionId, DateTime.Now.ToString()); 
    } 
} 
4

Tại sao có một Id kết nối trong ngữ cảnh chung? Nó sẽ liên quan đến kết nối nào? Khi bạn nhận được bối cảnh chung, bạn đang truy cập kênh một chiều từ máy chủ đến máy khách và có thể gửi tin nhắn qua nó. Bạn không có quyền truy cập vào id kết nối của hub vì bạn không gọi vào nó. Bạn có thể lưu trữ chúng ở đâu đó trong ứng dụng của bạn nếu bạn cần sử dụng chúng.

+2

Không phải ai cũng xây dựng máy chủ trò chuyện. Tôi nghĩ rằng ngụ ý là làm thế nào để có được ConnectionId được sử dụng bởi các khách hàng hiện tại để một tin nhắn có thể được gửi đến chỉ người dùng/phiên. Tôi tự hỏi làm thế nào để làm điều này tốt nhất trong một hành động MVC từ một khách hàng mà tôi muốn gửi tin nhắn tiến bộ. Có một số kỹ thuật cho bộ nhớ đệm ConnectionIds bởi tên người dùng nhưng tôi đã không nhìn thấy bất cứ điều gì phong nha cho phép cho cùng một người dùng có nhiều kết nối mà thường là trường hợp với các ứng dụng web. Ý tưởng cho điều đó? Cảm ơn. – Dave

+4

Bạn gửi nó từ khách hàng đến hành động mvc của bạn. Nó có sẵn trên máy khách thông qua $ .connection.hub.id. – davidfowl

1

Đây là Giải pháp. Bạn có thể gọi phương thức bên trong hub và bạn có thể trả lại connection ID từ đó.

Trong điều khiển

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
MyHub _connectedHub= new MyHub(); 
var connectedUserID = _connectedHub.GetConnectionID(); 

Trong Hub

public string GetConnectionID() 
{ 
    return "Your Connection ID as String" //This can be stored in a list or retrieved in any other method 
} 

Bạn sẽ nhận được yêu cầu ID bên ngoài trung tâm trong connectedUserID Variable. Hy vọng điều này sẽ giúp.

Các vấn đề liên quan