私はチャットアプリケーションで作業しています。HashTableを使用して、HashTableの値としてChatRoomクラスのキーとオブジェクトとしてユーザーとオペレーターを含めました。主な問題は、ユーザーまたはオペレーターがブラウザーを閉じるか、ログアウトせずに切断すると、セッションの終了時に自動的にログアウトされることです。
これに関連して、この件でGlobal.asaxを使用する方法を教えてください。
Global.asaxのセッション終了イベントを使用して、予期せず切断されたユーザーを削除できます。
void Session_End(Object sender, EventArgs E) {
// Clean up session resources
}
ただし、ユーザーがブラウザを閉じたり、接続が失われたりしても、セッションは終了しないことに注意してください。セッションタイムアウトに達すると終了します。
Global.asaxファイルをWebサイトに追加し、Session_Endイベントで、HashTableからユーザーを削除します。
protected void Session_End(Object sender, EventArgs e)
{
// Remove user from HashTable
}
Session_Endイベントは、ブラウザーが閉じているときは発生しません。サーバーが特定の時間(デフォルトでは20分)にユーザーからの要求を受け取らなかったときに発生します。つまり、Session_Endを使用してユーザーを削除すると、ユーザーはブラウザーを閉じた後20分間チャットにとどまります。
最後のリクエストの時間をユーザーオブジェクトに保持することをお勧めします。このようにして、ユーザーがどの程度アクティブであるか、およびユーザーがチャットから退出した可能性がどの程度あるかを判断できます。たとえば、2分間何もしなかったユーザーを非アクティブとして表示できます。
チャットアプリケーションにサーバーを定期的にポーリングさせることもできます(まだポーリングしていない場合)。これにより、オブジェクトの最後のリクエスト時間が更新され、チャットウィンドウが開いている限りユーザーは存続します。
ブラウザでonunloadイベントを使用して、ユーザーがページを離れたときにサーバーにログアウト要求を送信できます。もちろん、これはユーザーがまだネット接続を持っている場合にのみ機能します。 onunloadイベントは、ページをリロードしたときにもトリガーされるため、イベントを使用するためにイベントがトリガーされた理由を追跡する必要があります。
クライアントで常に実行されるJavaScriptを使用して、「I'mhere」のようにサーバーにシグナルを送信できます。次のシグナルが来ない場合は、Leave();
を呼び出すことができます。これを行うためにAJAXを使用しました。