1

アプリケーションは、Application_AcquireRequestState イベント ハンドラーで session.timeout を設定します。

セッションが期限切れになる前に、通知ウィンドウがポップアップします。Application_AcquireRequestState を介して、セッション タイムアウトをたとえば 3 分 (通常は 30 分) にリセットします。

通知は、ユーザーにセッションをさらに 30 分間延長するオプションを提供します。ユーザーが [はい] をクリックすると、前のイベント ハンドラーによってセッション タイムアウトが 30 分間リセットされます。

問題は、ユーザーが [はい] をクリックし、セッション タイムアウトが正しく設定されているにもかかわらず、設定された時間の前にセッションがタイムアウトしたように見えることです。これは通知後にのみ発生します。

疑わしいのは、Application_AcquireRequestState に達したときです。この要求のタイムアウトは既に計算されています。新しいタイムアウト値は、次のリクエストに使用されます。そのため、ユーザーが [はい] をクリックしてセッションを延長すると、通知ウィンドウで設定されたタイムアウトにより、現在の要求のタイムアウトは 30 分ではなく、わずか 3 分です。yes は、ユーザーが別のリクエストを送信した場合にのみ有効になります。

(通知ウィンドウには独自のタイミング オブジェクトがあります)

誰でもこれを確認できますか?または、asp.net がこれをどのように管理しているかを説明する適切なリソースを教えてください。

ありがとう!

4

3 に答える 3

1

Session.Timeoutは、アプリケーション内のグローバル設定です。

ログアウトしようとしていることをユーザーに通知するウィンドウをポップしたときにユーザーのタイムアウトを3分に設定していて、ユーザーが応答しない場合、別のユーザーがリセットするまで、Session.Timeoutは3分のままになります-これが起こっている可能性はありますか?

于 2009-01-21T23:54:30.160 に答える
1

Zhaph さん、問題は、ユーザーが [はい] をクリックしてセッションを延長し、立ち去ったときです。

私は最終的に問題を突き止めたと思います。

思った通りでしたが、「SQLServer」モードのみでした。リクエストが Application_AcquireRequestState に入ると、セッションはすでに延長されています (ASPState データベース、ASPStateTempSessions テーブルで確認できます)。ユーザーが [はい] をクリックすると、新しいタイムアウト値が設定されますが、次のサーバー要求まで有効になりません。ユーザーがもう一度クリックせずに立ち去った場合、セッションは以前に設定されたタイムアウト値 (3 分) でタイムアウトしました。

「InProc」または「StateServer」モードでは、セッション オブジェクトはキャッシュによって管理されます。キャッシュの有効期限は将来のみリセットできますが、より現在の時刻に戻すことはできません (または無視されます)。

于 2009-01-23T18:06:31.047 に答える
0

私はもっ​​と単純なメカニズムを使用しています。ポップアップでセッションを延長することはできません。スライディングウィンドウのあるセッションを使用していますが、ユーザーがセッションの有効期限通知で[OK]ボタンをクリックすると、サーバーにAJAXリクエストが返され、スライディングウィンドウが更新されます。

于 2009-01-21T23:50:46.733 に答える