Уведомлять сервер 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
для всех клавиш словаря.
- Удалить старые и вызвать соответствующий код.