2012-04-02 37 views
7

Đây là vấn đề của tôi, tôi muốn theo dõi xem người dùng có trực tuyến hay ngoại tuyến và thông báo cho các khách hàng khác về vấn đề này. Tôi đang sử dụng các hub và triển khai cả hai giao diện IConnected và IDisconnect.Có cách nào để lấy số lượng kết nối trong nhóm trung tâm Signalr không?

Ý tưởng của tôi là gửi thông báo tới tất cả khách hàng khi hub phát hiện kết nối hoặc ngắt kết nối. Theo mặc định khi người dùng làm mới trang, anh ta sẽ nhận được id kết nối mới và cuối cùng kết nối trước đó sẽ gọi ngắt kết nối thông báo cho người dùng khách khác đang ngoại tuyến mặc dù anh ấy thực sự trực tuyến.

Tôi đã cố gắng sử dụng tên người dùng trả về ConnectionIdFactory của riêng mình cho id kết nối nhưng với nhiều tab được mở tại một số điểm, nó sẽ phát hiện kết nối người dùng bị ngắt kết nối và sau đó trung tâm phía máy khách sẽ cố gắng kết nối không thành công vào trung tâm trong bộ nhớ lãng phí vòng lặp vô tận cpu làm cho trình duyệt gần như không sử dụng được. Tôi cần sửa chữa nhanh chóng để xóa nhà máy của mình và bây giờ tôi thêm mọi kết nối mới vào nhóm bằng tên người dùng, vì vậy tôi có thể dễ dàng thông báo cho người dùng trên tất cả các kết nối, nhưng sau đó tôi gặp vấn đề phát hiện nếu người dùng trực tuyến hoặc ngoại tuyến không biết có bao nhiêu người dùng kết nối đang hoạt động.

Vì vậy, tôi tự hỏi có cách nào để có được số lượng kết nối trong một nhóm không? Hoặc nếu có ai đó có ý tưởng tốt hơn về cách theo dõi thời điểm người dùng truy cập ngoại tuyến?

Tôi đang sử dụng Signalr 0.4

+0

Bạn có thể sử dụng từ điển > trong đó khóa là tên người dùng và hashset chứa (các) kết nối cho người dùng đó. Số người dùng = Keys.Count(), # of connections = dict.Values.Sum (x => x.Count()); – drch

+0

Trang web phải hoạt động trong kịch bản trang trại, vì vậy tôi không thể sử dụng Từ điển. Tôi có thể lưu trữ các kết nối trong db, nhưng tôi muốn tránh điều này nếu có thể. – pajo

+0

Khi bạn nói người dùng làm mới trang và nhận id kết nối mới, tôi lưu trữ ID kết nối trong DB của mình và nếu người dùng xem hai trang trên trang web của tôi nơi trung tâm của tôi giống ID kết nối giống nhau. Tại sao bạn nhận được ID kết nối riêng biệt. Tôi nghĩ rằng bạn chỉ có thể nhận được ID khác nhau khi khách hàng khác nhau. –

Trả lời

9

Không có cách nào để thực hiện việc này ngoài việc tự tính.

3

Tìm thấy làm thế nào để workaround:

Rewrite connectionId, vì vậy trong mỗi tab bạn muốn có cùng id sonnection:

public class MyConnectionFactory : IConnectionIdGenerator 
    { 
     public string GenerateConnectionId(IRequest request) 
     { 
      return MyUserManager.Instance.CurrentUserID.ToString(); 
     } 
    } 

Thêm vào global.asax:

GlobalHost.DependencyResolver.Register(typeof(IConnectionIdGenerator),() => new MyConnectionFactory()); 

Và Tôi đã xoay sở để mở các tab mach, như tôi có thể. Và tất cả các tab đều nhận được thông báo.

+0

Không hoạt động với Phiên bản Signalr mới nhất. – kravits88

+0

bạn có thể cung cấp cho mã đầy đủ để hiểu như thế nào để thực hiện ConnectionFactory người mới đến signalr. cảm ơn – Mou

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