2

空の mvc3 プロジェクトを作成しました。

1 つのコントローラー ("home") と 2 つのアクション ("index"、"about") があります。

セッションを保存するために sqlserver を使用しています。

ここに私の設定ファイルがあります。

 <sessionState  mode="SQLServer" cookieless="false" timeout="1" sqlConnectionString="Data Source=localhost;Integrated Security=True;MultipleActiveResultSets=False">

タイムアウトは 1 分です。

インデックスページにあります。セッションを作成しました

Session["currentTime"] = DateTime.Now.ToString();

私の概要ページでは、それをビューに書き出します。

@Session["currentTime"]

初めてアバウトページを開くと、現在の時刻が表示されます。ページを 5 分間そのままにしてから、戻って更新します。古い currentTime がまだ残っています。タイムアウトを 1 に設定したので、すぐに期限切れになり、ページには何も表示されません。

セッションの仕組みを完全に誤解していたのかもしれません。有効期限が切れた後もセッション値が残っている理由を教えてください。

編集:

キャッシュではありません。キャッシュを無効にするために次のコードを追加しました。まだ問題があります。

 <meta http-equiv="cache-control" content="max-age=0" />
 <meta http-equiv="cache-control" content="no-cache" />
 <meta http-equiv="expires" content="0" />
 <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
 <meta http-equiv="pragma" content="no-cache" />

問題を見つけたと思いますが、修正方法がわかりません。

Chrome からキャッシュをクリアしました。「/home/index」ページを開いてセッションを作成し、「/home/about」ページに移動します。DBを確認してください。作成されたセッションが 1 つあります。「作成済み」フィールドと「有効期限」フィールドをダブルチェックしました。1分後に期限切れになることを確認しました。

その後、コンピューターから 5 分間離れました。戻ってきて「/home/about」ページを更新した後。セッションはまだ有効期限が切れていません。セッションテーブルにクエリを実行すると、「有効期限」フィールドが1分+ページを更新する時間に変更されていることに注意してください。なぜ期限切れフィールドが変更されたのか?????????

2 回目の更新:

これが問題だと思います。SQL セッション プロバイダーは、セッション テーブルの Expires 列を積極的に監視しません。代わりに、セッションはテーブルから削除されるまで "正式に" 期限切れになりません。これは、DeleteExpiredSessions ストアド プロシージャを呼び出す SQL エージェント ジョブで行われます。デフォルトでは、ジョブは 60 秒ごとに実行されるように構成されています。

SQLエージェントが実行されていないと確信しています。しかし、それをオンにする方法がわかりません。何かアイデアがあれば教えてください。

4

2 に答える 2

1

ここでできることはたくさんあります。構成で設定されているタイムアウトは「1」分であるため、セッション変数はタイムアウトにバインドされています。

あなたが直面している状況 (そして私は 90% 確信しています) は、キャッシングの場合です。インデックス ページのデフォルト コントローラ アクションは HTTP get である必要があります。ページ内にボタンを配置し、ボタンを使用して Web ページを更新してみてください。ボタンはサーバーに投稿します。セッション変数が持続しないと確信しています。

更新 2

Sql Agent を有効にする方法については、次のリンクを参照してください。オンにして、機能したかどうかをお知らせください

于 2012-07-24T06:10:39.180 に答える
0

キャッシングの問題のようなにおいがします。どのブラウザを使用していますか?

ブラウザーで使用しているセッションは、すべてのコントローラーに対して初期化される「ゲスト」セッションです (セッションレスを除く)。期限切れになっても、新しいものが作成され、タイムスタンプが中に配置されます。したがって、ページを更新するたびに、現在の時刻が表示されます。

編集:(投稿が更新された後)。

それが正確に機能すると思うなら。これによるとregenerateExpiredSessionId、期限切れのセッション ID を再生成するには、sessionState のフィールドを設定する必要があります。それ以外の場合、既存のセッション オブジェクトは単純に更新されて再利用されます。

編集2:

cookieless が true の場合、前の編集は有効です。あなたのコードでは、cookieless が false であると述べましたが、何らかの理由で cookieless = true として機能します。に正しいパラメータがありますかsessionState?

于 2012-07-24T06:17:26.930 に答える