2013-08-06 2 views
5

Когда это SignalR концентратор OnDisconnected поднят на стороне сервера, для клиента .net, что авария или закрыть без вызова метода Stop?Обнаружение SignalR концентратор отсоединения клиента мгновенно

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

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

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

+0

Привет @JasonEvans, спасибо за ссылку. –

ответ

5

Прочитав документацию для SignalR events here, я определил этот раздел:

Когда соединение неактивно, периодически сервер отправляет пакет проверки активности клиента. По состоянию на сегодняшний день эта статья была написана, частота по умолчанию каждые 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(); 
} 

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

+0

Привет, Джейсон, спасибо за информацию. Но из моего тестирования KeepAlive влияет только на время прокси-сервера концентратора для повышения состояния StateChanged. Я уже пытаюсь установить ConnectionTimeout на 6 секунд, а KeepAlive - на 2 секунды на стороне сервера, но он не влияет на метод Hub OnDisconnected. –

+0

Без проблем, рад, что я мог бы помочь :) –

3

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

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

Смежные вопросы