2012-09-02 54 views
7

Hy,SignalR - Xử lý người dùng bị ngắt kết nối

Tôi đang sử dụng thư viện signalR trên dự án để xử lý mô-đun thông báo và trò chuyện. Tôi đã có một bảng trên cơ sở dữ liệu để theo dõi người dùng trực tuyến.

HUB cho trò chuyện đang kế thừa IDisconnect nơi tôi ngắt kết nối người dùng. Sau khi ngắt kết nối người dùng, tôi làm ấm người dùng về sự kiện đó. Tại thời điểm này, tôi kiểm tra xem người dùng ngắt kết nối có phải là máy khách hay không. Nếu đó là, sau đó tôi gọi một phương pháp trên HUB để kết nối lại người dùng (chỉ cần cập nhật bảng).

Tôi làm điều này vì với việc triển khai hiện tại, khi người dùng đóng một tab trên trình duyệt, nó gọi là công việc Ngắt kết nối nhưng anh ta có thể mở một tab khác.

Tôi chưa thử nghiệm (với yêu cầu lớn hơn) mô-đun này, nhưng trên máy chủ phát triển của tôi có thể mất vài giây giữa sự kiện IDisconnect và yêu cầu từ người dùng kết nối lại.

Tôi quan tâm đến việc triển khai của mình để xử lý người dùng bị ngắt kết nối khỏi cuộc trò chuyện nhưng tôi không thể thấy cách khác để cải thiện điều này.

Nếu có thể, ai đó có thể cho tôi lời khuyên về điều này, hoặc đây là giải pháp duy nhất mà tôi có?

Cập nhật: Tôi đã sử dụng một lớp đơn để lưu trữ tất cả người dùng và id kết nối của họ từ signalr. Bằng cách này tôi có thể lấy id từ người dùng trong suốt quá trình ngắt kết nối (tại thời điểm này bạn không có bất kỳ httpcontext nào để lấy thông tin người dùng, nhưng bạn luôn có thể lấy id người dùng với id kết nối của signalr từ mảng trong singleton lớp học).

20-02-2013 Mặc dù giải pháp trên đã thực hiện công việc, tôi đã có nhu cầu mở rộng quy mô dự án của mình. Giải pháp của tôi là sử dụng Redis để lưu trữ tất cả các kết nối người dùng và tận dụng thời gian hết hạn quan trọng khi ngắt kết nối các sự kiện. Trong quá trình kết nối lại, tôi kiểm tra xem khóa có ở trạng thái đang chờ xử lý hay không (sẽ hết hạn sau vài phút).

+0

Một năm sau, tôi đã tìm thấy FB Tornado được xây dựng bằng Python và theo mẫu không chặn tôi đã nói lời tạm biệt với SignalR;) –

Trả lời

5

Bạn có thể kiểm tra như thế nào JabbR, một cuộc trò chuyện ứng dụng đa phòng được xây dựng trên SignalR, giải quyết vấn đề này: https://github.com/JabbR/JabbR/blob/master/JabbR/Hubs/Chat.cs

Nó cơ bản giữ một 1: lập bản đồ N của tài < -> ConnectionId, vì vậy khi kết nối cuối cùng bị ngắt kết nối mà người dùng có thể được đánh dấu là "ngoại tuyến".

+0

Cảm ơn bạn rất nhiều, dự án đó thực sự hữu ích. Tôi sẽ thực hiện theo các cách tiếp cận thời gian chờ –

+0

Bạn có thể inline bất kỳ của "làm thế nào JabbR ... giải quyết vấn đề này" vào câu trả lời của bạn? –

+0

@MichaelPaulukonis về cơ bản giữ bản đồ 1: N của User <-> ConnectionId, vì vậy khi kết nối cuối cùng bị ngắt kết nối, người dùng có thể được đánh dấu là "ngoại tuyến". –

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