2016-12-01 5 views
1

Я заходящий мой GlobalHost конфигурацию, как это, следуя this answer слушать, когда клиент недостижим:Уведомлять SignalR сервер на клиенте Разъединен Accidentally (позор)

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 для андроид в качестве клиента и вызвать 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. enter image description here

+0

Какой транспорт вы используете для подключения к серверу SignalR? Попробуйте использовать что-то вроде 'hubConnection.Start (новый WebSocketTransport())' Будет ли это помогать? –

+0

он использует .NetFramework 4.5 – Technacron

+1

Я не имею в виду платформу. Я имею в виду транспорт, который указан на стороне клиента. Пожалуйста, проверьте [эту ссылку] (https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-net-client#transport) в качестве ссылки. Транспорт по умолчанию - это LongPollingTransport, который работает немного неожиданно, как вы описали :-) . WebSocketTransport должен решить вашу проблему, но я знаю, что в Xamarin существуют существенные проблемы с веб-сокетами. Поэтому просто попробуйте проверить это. –

ответ

2

Поскольку WebSocketTransport недоступен на Xamarin, я советую использовать обходной путь «Пинг».

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

ping очень эффективен, особенно при использовании некоторых сетей с ограниченными данными, таких как некоторые слои – Technacron