1

アプリの別のプロセスでセッション状態を保持したいのですが、ユーザーのセッションが終了するたびにコードを実行したいと考えています。(オンラインかどうかを示すステータス文字列を変更し、オンライン ユーザー数を減らします。)

セッション状態が Web 構成で InProc の場合、Session_End メソッドを使用してこのコードを実行できますが、そうでない場合はどうすればよいですか?

4

4 に答える 4

1

セッションがいつ期限切れになったかを検出しようとする際には、少し不確実性の原則があります。サーバーにクエリを実行して (AJAX などを使用して) 稼働しているかどうかを確認することにより、実際にはサーバーを稼働させたままにします。これは通常、希望する動作とは正反対です。

私は通常、ページに JavaScript コードを埋め込むことでこれを行います。:

var sessionTimeout = 20; //minutes - set this programmatically server-side based on your configured timout interval
setTimeout('timeoutAlert()', (sessionTimeout + 1) * 1000 * 60); //we add one minute buffer because this is an inaccurate process and we want to make sure they are actually timed out before we attempt to redirect
function timeoutAlert()
{
    alert("Your sesssion has ended, you will now be redirect to the login page.");
    document.location = '/home.aspx';
}

この timeoutAlert() は、クライアント側の HTML を変更したり、AJAX を実行してサーバー側でコードを実行したり、必要なことは何でもできることに注意してください。ページがレンダリングされた後にサーバーへの呼び出しを行う場合 (たとえば、AJAX を介して)、setTimeout をキャンセルしてリセットするように注意する必要があります。

于 2009-06-23T13:52:13.687 に答える
1

セッションの終了時に常に実行されるイベント ハンドラーを割り当てることはできません。イベント ハンドラーを InProc セッションの End イベント (セッションが正常に終了した場合にのみ実行される) に割り当てたり、SQL Server セッションの DeleteExpiredSessions プロシージャを変更したりするなどの近似があります。

于 2009-06-23T18:56:24.340 に答える
0

SQL Server を使用している場合は、DeleteExpiredSessions ストアド プロシージャを変更して作業を行うことができます (つまり、オンライン ユーザーを減らします)。

または、ページの読み込みごとにセッション変数を確認することもできます。変数が null に戻った場合、セッションは終了しています。

また、JavaScript チェックを入れて、ブラウザーが閉じたかどうか、またはログアウト ボタンがクリックされたかどうかなどを確認し、ajax 呼び出しを行ってセッションを手動で閉じることもできます。

于 2009-06-23T18:40:01.733 に答える