やあ、
プロジェクトでsignalRライブラリを使用して、通知モジュールとチャットモジュールを処理しています。オンラインユーザーを追跡するためのデータベース上のテーブルがあります。
チャット用のHUBは、ユーザーを切断するIDisconnectを継承しています。ユーザーを切断した後、そのイベントについてユーザーをウォームアップします。この時点で、切断ユーザーがクライアントであるかどうかを確認します。そうである場合は、HUBのメソッドを呼び出して、ユーザーを再接続します(テーブルを更新するだけです)。
これを行うのは、現在の実装では、ユーザーがブラウザーのタブを閉じると、切断タスクが呼び出されますが、別のタブを開くことができるためです。
このモジュールはまだテストしていませんが(より大きなリクエストで)、開発サーバーでは、IDisconnectイベントからユーザーからの再接続リクエストまでに数秒かかる場合があります。
チャットから切断されたユーザーを処理するための実装に関心がありますが、これを改善する別の方法がわかりません。
可能であれば、誰かが私にこれについてアドバイスを与えることができますか、それともこれが私がした唯一の解決策ですか?
更新:最終的にシングルトンクラスを使用して、Signalrからのすべてのユーザーとその接続IDを格納しました。このようにして、切断タスク中にユーザーからIDを取得できます(この時点では、ユーザー情報を取得するためのhttpcontextはありませんが、シングルトンの配列からシグナルの接続IDを持つユーザーIDをいつでも取得できますクラス)。
20-02-2013上記のソリューションは仕事をしていましたが、プロジェクトを拡張する必要がありました。私の解決策は、Redisを使用してすべてのユーザー接続を保存し、切断イベントでキーの有効期限を利用することでした。再接続中に、キーが保留状態にあるかどうかを確認します(数分で期限切れになります)。