2013-08-06 34 views
5

Khi nào SignalR Hub OnDisconnected lớn lên trên phía máy chủ, cho khách hàng các .net rằng vụ tai nạn hay gần mà không cần gọi Dừng phương pháp?Detect SignalR Hub Khách hàng Ngắt kết nối ngay lập tức

Tôi đang thử nghiệm với trình khách SignalR .NET, không phải là trình khách javascript. Nếu tôi gọi là Dừng phương pháp trên máy khách, Hub sẽ tăng OnDisconnected phương pháp ngay lập tức.

Nhưng nếu tôi đóng ứng dụng hoặc hủy quá trình này, Hub sẽ tăng Phương thức OnDisconnected chỉ sau khoảng 10 giây.

Làm cách nào tôi có thể phát hiện ngay lập tức rằng ứng dụng khách đã ngắt kết nối?

+0

Xin chào @JasonEvans, cảm ơn bạn đã liên kết. –

Trả lời

5

Sau khi đọc tài liệu cho SignalR events here, tôi phát hiện phần này:

Khi một kết nối không hoạt động, theo định kỳ các máy chủ gửi một gói tin keepalive cho khách hàng. Kể từ ngày bài viết này được viết là , tần suất mặc định là 10 giây một lần

Có một phần mô tả cách thay đổi cài đặt keepalive, ví dụ:

protected void Application_Start(object sender, EventArgs e) 
{ 
    // Make long polling connections wait a maximum of 110 seconds for a 
    // response. When that time expires, trigger a timeout command and 
    // make the client reconnect. 
    GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110); 

    // Wait a maximum of 30 seconds after a transport connection is lost 
    // before raising the Disconnected event to terminate the SignalR connection. 
    GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30); 

    // For transports other than long polling, send a keepalive packet every 
    // 10 seconds. 
    // This value must be no more than 1/3 of the DisconnectTimeout value. 
    GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10); 

    RouteTable.Routes.MapHubs(); 
} 

Vì vậy bạn có thể nhìn vào việc giảm giá trị đó, để được thông báo nhanh hơn khi một kết nối client ha đi xuống.

+0

Xin chào Jason, cảm ơn thông tin. Nhưng từ thử nghiệm của tôi, KeepAlive chỉ ảnh hưởng đến thời gian proxy Hub Client để tăng sự kiện StateChanged. Tôi đã cố gắng để thiết lập ConnectionTimeout đến 6 giây và KeepAlive đến 2 giây ở phía máy chủ, nhưng nó không có hiệu lực trên phương pháp Hub OnDisconnected. –

+0

Không có vấn đề, vui vì tôi có thể giúp :) –

3

Làm cách nào tôi có thể phát hiện ngay lập tức rằng máy khách bị ngắt kết nối?

Bạn không thể, do cách thức TCP hoạt động, cho đến khi bạn cố gắng gửi dữ liệu đến khách hàng đó. Khi câu trả lời của @JasonEvans giải thích, SignalR theo mặc định sẽ gửi dữ liệu (một thông điệp "keepalive") cứ 10 giây một lần.

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