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

Asp.net 使用SqlServer模式时,会话超时不起作用,asp.net,sql-server,asp.net-mvc,session,Asp.net,Sql Server,Asp.net Mvc,Session,我正在开发ASP.NETMVC应用程序 我们使用了sessionState模式SQLServer,我将超时设置为20分钟 <sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1;user id=sa;password=sa" cookieless="false" timeout="2" /> web

我正在开发ASP.NETMVC应用程序

我们使用了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>
并且还发现

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

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

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

实现您想要的目标的一种方法是:

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

  • 处理程序不需要做很多事情,只需返回一个200OK,再加上一个设置为几秒钟的刷新头,这样处理程序就可以得到持续的轮询

    context.Response.AddHeader("REFRESH", "2");
    
  • 将framebreaker代码添加到登录页面

     if (top.location != location) {
        top.location.href = document.location.href ;
     }
    
  • 当处理程序的请求与过期会话一起出现时,它将通过表单身份验证重定向到登录页面;当登录页面返回时,它将中断iFrame并将整个窗口重定向到登录页面

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

    或者,您可以像其他人一样,等待用户请求另一个页面。

    对我来说,将web.config文件中的超时值更改为“没有发生任何事情”,原因是ASPState数据库中的ASPStateTempSessions表中有一些遗留的旧记录。我必须清空表,然后才对web.config进行了更改。我浪费了一个小时试图寻找原因,所以希望这能帮助别人

    因此,运行以下命令:


    从ASPStateTempSessions删除

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

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


    当页面发出另一个http请求时,甚至可以确定会话是否过期。当它发现会话在另一个http请求上过期时,我想将用户重定向到登录操作方法。会话采用滑动超时。每次再次访问网站时,会话超时都会重置。@ChrisPratt Ok。我应该如何处理这种情况?是因为SQLServer模式吗?我就是这么说的。你不能。当用户处于活动状态时,会话将永远不会超时,无论是20分钟还是2小时。如果用户空闲,并且会话确实超时,则下一个请求将简单地启动一个新会话。您最可能要做的是将身份验证设置为在20分钟后过期。这必然会迫使用户在20分钟后重新登录,因为这不是滑动。