12

私はチャットアプリケーションで作業しています.HashTableの値としてChatRoomクラスのキーとオブジェクトとしてユーザーとオペレーターを含めるためにHashTableを使用しました。主な問題は、ユーザーまたはオペレーターがブラウザーを閉じるか、ログアウトせずに切断すると、セッションの終了時に自動的にログアウトされることです。

それに関連して、この件で Global.asax を使用する方法を教えてください。

4

4 に答える 4

32

global.asax のセッション終了イベントを使用して、予期せず切断されたユーザーを削除できます。

void Session_End(Object sender, EventArgs E) {
    // Clean up session resources
}

ただし、ユーザーがブラウザを閉じたり、接続が失われたりしても、セッションは終了しないことに注意してください。セッションタイムアウトに達すると終了します。

于 2009-03-07T12:20:15.910 に答える
16

Global.asax ファイルを Web サイトに追加し、Session_End イベントで HashTable からユーザーを削除します。

protected void Session_End(Object sender, EventArgs e)
{
    // Remove user from HashTable
}
于 2009-03-07T12:14:31.740 に答える
7

Session_End イベントは、ブラウザーが閉じられたときに発生するのではなく、サーバーが特定の時間 (デフォルトでは 20 分) 内にユーザーからの要求を受け取らなかったときに発生します。つまり、Session_End を使用してユーザーを削除すると、ブラウザーを閉じてから 20 分間チャットに留まるということです。

ユーザーオブジェクトに最後のリクエストの時間を保持することをお勧めします。こうすることで、ユーザーのアクティブ度と、ユーザーがチャットを離れた可能性を判断できます。たとえば、2 分間何もしていないユーザーを非アクティブとして表示できます。

チャット アプリケーションがサーバーを定期的にポーリングするようにすることもできます (まだ行っていない場合)。これにより、オブジェクト内の最後のリクエスト時刻が更新され、チャット ウィンドウが開いている限りユーザーが生き続けます。

ブラウザーで onunload イベントを使用して、ユーザーがページを離れたときにログアウト要求をサーバーに送信できます。もちろん、これはユーザーがまだネットに接続している場合にのみ機能します。onunload イベントは、ページをリロードしたときにもトリガーされるため、イベントがトリガーされた理由を追跡して使用する必要があります。

于 2009-03-07T12:44:18.660 に答える
1

クライアント上で常に実行される JavaScript を使用して、「私はここにいます」などの信号をサーバーに送信できます。次の信号が来ない場合は、 を呼び出すことができますLeave();。私はこれを行うためにAJAXを使用しました。

于 2011-02-01T16:16:41.197 に答える