私は通知とチャットモジュールを処理するためにプロジェクトで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を保持します:
FB TrornadoがPythonでビルドされ、非ブロックパターンに従っていることがわかりました。私はさようならSignalR;) –