2

我创建了一个空的 mvc3 项目。

它有一个控制器(“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”页面。检查数据库。创建了一个会话。仔细检查“创建”和“过期”字段。确认它将在一分钟后过期。

然后我离开电脑 5 分钟。在我回来刷新“/home/about”页面后。会话还在,没有过期。查询我的会话表,注意“过期”字段更改为 1 分钟 + 我刷新页面的时间。为什么过期字段改变了?????????

第二次更新:

我相信这就是问题所在。SQL 会话提供程序不会主动监控会话表中的 Expires 列。相反,会话在从表中删除之前不会“正式”过期,这是通过调用 DeleteExpiredSessions 存储过程的 SQL 代理作业完成的。默认情况下,作业配置为每 60 秒运行一次。

我很确定我的 sql 代理没有运行。但不知道如何打开它。如果您有任何想法,请告诉我。

4

2 回答 2

1

这里有很多可能的事情。配置中设置的超时时间为“1”分钟,因此您的会话变量必然会超时。

您面临的情况(我 90% 肯定)是缓存的情况。您的索引页面默认控制器操作必须是 HTTP 获取。在您的页面内放置一个按钮,然后尝试使用按钮刷新您的网页。该按钮将发布到服务器。我确信会话变量不会持续存在。

更新 2

请参阅以下链接以了解如何打开 Sql Agent。请打开它并让我们知道它是否有效

于 2012-07-24T06:10:39.180 回答
0

闻起来像缓存问题。你在哪个浏览器中?

您在浏览器中使用的会话是为所有控制器初始化的“访客”会话(当然,无会话除外)。即使它过期了,也会创建一个新的,并且应该将时间戳放在里面。因此,每次刷新页面时,您都应该看到当前时间。

编辑:(帖子更新后)。

如果认为它完全正确。据此,需要设置regenerateExpiredSessionIdsessionState 的字段,以重新生成过期的会话 id。否则,现有的会话对象将被简单地重新更新和重新使用。

编辑2:

如果 cookieless 为真,则先前的编辑将是有效的。在您的代码中,您提到 cookieless 是错误的,但由于某种原因,它仍然充当 cookieless = true。你确定你有正确的参数sessionState

于 2012-07-24T06:17:26.930 回答