为什么我的会话没有过期?

时间:2012-07-24 02:13:57

标签: asp.net asp.net-mvc asp.net-mvc-3 session session-state

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

它有一个控制器(" home")和2个动作("索引","关于")

我正在使用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中清除了缓存。打开&#34; / home / index&#34;页面创建会话,然后转到&#34; / home / about&#34;页。检查数据库。创建了一个会话。双重检查&#34;创建&#34;和&#34;到期&#34;领域。确认它会在一分钟后过期。

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

第二次更新:

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

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

2 个答案:

答案 0 :(得分:1)

这里可以做很多事情。配置中设置的超时时间为“1”min,因此会话变量必然会超时。

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

更新2

请参阅以下链接以查看how to turn on the Sql Agent。请打开它,让我们知道它是否有效

答案 1 :(得分:0)

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

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

编辑:(在帖子更新后)。

如果认为它运作正常。根据{{​​3}},您需要设置sessionState的regenerateExpiredSessionId字段,以重新生成过期的会话ID。否则,只需重新创建并重新使用现有的会话对象。

编辑2:

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