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

Обнаружение клиента SignalR Hub Disconnect мгновенно

Когда подключен SignalR Hub OnDisconnected, поднятый на стороне сервера, для клиента .net, который завершает работу или закрывается без вызова метода Стоп?

Я тестирую клиент SignalR.NET, а не клиент javascript. Если я вызову метод Остановить на клиенте, концентратор немедленно поднимет метод OnDisconnected.

Но если я закрою клиент или убью процесс, концентратор поднимет OnDisconnected только через 10 секунд.

Как я могу сразу обнаружить, что клиент отключен?

4b9b3361

Ответ 1

Прочитав документацию для событий SignalR здесь, я заметил этот раздел:

Когда соединение неактивно, периодически сервер отправляет пакет keepalive для клиента. На момент написания этой статьи записанная, частота по умолчанию - каждые 10 секунд.

Существует раздел, который описывает, как изменить параметр keepalive, например.

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();
}

Таким образом, вы можете посмотреть на уменьшение этого значения, чтобы быстрее получать уведомление о том, когда соединение с клиентом ушло.

Ответ 2

Как я могу сразу обнаружить, что клиент отключен?

Вы не можете, из-за способа работы TCP, пока не попытаетесь отправить данные этому клиенту. Как объясняет ответ @JasonEvans, SignalR по умолчанию отправляет данные (сообщение "keepalive" ) каждые десять секунд.