7

やあ、

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

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

これを行うのは、現在の実装では、ユーザーがブラウザーのタブを閉じると、切断タスクが呼び出されますが、別のタブを開くことができるためです。

このモジュールはまだテストしていませんが(より大きなリクエストで)、開発サーバーでは、IDisconnectイベントからユーザーからの再接続リクエストまでに数秒かかる場合があります。

チャットから切断されたユーザーを処理するための実装に関心がありますが、これを改善する別の方法がわかりません。

可能であれば、誰かが私にこれについてアドバイスを与えることができますか、それともこれが私がした唯一の解決策ですか?

更新:最終的にシングルトンクラスを使用して、Signalrからのすべてのユーザーとその接続IDを格納しました。このようにして、切断タスク中にユーザーからIDを取得できます(この時点では、ユーザー情報を取得するためのhttpcontextはありませんが、シングルトンの配列からシグナルの接続IDを持つユーザーIDをいつでも取得できますクラス)。

20-02-2013上記のソリューションは仕事をしていましたが、プロジェクトを拡張する必要がありました。私の解決策は、Redisを使用してすべてのユーザー接続を保存し、切断イベントでキーの有効期限を利用することでした。再接続中に、キーが保留状態にあるかどうかを確認します(数分で期限切れになります)。

4

1 に答える 1

5

SignalR の上に構築されたマルチルーム チャット アプリケーションJabbRがこの問題をどのように解決するかを確認できます: https://github.com/JabbR/JabbR/blob/master/JabbR/Hubs/Chat.cs

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

于 2012-09-02T09:37:08.357 に答える