Клиент SignalR.Net: как восстановить соединение
Я прочитал этот пост
В некоторых приложениях вы можете автоматически восстановить соединение после его утраты, и попытка повторного подключения завершится. Для этого вы можете вызвать метод Start из обработчика событий Closed (отключенный обработчик событий на JavaScript-клиентах). Вы можете подождать некоторое время, прежде чем позвонить в Start, чтобы избежать слишком часто, когда сервер или физическое соединение недоступны. Следующий пример кода предназначен для клиента JavaScript с использованием сгенерированного прокси.
Когда я вызываю метод Start из закрытого события
connection.Closed += connection_Closed;
static void connection_Closed()
{
Console.WriteLine("connection closed");
ServerConnection.Start().Wait();
}
Произошло исключение: соединение не установлено.
Я хочу, чтобы он продолжался до тех пор, пока он не будет успешным, когда сервер будет в порядке. Не бросайте исключение. Как мне это достичь.
любые идеи?
спасибо
Ответы
Ответ 1
on.net, вы можете вызвать метод start из закрытого обработчика событий.
если сервер недоступен, вы должны сделать рекурсивный вызов.
например.
_connection.Closed += OnDisconnected;
static void OnDisconnected()
{
Console.WriteLine("connection closed");
var t=_connection.Start()
bool result =false;
t.ContinueWith(task=>
{
if(!task.IsFaulted)
{
result = true;
}
}).Wait();
if(!result)
{
OnDisconnected();
}
}
Ответ 2
Я только что нашел ответ на http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events
"Как постоянно подключаться
В некоторых приложениях вы можете автоматически восстановить соединение после его утраты, и попытка повторного подключения завершится. Для этого вы можете вызвать метод Start из обработчика событий Closed (отключенный обработчик событий на JavaScript-клиентах). Вы можете подождать некоторое время, прежде чем позвонить в Start, чтобы избежать слишком часто, когда сервер или физическое соединение недоступны. Следующий пример кода предназначен для клиента JavaScript с использованием сгенерированного прокси.
$.connection.hub.disconnected(function() {
setTimeout(function() {
$.connection.hub.start();
}, 5000); // Restart connection after 5 seconds.
});
Потенциальная проблема, о которой следует знать в мобильных клиентах, заключается в том, что попытки непрерывного повторного соединения, когда сервер или физическое соединение недоступны, могут привести к ненужному отказу батареи. "
Ответ 3
Отличия от ответа на феникс:
- Явный вызов
OnDisconnected
на самом деле не требуется, поскольку событие Closed
запускается при сбое подключения
- Малая задержка перед повторной попыткой
- Повторно создавайте ConnectionHub каждый раз - кажется необходимым в моем опыте (старый должен быть удален GC)
код:
private HubConnection _hubConnection = null;
private IHubProxy _chatHubProxy = null;
private void InitializeConnection()
{
if (_hubConnection != null)
{
// Clean up previous connection
_hubConnection.Closed -= OnDisconnected;
}
_hubConnection = new HubConnection("your-url");
_hubConnection.Closed += OnDisconnected;
_chatHubProxy = _hubConnection.CreateHubProxy("YourHub");
ConnectWithRetry();
}
void OnDisconnected()
{
// Small delay before retrying connection
Thread.Sleep(5000);
// Need to recreate connection
InitializeConnection();
}
private void ConnectWithRetry()
{
// If this fails, the 'Closed' event (OnDisconnected) is fired
var t = _hubConnection.Start();
t.ContinueWith(task =>
{
if (!task.IsFaulted)
{
// Connected => re-subscribe to groups etc.
...
}
}).Wait();
}