Подтвердить что ты не робот

SignalR: обнаружение живого соединения на клиентах С#

В настоящее время я разрабатываю приложение с использованием концентраторов SignalR (2.1).

У меня есть 1 клиент WPF, а другой - клиент WCF. Все отлично работает в том, что они прекрасно передают сообщения.

Единственная проблема, с которой я столкнулся сейчас, это то, что я заметил, что OnDisconnected не запускается вообще, когда приложение отключается по таким причинам, как автозапуск, сервер WCF и некоторые другие. Время ожидания по умолчанию - 30 секунд. Его никогда не называют даже после того, как прошло 1 день (я попробовал). Однако тайм-аут работает для веб-клиентов.

Он работает только при вызове hub.connection.stop().

Однако метод Ondisconnected работает очень хорошо, когда клиент является браузером.

Таким образом, я хотел бы спросить, есть ли какой-либо способ для стороны Signal R Hub, чтобы он мог проверить, все еще подключен или уже отключен клиент (например, ping)?

4b9b3361

Ответ 1

В SignalR 2.1.0 появилась новая перегрузка OnDisconnected которая принимает bool, указывающий, был ли клиент отключен изящно или нет. Обоснование этих изменений объясняется в разделе "Ломающиеся изменения" в примечаниях к выпуску 2.1.0.

Ваш новый метод OnDisconnected может выглядеть примерно так:

public override Task OnDisconnected(bool stopCalled)
{
    if (stopCalled)
    {
        // We know that Stop() was called on the client,
        // and the connection shut down gracefully.
    }
    else
    {
        // This server hasn't heard from the client in the last ~35 seconds.
        // If SignalR is behind a load balancer with scaleout configured, 
        // the client may still be connected to another SignalR server.
    }

    return base.OnDisconnected(stopCalled);
}

Старый метод OnDisconnected, который не принимает bool, не вызывается для изящных отключений, поэтому, если вы используете это событие, это может объяснить проблему, которую вы видите.

До 2.1.0 метод (только) OnDisconnected, который не принимал параметр, вызывался как для изящных, так и для изящных отключений. Поскольку это изменение в поведении вызвало несколько сообщений об ошибках, старая OnDisconnected перегрузка удаляется в выпуске SignalR next 2.1.1.

Это приведет к тому, что приложения, использующие старый метод OnDisconnected SignalR, не смогут скомпилироваться, если они созданы против SignalR 2.1.1. Хотя это не идеально, он, надеюсь, заставит разработчиков осознать это нарушение, чтобы у них была возможность соответствующим образом модифицировать свои приложения, прежде чем развертывать их.

Ответ 2

Я обнаружил, что мой Клиент не будет повторно подключаться, если я заставил сервер отключить соединение. (Я бы получил ошибку WSSockets)

Итак, для меня это было:

con = new HubConnection(_url);
con.Error += (exception) => Error(exception);
con.Start();

то в методе Error попытайтесь снова подключиться, вызвав вышеприведенный код.