Уведомлять сервер SignalR на клиенте, случайно отключенном (бесчестно)

Я устанавливаю свою настройку GlobalHost следующим образом этот ответ, чтобы слушать, когда клиент недоступен:

 GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(50);
 GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
 GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);

И переопределение метода OnDisconnected в моем классе HUB для установки клиента отключен

 public override Task OnDisconnected(bool stopCalled) {
       /*My code for saving the information of disconnecting*/
        return base.OnDisconnected(stopCalled);      
    }

Я использую Xamarin для android в качестве клиента и вызывая метод Stop(), переопределяя метод OnStop() моей деятельности, например:

       protected override void OnStop()
        {

         //hubConnection.Stop(); previously I was using this but it takes too long to stop the hub connection in this way. so I wrote an explicit method and invoke it .

           Task hubconnection = serverHub.Invoke("StopConnection", new object[] { MethodToIdentifyDevice() }).ContinueWith(r =>
            {

            });


            base.OnStop();
        }

Во-вторых, я написал явный hubmethod для вызова, когда явным образом уведомлял свой сервер о том, что мой клиент перестает работать. Этот метод работает при событии OnStop.

Моя реальная проблема в том, что если Все перечисленные выше функции не могут вызвать метод OnDisconnected при остановке активности или закрытом приложении.

Есть ли что-то, что я пропускаю, что не позволяет ему произойти.

UPDATE: Я попытался изменить уровень транспорта на WebSocket, но он не указан в Xamarin SDK для SignalR, как указано в intellisense. введите описание изображения здесь

Ответ 1

Так как WebSocketTransport недоступен на Xamarin, я советую использовать "Ping".

  • Внедрить метод Ping() на стороне сервера.
  • Периодически вызывать этот метод у клиентов (скажем, 1/2 интервала времени ожидания).
  • В этом методе сохраните ConnectionId: DateTime пару ключ/значение до статического ConcurrentDictionary на стороне сервера.
  • Запустите фоновое задание на стороне сервера и отметьте DateTime для всех клавиш словаря.
  • Удалить старые и вызвать соответствующий код.