ASP .NET MVC 3.会话过期太快了

时间:2012-01-08 19:23:52

标签: asp.net asp.net-mvc-3 web-config session-cookies

我有一个页面(View),它会在某些时间间隔内发送AJAX查询。用户可以很长时间使用此页面。但会议在大约40-60分钟后到期。所以AJAX请求不会返回有用的信息。

我的Web.config

<system.web>
  <sessionState
      timeout="259200"
      cookieName="SunTest.SessionId"
      regenerateExpiredSessionId="true"
      sqlCommandTimeout="200"
      stateNetworkTimeout="200">
  </sessionState>
<roleManager enabled="true" defaultProvider="SqlProvider" cacheRolesInCookie="true" cookieName=".ASPROLES" cookieTimeout="259200" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All">
  <providers>
    <add name="SqlProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="SqlServices" applicationName="/" />
  </providers>
</roleManager>
<authentication mode="Forms">
  <forms loginUrl="~" timeout="259200" protection="All" />
</authentication>   

我已经改变了我的web.config

<appSettings>
    <add key="enableSimpleMembership" value="false" />
    <add key="autoFormsAuthentication" value="false" />
</appSettings>
<system.web>
  <sessionState 
      mode="SQLServer"
      allowCustomSqlDatabase="true"
      sqlConnectionString="Data Source=servername;Initial Catalog=dbname;User ID=username;Password=password"
      timeout="259200"
      cookieName="SunTest.SessionId"
      regenerateExpiredSessionId="true"
      sqlCommandTimeout="200"
      stateNetworkTimeout="200">
  </sessionState>
<roleManager createPersistentCookie="true" enabled="true" defaultProvider="SqlProvider" cacheRolesInCookie="true" cookieName=".ASPROLES" cookieTimeout="259200" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All">
  <providers>
    <add name="SqlProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="SqlServices" applicationName="/" />
  </providers>
</roleManager>
<authentication mode="Forms">
  <forms domain="help2b-2.hosting.parking.ru" name="ASPXFORMSAUTH" path="/" loginUrl="~" slidingExpiration="true" cookieless="UseCookies" timeout="259200" requireSSL="false" />
</authentication>

制作这些饼干: Google Chrome screenshot

所以,有3个cookie:

  • SunTest.SessionId。 301字节。过期 - 会话。

  • ASPXFORMSAUTH。 301字节。过期 - 会话。

  • .ASPROLES。 565字节。到期 - 星期二,2012年7月10日04:14:48 GMT

但是几分钟后(大约30-40),它会删除.ASPROLES cookie。用户已退出。因此,AJAX查询不起作用。

这个配置有什么问题?

4 个答案:

答案 0 :(得分:5)

您的所有用户是否同时失去会话状态?如果是这样,您的应用程序池可以回收。 There are several reasons why this can happen.

我建议您考虑设置用户会话管理,以便能够在应用程序和会话重新启动后继续运行。 Here are some options.

答案 1 :(得分:2)

出现同样的问题,添加了以下两个appSettings:

 <add key="enableSimpleMembership" value="false" />
 <add key="autoFormsAuthentication" value="false" />

我的表格:

<forms name="ASPXFORMSAUTH" path="/" domain="something.com" loginUrl="~/Account/LogOn" cookieless="UseCookies" slidingExpiration="true" timeout="1441" requireSSL="false" />

现在效果很好!

答案 2 :(得分:0)

MVC的许多既定目标是转向无状态模型 - 您可以通过多少应用程序更改转移到无状态模型?如果你要在ajax调用中添加一些识别信息并使它们成为无状态,那么使用会话状态就不会是依赖(当然,简化过程 - 我不知道你的应用在做什么)。

您是如何创建表单标记的?

答案 3 :(得分:0)

您使用的是IIS 7吗? 如果看一下:

  

应用程序池的空闲超时(分钟)

     

会话状态 - 状态服务器的超时(秒)