2012-02-06 2 views
3

私は、ユーザーが非アクティブであったり、セッションが終了したとき(強制的に、またはブラウザが閉じたとき)に強制的に「ログ」を作成しようとしています。 私は愚かなAJAXソリューションを使用して、数分おきに "im alive"のポストを実行したり、ブラウザが閉じられたときにコールしたりしたくありません。最後にセッションにアクセスしますか?

セッションにオブジェクトを保存してSession_Endイベントに到達すると、Sessionに格納されているものにアクセスできなくなりました。 しかし、私が行ったいくつかのテストから、おそらくこれがオブジェクトへのアクセスを得ることができる最後のチャンスであると思われます。

これは本当ですか?それは信頼できるのですか?

ここではASP.NET 4.0を使用しています。

答えて

0

タイムアウトのログ記録グローバルイベントを使用して、タイムアウト時にログオンできます。イベントの順序については、このリンクを参照してください。http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721

+0

ありがとうございますが、あなたは完全に疑問を誤解しています。私はjavascriptタイマーを使いたくないし、設定でセッション/フォームのauthタイムアウトプロパティを変更することに関して何も尋ねていなかった。 –

+0

私は投稿後にそれをリサイズした。改訂された答えを参照してください – PAULDAWG

3

通常、2つのことが行われます。

最初に、javascriptタイマーがハートビートではなくリマインダーとしてクライアントに追加されていることです。彼らがセッションの終了に近い場合は、単に「セッションが終了しようとしています。あなたはまだそこにいますか?そうであれば、サーバがセッションを継続するのを確実にするために、「愚かな」投稿を行います。これは純粋にあなたのユーザーにとって素晴らしいことです。

2番目(およびあなたの質問のポイント)は、セッションをクリーンアップするためにsession_endに何かを入れることです。信頼性のある?よく。ほとんどのの時間。

アプリケーションプールがリサイクルされている場合、Session_Endは実行されません。しかし、アプリケーションプールがOKであれば、セッションが終了すると実行されます。アプリのプールは、アプリのクラッシュからメモリの使用量超過までのさまざまな理由でリサイクルすることができます。これは、最後にリセットしてからしばらくしていたからです。これはIISで構成できます。

私はsession_endを信頼できますか?いいえ、100%ではありません。もちろん、私はそれを100%信頼するセッションオブジェクトの中に何も入れないでしょう。

+0

クリスおかげで。うーん。私は、javascriptのハックやコールバックを使いたくない。可能であればサーバー側で完全に実行する必要があります。セッション中にユーザーを「閉鎖」するにはどうすればよいですか?ユーザーがログオフした時刻(ログオフ時とは別に、セッションが終了した時点)をログに記録したいバックエンドでスクリプトを実行してすべてのスクリプトを頻繁にチェックしても、サイトにアクティビティがあったかどうかはわかりません。 –

+0

本当に、あなたができることは* hope * session_endが実際に動くことです。そのような場合には、ユーザーをログアウトしてマークするクリーンアップ手順のサーバー側が必要になります。これをサポートするためには、サイトを積極的に利用しているユーザーをログオフしないように、ページの読み込みやその他の操作を毎回ログに記録する必要があります。 – NotMe

+1

Chrisに感謝します。つまり、私が行ったテストから、毎分セッションが満了したということです。私はsessionにuserIDを保存します。私は1分以上サイトの周りを遊び、セッションは終了しません。私は周りの再生を停止し、その分のマークがヒット、Session_Endキックインし、私はセッションでUserIDにアクセスすることができます。私はここで私がしたいことをすることができます(つまり、クリーンアップ)。しかし、session_endがヒットしない場合は、SQLジョブを毎日実行して、「loggedOffAt」フィールドを+ x分ログインした時刻から更新することができると思います。これについての考え? –