2012-12-03 44 views
8

Tôi có một trung tâm có phương pháp được gọi là phía máy khách. Phương thức này khởi chạy bộ hẹn giờ với một đại biểu chạy 10 giây một lần. Vì nó sẽ không có ý nghĩa để tiếp tục chạy đại biểu này nếu không có ai được kết nối với hub, tôi muốn kiểm tra xem có người dùng nào vẫn được kết nối từ bên trong đại biểu trước khi tôi lên lịch lại nó hay không. Có cách nào để làm điều này không?SignalR - Kiểm tra xem người dùng vẫn đang kết nối

Trả lời

16

Có lẽ giải pháp được sử dụng nhiều nhất là giữ một biến tĩnh chứa người dùng hiện đang kết nối và ghi đè OnConnectOnDisconnect hoặc triển khai IDisconnect tùy thuộc vào phiên bản bạn sử dụng.

Bạn sẽ thực hiện một cái gì đó như thế này:

public class MyHub : Hub 
{ 
    private static List<string> users = new List<string>(); 
    public override Task OnConnected() 
    { 
     users.Add(Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    //SignalR Verions 1 Signature 
    public override Task OnDisconnected() 
    { 
     users.Remove(Context.ConnectionId); 
     return base.OnDisconnected(); 
    } 

    //SignalR Version 2 Signature 
    public override Task OnDisconnected(bool stopCalled) 
    { 
     return base.OnDisconnected(stopCalled); 
    } 

    // In your delegate check the count of users in your list. 
} 
+0

Tôi thấy điều này được đề cập ở những nơi khác, chỉ là hy vọng có một cách tốt hơn. Cảm ơn, tôi sẽ thử nó! – edobry

+2

Có vấn đề gì với đồng thời với nhiều chủ đề cố truy cập vào tài nguyên đơn lẻ không? –

+3

Không chỉ điều này sẽ không hoạt động đáng tin cậy vì mô hình trọn đời của một trung tâm, nó phá vỡ khả năng mở rộng quy mô này với một bảng nối đa năng. Câu trả lời thực sự duy nhất là theo dõi trạng thái trực tuyến trong bộ nhớ cache dùng chung như redis hoặc appfabric. – Bon

1

Từ http://forums.asp.net/t/1829432.aspx/1?How+do+I+get+list+of+connected+clients+on+signalr+

IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
context.Clients.notify("Hello world"); 

Vì vậy, bạn sẽ có thể để có được context.Clients.Count.

Bài đăng đó cũng tham chiếu đến wiki có nhiều thông tin tốt. Bạn có thể thử sử dụng các ví dụ OnConnected/OnDisconnected để theo dõi người dùng và khi bạn nhận được 0 người dùng dừng cuộc gọi của bạn.

+0

Cảm ơn đã gợi ý, nhưng tôi đang cố gắng để làm điều này từ bên trong một trung tâm ... nó sẽ vẫn hoạt động? – edobry

10

Nếu bạn lưu connectionId của bạn trong cơ sở dữ liệu, bạn có thể kiểm tra điều này:

var heartBeat = GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>(); 

var connectionAlive = heartBeat.GetConnections().FirstOrDefault(c=>c.ConnectionId == connection.ConnectionId); 

if (connectionAlive.IsAlive) 
{ 
//Do whatever... 
} 
+1

Bạn cần phải thêm 'bằng cách sử dụng Microsoft.AspNet.SignalR.Transports' –

+0

Cũng không nên .Transports là trong Core hội ... bummer! Xem: https://msdn.microsoft.com/en-us/library/microsoft.aspnet.signalr.transports.transportmanager%28v=vs.118%29.aspx?f=255&MSPPError=-2147217396 –

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