2013-02-18 28 views
7

Tôi đang sử dụng SignalR trong ứng dụng của mình. Tôi có một ứng dụng phụ thuộc vào mức độ rất lớn trên OnDisconnected() được gọi chính xác. Và nó được gọi một cách chính xác dưới trường hợp sau đây:Ngắt kết nối SignalR không được gọi là kết nối internet/kết nối lại

public Task OnDisconnected() 
{ 
    try 
    { 
     DeleteUser(Context.ConnectionId); 
     return null; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 
  1. Người dùng làm mới trang
  2. Các người dùng điều hướng đến một trang mới
  3. Người dùng đóng trình duyệt

Tuy nhiên, nó không được gọi nếu kết nối mạng đột nhiên giảm xuống. Ví dụ, nếu tôi rút dây cáp mạng trên máy khách, hoặc vô hiệu hóa mạng không dây của khách hàng, hoặc rút bộ định tuyến, OnDisconnected() sẽ không bao giờ được gọi, ngay cả sau một vài phút chờ đợi.

+0

Tôi đã từng làm việc với SignalR nhiều, nhưng tôi không chắc nó không phải là một trong những chức năng của nó để kiểm tra, nếu người dùng vẫn còn kết nối với một trung tâm. Bạn có thể muốn thực hiện bộ đếm thời gian của riêng bạn sẽ đăng xuất người dùng sau (x) phút. – Timsen

+0

Chỉ cần giữ liên kết này, nó có thể hữu ích cho bạn: http://www.dotnetcurry.com/ShowArticle.aspx?ID=826 – Timsen

Trả lời

6

Nó sẽ tăng ngắt kết nối nhưng không phải ngay lập tức. Có thể cấu hình một ngưỡng (30 giây theo mặc định) mà SignalR sẽ đợi (sau khi kết nối tcp cơ bản đã biến mất và điều này không phải là ngay lập tức) hoặc trước khi nó xem xét một khách hàng bị ngắt kết nối. Nếu kết nối bị ngắt và kết nối lại trước thời gian chờ được định cấu hình thì kết nối sẽ không tăng OnDisconnected.

Nếu bạn không bao giờ thấy nó được nêu ra trong một số trường hợp sau khi chờ đợi một thời gian thì đó có thể là một lỗi. SignalR 1.0 đã được phát hành hôm nay vì vậy tôi khuyến khích bạn thử điều đó và xem liệu bạn có còn gặp vấn đề không.

+0

Ok nhờ dfowler..i sẽ sử dụng tín hiệu r 1.0, bây giờ tôi đang sử dụng tín hiệu r 0.5.3 – user1527989

+1

David, là 'HttpContext.Response.ClientDisconnectedToken' được vinh danh khi chúng ta đang lưu trữ SignalR dưới ASP.NET 4.5 + IIS 8.0? – tugberk

+2

Chúng tôi không sử dụng vì có lỗi trong đó. Nhưng khi nó cố định, chúng tôi sẽ sử dụng nó. – davidfowl

2

Điều này có thể không phải là câu trả lời đúng nhưng đây là những gì tôi biết:

Bạn sẽ không thể nhìn thấy sự kiện OnDisconnected sa thải bất ngờ khi kết nối được giảm vì SignalR không theo dõi nó xuống (nó hồ bơi để kết nối với một nhiệm vụ nền để xem liệu kết nối có chết trong một khoảng thời gian nhất định hay không). Khi bạn đóng trình duyệt, tôi đoán rằng SignalR gửi yêu cầu đến máy chủ để báo hiệu sự kiện ngắt kết nối. Đó là lý do tại sao bạn đột nhiên thấy sự kiện bị sa thải.

Tuy nhiên, ASP.NET 4.5 có thuộc tính CancellationToken được gọi là ClientDisconnectedToken cho HttpContext.Response được báo hiệu khi kết nối TCP bị ngắt. Điều này chỉ hoạt động theo IIS 8,0 như xa như tôi biết và tôi không chắc chắn nếu SignalR làm việc với điều này dưới máy chủ NET 4.5 ASP.NET.