2016-12-01 68 views
1

我設置我的GlobalHost配置這樣按照this answer時候聽一聽客戶端是無法訪問通知SignalR服務器上的客戶端斷開連接不留神(可恥)

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作爲客戶端和調用停止()方法通過重寫調用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方法上活動停止應用程序關閉

有什麼我想念不讓它發生。

更新: 我已經嘗試將傳輸級別更改爲WebSocket,但在智能感知中提到的SignalR的Xamarin SDK中沒有提供它。 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中的web套接字存在重大問題。所以試着去檢查一下。 –

回答

2

既然WebSocketTransport在Xamarin中不可用,我建議使用「Ping」解決方法。

  1. 在服務器端實施Ping()方法。
  2. 定期從客戶端調用此方法(例如,超時間隔的1/2)。
  3. 在此方法中,在服務器端將ConnectionIdDateTime鍵/值對保存爲靜態ConcurrentDictionary
  4. 在服務器端運行後臺任務並檢查所有字典密鑰的DateTime
  5. 刪除舊的並調用適當的代碼。
+0

ping是非常不高效的方式,特別是在使用某些數據受限的網絡時,如涉及某些層 – Technacron

相關問題