2016-12-01 9 views
1

私はクライアントが到達不能であるとき聞くことがthis answerに従うことによって、このように私のGlobalHost設定を設定しています:(不名誉)誤って切断されたクライアントでSignalRをサーバに通知

方法をOnDisconnectedをオーバーライド
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(50); 
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30); 
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10); 

私のHUBクラスクライアントが切断されていることを設定する

public override Task OnDisconnected(bool stopCalled) { 
     /*My code for saving the information of disconnecting*/ 
     return base.OnDisconnected(stopCalled);  
    } 
私はクライアントとしてアンドロイドためXamarinを使用して停止()のように、OnStop()私の活動のメソッドをオーバーライドすることによりメソッド呼び出しています210

 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に変更しようとしましたが、Intellisenseに記載されているように、Xamarin SDK for SignalRでは提供されていません。 enter image description here

+0

SignalRサーバーへの接続にはどのトランスポートを使用しますか? 'hubConnection.Start(new 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. この方法では、:DateTimeのキーと値のペアをサーバ側のスタティックConcurrentDictionaryに保存します。
  4. サーバー側でバックグラウンドタスクを実行し、すべての辞書キーに対してDateTimeをチェックします。
  5. 古いものを削除し、適切なコードを呼び出します。
+0

pingは非常に効率的です。特に、いくつかのレイヤーのようなデータが制限されたネットワークを使用すると – Technacron

関連する問題