使用SqlServer模式时,会话超时不起作用

时间:2017-03-02 17:21:00

标签: asp.net sql-server asp.net-mvc session

我正在开发ASP.Net MVC应用程序。

我们使用了sessionState模式SQLServer,我将超时设置为20分钟。

<sessionState mode="SQLServer" 
              sqlConnectionString="data source=127.0.0.1;user id=sa;password=sa" 
              cookieless="false" 
              timeout="2" />

Web配置中的代码就是这样。

我也设置了登录页面。

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

现在,当会话过期时,我想将用户导航到登录页面。

我查了很多东西,但我无法理解它究竟是如何工作的?如何在会话到期时导航用户登录页面?

它在InProc模式下工作。我以相同的方式使用它,用户被重定向到会话过期登录。

但我无法在SQLServer模式下完成同样的事情。

我无法理解我错过了什么?

我检查了Session State,还发现了Session timeout handled in SQLServer Mode

编辑: - 我想在为该会话执行另一个http请求时将用户重定向到登录页面。

3 个答案:

答案 0 :(得分:1)

通常浏览器不知道服务器上发生了什么。除非发生HTTP往返,否则它将记住从呈现页面开始的会话状态。

此外,您的会话cookie可能是HttpOnly,因此页面无法检查是否存在会话cookie。

实现目标的一种方法是:

  1. 在页面中添加隐藏的iFrame。将iFrame的SRC设置为网站中的处理程序

  2. 除了返回200 OK,加上刷新标头设置为几秒之外,处理程序不需要做太多操作,以便处理程序不断进行轮询。

    context.Response.AddHeader("REFRESH", "2");
    
  3. 将帧破解程序代码添加到登录页面

     if (top.location != location) {
        top.location.href = document.location.href ;
     }
    
  4. 当对过期会话发出处理程序请求时,它将通过表单身份验证重定向到登录页面;当返回登录页面时,它将破坏你的iFrame并将整个窗口重定向到登录页面。

  5. 或者,您可以执行其他人所做的事情,即等待用户请求其他页面。

答案 1 :(得分:0)

对我来说,没有将web.config文件中的超时值更改为任何值,原因是ASPState数据库的ASPStateTempSessions表中存在某种残留的旧记录。我必须清空表,然后才进行web.config更改。我浪费了一个小时试图寻找原因,希望这对某人有帮助。

因此,运行此:

从ASPStateTempSessions中删除

答案 2 :(得分:0)

InProc模式与SQLServer模式之间的区别在于,SQLServer依赖MSSQL作业来删除会话。它不会阻止您再次登录。

请参见Session State Providers

  

SqlSessionStateStore 不会主动监视Expires字段。相反,它依靠外部代理来清理数据库并删除过期的会话,即其Expires字段中保存的日期和时间小于当前日期和时间的会话。 ASPState数据库包含一个SQL Server Agent作业,该作业会定期(默认情况下,每60秒一次)调用存储过程DeleteExpiredSessions来删除过期的会话。