2012-09-02 34 views
7

Hy、SignalR - 切断されたユーザーの処理

私は通知とチャットモジュールを処理するためにプロジェクトでsignalRライブラリを使用しています。私は、データベース上にオンラインユーザーを追跡するためのテーブルを用意しています。

チャットのHUBは、ユーザーを切断するIDisconnectを継承しています。ユーザーを切断した後、私はそのイベントについてユーザーに暖かい。この時点で、切断ユーザがクライアントであるかどうかを確認します。その場合、HUB上のメソッドを呼び出してユーザーを再接続します(テーブルを更新するだけです)。

現在の実装では、ユーザーがブラウザのタブを閉じると、Disconnectタスクが呼び出されますが、別のタブが開かれている可能性があります。

このモジュールはまだテストされていませんが、開発サーバー上ではIDisconnectイベントとユーザーからの再接続要求の間に数秒かかる場合があります。

私はチャットから切断されたユーザーを処理するために私の実装に懸念していますが、これを改善する別の方法はありません。

可能であれば、誰かが私にこれに関する助言を与えることができるか、これは私が唯一の解決策ですか?

更新:シングルトンクラスを使用して、すべてのユーザーとその接続IDをsignalrから保存しました。このようにして、私は切断タスク中にユーザーからIDを取得できます(この時点では、ユーザー情報を取得するためのhttpcontextはありませんが、常にシングルトンの配列からsignalrの接続IDでユーザーIDを取得できます)クラス)。

20-02-2013上記の解決策は仕事をしていましたが、私は自分のプロジェクトを拡張する必要がありました。私のソリューションは、すべてのユーザー接続を格納するためにRedisを使用し、切断イベントのキー有効期限の恩恵を受けることでした。再接続中に、鍵が保留状態にあるかどうかを確認します(数分で期限切れになる)。その際、> ConnectionId - ユーザー<のNマッピング:https://github.com/JabbR/JabbR/blob/master/JabbR/Hubs/Chat.cs

それは基本的には1を保持します:

+0

FB TrornadoがPythonでビルドされ、非ブロックパターンに従っていることがわかりました。私はさようならSignalR;) –

答えて

5

あなたは、SignalRの上に構築されたマルチルームチャットアプリケーションは、この問題を解決する方法JabbRチェックアウトすることができます最後の接続が切断されると、ユーザーは「オフライン」としてマークすることができます。

+0

ありがとう、そのプロジェクトは本当に役に立ちます。私はタイムアウトの方法に従います –

+0

答えに「JabbRがどのようにこの問題を解決するか」をインライン展開できますか? –

+0

@MichaelPaulukonisそれは基本的にユーザー<-> ConnectionIdの1:Nマッピングを保持しているため、最後の接続が切断されると、ユーザーは「オフライン」としてマークすることができます。 –

関連する問題