5

開発ボックス (Vista/IIS7 では .NET 2.0) で ASP.NET Web サイトを実行しています。global.asax.cs の Session_Start メソッドは、すべての呼び出しをファイル (log4net) に記録します。Session_End メソッドもすべての呼び出しをログに記録します。

私は InProc セッション状態を使用しており、セッション タイムアウトを 5 分に設定しています (20 分待たないようにするため)。

Web サイトにアクセスし、5 分単位で待機すると、Session_End のログが表示されます。次に、ウェブサイトを F5 します。ブラウザにはまだセッション Cookie があり、それをサーバーに送信します。Session_Start が呼び出され、同じセッション ID を使用して新しいセッションが作成されます (ところで、データベースにデータを格納するために使用されるため、これは同じセッション ID である必要があります)。

結果: 以前に終了したセッションで F5 キーを押すたびに、Session_Start メソッドが呼び出され、リクエストが実行され、Session_End メソッドがすぐに呼び出されます。

別のブラウザーを開くと、Session_Start メソッドが 1 回だけ呼び出されます。次に、5 分後に Session_End 各 F5 キーを押すと、Session_Start/request/Session_End シーケンスが実行されます。

web.config 関連セクション:

<system.web>
  <compilation debug="true" />
  <sessionState timeout="2" regenerateExpiredSessionId="false" />
</system.web>
4

1 に答える 1

6

このregenerateExpiredSessionId設定は Cookie を使用しないURL のみに関連し、再利用されるセッション Cookie の動作には影響しません。

発生している問題は、使用中かどうかに基づいて ASP.NET 2.0/3.5 がセッションを処理する方法が原因です。通常の状況では、最初に使用されるまでセッションを保持しようとしないため、セッション cookie は発行されません (存在しない場合)。初めてセッション使用されると、サーバー上でセッションが作成され、セッション Cookie が発行されます。

以前のセッションが再起動されたが使用されていない場合、ASP.NET は少し混乱します。未使用の (再起動された) セッションは不要であるため、すぐに破棄しようとします。これにより、早い段階で Session_End が発生します。ただし、既存のセッション Cookie は削除されないため、後続のすべての要求は、Cookie が削除されるかセッションが使用されるまで、セッションを再開して終了するというシーケンスを繰り返します。

.Net 4.0 ではこの動作が変更され、この場合イベントは発生しなくなりました。

于 2011-08-28T00:51:12.340 に答える