アプリの別のプロセスでセッション状態を保持したいのですが、ユーザーのセッションが終了するたびにコードを実行したいと考えています。(オンラインかどうかを示すステータス文字列を変更し、オンライン ユーザー数を減らします。)
セッション状態が Web 構成で InProc の場合、Session_End メソッドを使用してこのコードを実行できますが、そうでない場合はどうすればよいですか?
アプリの別のプロセスでセッション状態を保持したいのですが、ユーザーのセッションが終了するたびにコードを実行したいと考えています。(オンラインかどうかを示すステータス文字列を変更し、オンライン ユーザー数を減らします。)
セッション状態が Web 構成で InProc の場合、Session_End メソッドを使用してこのコードを実行できますが、そうでない場合はどうすればよいですか?
セッションがいつ期限切れになったかを検出しようとする際には、少し不確実性の原則があります。サーバーにクエリを実行して (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 をキャンセルしてリセットするように注意する必要があります。
セッションの終了時に常に実行されるイベント ハンドラーを割り当てることはできません。イベント ハンドラーを InProc セッションの End イベント (セッションが正常に終了した場合にのみ実行される) に割り当てたり、SQL Server セッションの DeleteExpiredSessions プロシージャを変更したりするなどの近似があります。
SQL Server を使用している場合は、DeleteExpiredSessions ストアド プロシージャを変更して作業を行うことができます (つまり、オンライン ユーザーを減らします)。
または、ページの読み込みごとにセッション変数を確認することもできます。変数が null に戻った場合、セッションは終了しています。
また、JavaScript チェックを入れて、ブラウザーが閉じたかどうか、またはログアウト ボタンがクリックされたかどうかなどを確認し、ajax 呼び出しを行ってセッションを手動で閉じることもできます。