我创建了一个空的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代理没有运行。但不知道如何打开它。如果您有任何想法,请告诉我。
答案 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
中有正确的参数。