ASP.NET中的会话超时

183

我正在运行一个ASP.NET 2.0应用程序在IIS 6.0中。我希望会话超时时间为60分钟,而不是默认的20分钟。我已经完成以下操作:

  1. web.config文件中设置<sessionState timeout="60"></sessionState>
  2. 在IIS管理器/网站属性/ASP.NET配置设置中将会话超时时间设置为60分钟。
  3. 在应用程序池属性/性能中将空闲超时时间设置为60分钟。

但是我仍然在20分钟后遇到了会话超时问题。还有其他需要进行的操作吗?


1
请提供您如何测量这20分钟的信息。让我们确认这20分钟是一个会话超时,而不是其他类型的超时。 - John Saunders
11
请使用上下投票箭头旁边的勾选标记将优质答案标记为被接受的答案。 - Brian Webster
5
八年后,正确答案仍未被接受。 - Nathan
请澄清您所说的IIS管理器/网站属性/ASP.NET配置设置是什么意思。您在IIS中逐步更改了什么? - niico
15个回答

301

你是否正在使用表单身份验证?

表单身份验证使用自己的超时值(默认为30分钟)。表单身份验证超时会将用户发送到登录页,但会保持会话仍处于活动状态。这可能看起来与会话超时时您的应用程序所呈现的行为相似,容易混淆。

<system.web>
    <authentication mode="Forms">
          <forms timeout="50"/>
    </authentication>

    <sessionState timeout="60"  />
</system.web>

将表单超时时间设置为小于会话超时时间可以为用户提供一个窗口,在此期间重新登录而不会丢失任何会话数据。


50

我对web.config或IIS不太了解。但我相信你可以通过C#代码来完成它,例如

Session.Timeout = 60; // 60 is number of minutes

26
这是否只会调整当前会话的超时时间?还是会调整整个应用程序的超时时间? - Johncl
2
文档中没有任何说明表明设置Session.Timeout与使用web.config或IIS有任何不同,因此我认为它适用于整个应用程序。 - Drasive
我认为@Drasive是正确的,但至少必须通过两个分离的连接的客户端和服务器进行证明,并检查空闲会话超时。 - QMaster

44

在web.config文件中使用以下代码块。这里默认的会话超时时间为80分钟。

<system.web>
 <sessionState mode="InProc" cookieless="false" timeout="80" />
</system.web>

使用以下链接来实现带弹出警告消息的会话超时。

会话超时示例

注意:上述示例是使用DevExpress弹出控件完成的,因此您需要自定义/替换DevExpress弹出控件为普通弹出控件。如果您正在使用DevExpress,则无需自定义。


cookieless false? - Kiquenet
6
如果你将cookieless设置为true,那么你的sessionId会被嵌入到URL中,这是一个很高的安全风险。ASP.NET框架会在URL中插入一个唯一的ID号,当你禁用cookie或者设置了cookieless属性为true时,你可以进行检查。根据MSDN文档,默认情况下,SessionID值存储在浏览器中不会过期的session cookie中,但如果指定cookieless="true",则ASP.NET会通过自动将唯一的session ID插入到页面的URL来维护无cookie的会话状态。 - Hamza Khanzada

21

在我的情况下,是应用程序池引起的。它被设置为在xx分钟空闲后重新启动。当我将其设置为不重新启动时,似乎使用了Web Config中的值。


5
我知道现在已经是2020年了,但这解决了我的问题,谢谢! - Binary9
@Binary9 我也一样。试图处理一些遗留问题,但找不到所有会话超时的原因。 - Matthew Allen
你能说一下需要更改应用程序池中的哪个设置吗? - LairdPleng
https://www.coreblox.com/blog/2014/12/iis7-application-pool-recycling-and-idle-time-out 有更多详细信息,供其他想要找到适当设置的人参考。 - LairdPleng
应用程序池,高级设置,进程模型, "空闲超时(分钟)" 默认为20,可以设置为0 "永久"。 - François Breton

9

您在machine.config中是否有任何可能生效的设置?在web.config中设置会话超时时间应该会覆盖IIS或machine.config中的任何设置,但是如果您的应用程序某个子文件夹中有一个web.config文件,则该设置将覆盖应用程序根目录中的设置。

另外,如果我没记错的话,IIS中的超时时间只影响.asp页面,而不是.aspx。您确定web.config中的会话代码是正确的吗?它应该类似于:

<sessionState
    mode="InProc"
    stateConnectionString="tcpip=127.0.0.1:42424"
    stateNetworkTimeout="60"
    sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI"
    cookieless="false"
    timeout="60"
/>

8

通常你只需要这样做...

你确定在20分钟后,会话丢失的原因是因为空闲吗?...

有很多原因可能会导致会话被清除。你可以为IIS启用事件记录,然后使用事件查看器查看会话被清除的原因...也许你会发现它是由于其他原因而清除的?

你还可以阅读事件消息文档和相关的事件表


4
自 ASP.Net Core 1.0(也称为vNext或其他名称)以来,会话的实现方式有所不同。 我通过在Startup.csvoid ConfigureServices 中更改会话超时值来进行更改:
services.AddSession(options => options.IdleTimeout = TimeSpan.FromSeconds(42));

如果您想使用 appsettings.json 文件,可以这样做:

// Appsettings.json
"SessionOptions": {
    "IdleTimeout": "00:30:00"
}

// Startup.cs
services.AddSession(options => options.IdleTimeout = TimeSpan.Parse(Config.GetSection("SessionOptions")["IdleTimeout"]));

4

3
如果您正在使用身份验证,建议在web.config文件中添加以下内容。在我的情况下,当超时时,用户将被重定向到登录页面:
<authentication mode="Forms">
    <forms defaultUrl="Login.aspx" timeout="120"/>
</authentication>

我在将<authentication mode="Forms">放入web.config后遇到了错误。 - Lst Patrick
这个答案涉及到身份验证 cookie 超时的持续时间,与会话超时无关。 - Philip Stratford

3
默认的会话超时时间在IIS中定义为20分钟。
对于托管在IIS 8.5 Web上的每个站点,请按照以下步骤进行操作。

IIS Timeout configuration

打开IIS 8.5管理器。 点击站点名称。 在“管理”部分下选择“配置编辑器”。 从配置编辑器顶部的“Section:”下拉列表中找到“system.web/sessionState”。 将“超时时间”设置为“00:20:00或更短”,根据应用程序使用最低值。高价值应用程序可接受的值为5分钟,中价值应用程序为10分钟,低价值应用程序为20分钟。 在“操作”窗格中,单击“应用”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接