2009-03-07 40 views
10

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

この問題に関連して、この問題についてGlobal.asaxの使い方を教えてください。

答えて

14

WebサイトにGlobal.asaxファイルを追加し、Session_EndイベントでHashTableからユーザーを削除します。ユーザーは自分のブラウザまたは失われた彼の接続を閉じたときにセッションが終了していない、

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

をしかし、注意してください:

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

私のハッシュテーブルにはSession ["UserID"]のキーも含まれています。このセッションはSession_EndイベントのLogout(usrid)のパラメータusridを渡すために使用されます。 ... –

+2

私はあなたの質問を理解していません。ごめんなさい。 – MartinHN

24

あなたが突然切断されたユーザを削除するのGlobal.asaxのセッション終了イベントを使用することができます。セッションタイムアウトに達すると終了します。

+0

Web.configファイルでSession TimeOutを変更した場合、動作しますか? –

+0

いいえ、セッションタイムアウトを低くすることはできますが、予期しない方法でアプリケーション全体に影響します。多分あなたはチャットアプリケーションのプログラム的なコントロールを設定することができます。たとえば、ユーザーが5分間何も行動しなかった場合、彼は切断されたとみなすことができます。 – Canavar

+2

@ ashishbhattのコメントは私にとって正しいです。セッションのタイムアウト時間を大幅に短縮することができますが(** 1分)、**少なくとも動作していないAJAXコールはハートビート(またはキープアライブ)として連続して実行されることを確認する必要があります。これは単なるトリックで、何百万人ものユーザーに拡大することはできません –

6

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

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

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

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

+1

私はonunloadイベントを使用した場合、Leave()が呼び出されますが、ボタンをリフレッシュするとLeave()私はF5、AlterF4、本体を右クリックしますが、すべてのブラウザでリフレッシュボタンをどのようにクリックすることができますか?もし何か考えたら、私を助けてください。 –

1

あなたは常にクライアント上で動作し、 "私はここにいる"のようなサーバーに信号を送るJavaScriptを使用できます。次の信号が来なければ、Leave();に電話することができます。私はこれを行うためにAJAXで使用しました。

関連する問題