2012-02-17 37 views
26

Tôi đã thấy cách bạn có thể bẫy sự kiện ngắt kết nối ở phía máy khách với SignalR bằng cách liên kết với sự kiện .disconnect.SignalR: phát hiện trạng thái kết nối trên máy khách

Bây giờ tôi đã thực hiện việc này, tôi muốn đưa ứng dụng khách vào "chu kỳ chờ kết nối lại" nơi liên tục cố gắng kết nối cho đến khi thành công hoặc người dùng hủy. Liệu các trung tâm phơi bày một tài sản nhà nước kết nối? Tôi đang suy nghĩ điều gì đó giống như (mã giả)

var isConnected; 

function onConnected() { isConnected = true; } 

hub.disconnect = function() { while(hub.notconnected) { connect(); } 

Trả lời

46

Máy khách JS cố gắng kết nối lại trong một khoảng thời gian nhất định, mặc định là 110 giây. Bạn có thể đăng ký sự kiện connection.stateChanged và nhận các cập nhật khi trạng thái thay đổi để bạn có thể hiển thị nó cho người dùng hoặc xác nhận phản hồi của SignalR với các tình huống ngắt kết nối khác nhau.

Trong thử nghiệm của tôi, trạng thái đã được cập nhật chính xác để ngắt kết nối và kết nối lại, như bạn mong đợi.

More information on signalr connections

function connectionStateChanged(state) { 
    var stateConversion = {0: 'connecting', 1: 'connected', 2: 'reconnecting', 4: 'disconnected'}; 
    console.log('SignalR state changed from: ' + stateConversion[state.oldState] 
    + ' to: ' + stateConversion[state.newState]); 
} 

connection = $.connection(signalR_Endpoint); 
connection.stateChanged(connectionStateChanged); 
connection.start({ waitForPageLoad: false }); 
+7

Tôi không nghĩ rằng điều này là hoàn toàn đúng sự thật. Nếu tôi mất kết nối với máy chủ của tôi thì cuối cùng nó sẽ từ bỏ việc cố gắng kết nối lại và buộc tôi phải khởi động lại kết nối theo cách thủ công. Tôi sẽ không nói nó luôn luôn cố gắng kết nối lại. – KingOfHypocrites

+2

Lưu ý rằng các trạng thái có thể được liệt kê trên '$ .signalR.connectionState', ví dụ' $ .signalR.connectionState.connected'. Bạn có thể thấy cách sử dụng hiện tại của 'stateChanged' [ở đây] (https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client#connectionstatechanged-handlerchange-) –

+0

Nhìn vào mã [client] của khách hàng (https: //github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Client.JS/jquery.signalR.transports.longPolling.js), tôi không tìm thấy bất kỳ tham chiếu nào đến điều kiện thực sự sẽ dừng kết nối lại sau một khoảng thời gian. Tuy nhiên, có một tính toán ngược lại dẫn đến thời gian lâu hơn và lâu hơn giữa các lần thử kết nối lại không thành công, cho đến khi có kết nối thành công. Vì vậy, tôi tin rằng nó sẽ cố gắng kết nối lại "mãi mãi" miễn là trang JS vẫn còn trong trình duyệt. – Mazrick

8

Khách hàng luôn cố gắng kết nối. Bạn không cần phải lo lắng về điều đó. Có sự kiện được kết nối lại mà bạn có thể nghe, trong trường hợp bạn muốn thực hiện điều gì đó khi kết nối được thiết lập lại thành công.

EDIT: Điều này đã thay đổi, máy khách chỉ cố kết nối lại trong một khoảng thời gian nhất định. Sau đó, bạn phải nắm bắt sự kiện ngắt kết nối và khởi động lại theo cách thủ công.

+0

Có điều gì đặc biệt tôi cần phải làm gì để thực hiện kết nối lại? Có vẻ như tôi không nhận được sự kiện Disconnect OR Reconnect. Hiện tại tôi đang làm: $ .connection.hub.disconnect = onDisconnected; $ .connection.hub.reconnect = onReconnected; trên máy khách và đã triển khai IDisconnect trên hub. – Heather

+0

@Jon Giao diện IDisconnect dành cho các sự kiện bên máy chủ và nó hoạt động tốt (đảm bảo rằng bạn đang sử dụng SignalR 0.4). Về phía máy khách, sự kiện Disconnect không bao giờ được kích hoạt vì SignalR không bao giờ thực sự chắc chắn rằng bạn bị ngắt kết nối (điều này có thể thay đổi trong tương lai tôi nghĩ). Việc kết nối lại sẽ hoạt động, nhưng tôi đã không thử nghiệm nó vì vậy tôi không thể giúp bạn với điều đó. – nmat

+1

Tôi thấy rằng máy khách C# không kết nối lại nếu máy của nó bị ngắt kết nối. Tôi phải làm lại hubConnection.Start(). Wait(); (Tôi không có ý tưởng nếu đây là một thực hành tốt hay không!) Kịch bản của tôi là một ứng dụng giao diện điều khiển trên một máy nói chuyện với một trang web khác. Nếu tôi làm sạch/xây dựng lại trang web, chúng tôi sẽ kết nối lại, ngắt kết nối và không bao giờ khôi phục trừ khi tôi buộc nó theo cách thủ công. – Andiih

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