web-dev-qa-db-ja.com

global.asaxでセッション終了を処理する方法は?

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

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

11
ashish bhatt

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

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

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

27
Canavar

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

protected void Session_End(Object sender, EventArgs e)
{
    // Remove user from HashTable
}
14
MartinHN

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

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

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

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

7
Guffa

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

1
yunus