2013-01-03 12 views
6

さまざまな理由から、SignalR接続が確立されると、そのConnectionIdをデータストアに保存します。ただし、SignalRが再起動した場合など、これらの接続レコードは孤立する可能性があります。また、OnDisconnected()が正しく呼び出されているかどうか疑問に思うような振る舞いを観察しました。SignalR ConnectionIdを指定すると、そのセッションがまだ接続されているかどうかを確認できますか?

しかし、何らかの理由で定期的にデータベースのレコードになります孤立していて、それらを切り取って、実際には接続されていないConnectionIDを削除したいと思います。おそらく、このConnectionIDがまだライブセッションに関連付けられているかどうかをSignalRに教えてください。

私はSignalRソースを調べましたが、これを達成するにはどのように最善を尽くすわけではありません。合理的な方法がありますか?

答えて

4

これを達成する方法は、お客様自身でクライアントを追跡することです。あなたのポストからは、あなたがすでにこれをやっているように思えます(そうでない場合に備えて、まだ提供されているコード)が、クライアントが接続されているかどうかを知る唯一の方法です。 SignalRサーバーは、クライアントが接続されているかどうかを示す方法として、onconnected/ondisconnectedイベントをトリガーします。

データベースの再インスタンス化されていないレコードが正しく再接続されないようにすることをお勧めします。

例えば

(超簡単な例):あなたは今、接続IDが現在接続しているかどうかを判断するためにハブに接続されているを呼び出すことができます

class myHub 
{ 
    private static List<String> _connectedClients = new List<String>(); 

    public override Task OnConnected() 
    { 
     _connectedClients.Add(Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     _connectedClients.Remove(Context.ConnectionId); 
     return base.OnDisconnected(); 
    } 

    public static bool IsConnected(string cid) 
    { 
     return _connectedClients.Contains(cid); 
    } 
} 

+0

これは基本的に私が今やっていることですが、正しく動作していないようです。たぶん98%の時間だが、何度も、私の開発マシンのすべてのブラウザを閉じて、私が部屋に戻ってくると、私のバージョンにはまだ何かがあると確信するだろう。 '_connectedClients'、すべてがクリアされているはずです。しかし、私はそれのための準備を持っていないので、それはあなたのために多くの助けではありません。私はそれが何を引き起こすかを知ることができるかどうか、もしかしたら私の側のバグかもしれないかどうかを知らせます。 –

+0

@ N。テイラー・ミューレンなぜあなたの最後の無効返すブール値?? –

+0

@aliyouhannaeiの理由はありません、ただ失敗コードスニペット。ただそれを更新しました。 –

-1

DBにconnectionIdを格納するのは良い方法ではありません。 SignalRは各ページに新しいIDを割り当てます。試してみてくださいsample of Kevin W. Griffin

0

私は時々孤立した接続を検出します。行うことになっているものを切断し、サーバ側の関数を呼び出しを回避するには、私はクライアント側の機能を追加し、$(ウィンドウ).unloadとして

..

はそれがお役に立てば幸いです。

関連する問題