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

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

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

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

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

Ответ 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" ) каждые десять секунд.