signalR: задержка при вызове OnDisconnected

когда я обновляю страницу браузера с помощью F5, функция OnDisconnected не вызывается сразу. Перед вызовом функции есть задержка в несколько секунд, что делает значения меток времени недействительными.

 public override System.Threading.Tasks.Task OnDisconnected()

Почему это происходит ? Это нормальное поведение в signalR?


person Sam    schedule 03.07.2013    source источник
comment
сделать значения меток времени недействительными — у вас могут быть более серьезные проблемы — из документация: метод OnDisconnected не вызывается в некоторых сценариях   -  person Damien_The_Unbeliever    schedule 03.07.2013
comment
эти сценарии не включают обновление страницы, поэтому все должно работать нормально.   -  person Sam    schedule 03.07.2013


Ответы (2)


Да, это нормально. Это происходит, когда клиент отключен - когда вы обновляете страницу, он сначала вызывает OnDisconnected(), а после OnConnected() вы снова загружаете страницу. Также у него есть задача OnReconnected() - но она будет вызвана, когда вы сделаете переподключение программы в коде.

person Adeptys    schedule 08.10.2013

Просто, чтобы расширить это немного больше. У SignalR есть период времени, в течение которого он будет ждать после разрыва соединения, прежде чем он вызовет OnDisconnected. По умолчанию оно равно 10 секундам, но вы можете переопределить этот параметр в файле Global.asax (пример ниже). К сожалению, для этого значения требуется не менее 6 секунд, но я понимаю причину этого.

https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/handling-connection-lifetime-events#disconnecttimeout

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

То, как я справляюсь с этим, заключается в функции OnConnected, я сохраняю и ищу другую часть уникальной идентификации для клиента (в моем случае IP-адрес), и если я нахожу этого клиента, продолжаю и удаляю это старое соединение из моей пользовательской коллекции сеансов.

person DoctorBambi    schedule 23.07.2021