【问题标题】:ASP session expiration before timeout setting超时设置之前的 ASP 会话到期
【发布时间】:2009-06-04 10:26:28
【问题描述】:

我的一些遗留程序正在使用ASP(不是 ASP.Net),即使我设置了较长的会话过期时间,例如 20 分钟,有时在短时间内(例如几分钟)我仍然会注意到会话过期错误框 -

“空闲时间太多,请重新登录。”

有什么想法可以进一步分析吗?不确定是我的代码错误还是服务器(浏览器)配置问题,因为并非所有客户端/服务器组合都遇到这个奇怪的问题。

会话过期框由我的代码触发:

<%
    if session("timeToken") = "" then
%>

<script language = "JavaScript">
<!--
window.alert ("too much idle time, please login again");
//-->
</script>
<%
response.End()
end if
%>

【问题讨论】:

  • 您提供的代码在哪里?如果是客户端的javascript/vbscript,你应该无法获取会话变量,如果是服务器端,你应该无法发出警报...
  • @Damovisa,我已经发布了我的代码。有什么想法有什么问题吗?
  • 知道了——我刷新了,你更新了代码:)

标签: session asp-classic


【解决方案1】:

确保您的网站位于相同的区分大小写的文件夹中

例如

http://myserver.com/MyWebSite/

没有与

相同的会话cookie

http://myserver.com/mywebsite/

所以它会让你退出。

【讨论】:

  • 我首先听说过这种行为?你能提供任何参考吗?
  • “许多 Web 浏览器,包括 Microsoft Internet Explorer 4.0 或更高版本,以及 Netscape 浏览器,都保留 cookie 路径的大小写。” msdn.microsoft.com/en-us/library/ms525506.aspx
  • 当 IE 4 出现并且我的 ASP 应用程序被破坏时,我有很多痛苦的经历;)
  • @u07ch,我们使用的是 IE 7 或 IE 8。似乎此问题不适用于 IE 7 或 IE 8?
【解决方案2】:

这可能是 IIS 对您的应用程序查看超时的限制。

试试这个:

  1. 在 IIS 中右键单击您的应用文件夹
  2. 然后转到属性 -> 虚拟目录选项卡 -> 然后右下角的配置按钮
  3. 如果已禁用,则首先单击“创建”按钮创建应用程序
  4. 在配置窗口下点击Options选项卡,你会发现SESSION TIMEOUT默认设置为20(分钟)

希望这是对你祈祷的回应:)

【讨论】:

    【解决方案3】:

    检查您的应用在其中运行的应用程序池是否由于某种原因未回收。例如,它是否具有更激进的空闲超时(在测试场景中,您可能是唯一使用该应用程序的人,因此您不使用它不仅构成空闲会话,而且构成空闲应用程序)。

    可以配置应用程序池的各种不同原因都会触发回收。

    当您遇到无异常超时时检查事件日志,那里有什么异常吗?

    【讨论】:

    • 我对你的回复很感兴趣,几个问题/cmets,1.为什么应用程序池回收会使会话超时(我认为IIS应该设计得很好,有实时会话,不应该使应用程序池回收)以及如何检查 IIS 中的当前超时设置? 2. 从 Windows 事件日志或 IIS 日志中,是否可以检查会话超时问题是否是由应用程序池回收引起的? 3.“当你有一个无例外的超时时检查事件日志”——IIS的事件日志?操作系统还是我的应用程序?
    • @George: 1. IIS 以这种方式超时是不错的设计。应用程序池对其中运行的应用程序种类知之甚少,这是一个很好的设计。因此,它不知道会话管理等应用程序特定功能是非常合适的。在 IIS 6 管理器打开应用程序池分支中,选择池上的属性,在性能选项卡上有一个空闲超时部分。在 IIS 7 中,选择应用程序池后,单击操作窗格中的高级设置...,空闲超时位于进程模型类别中。
    • @George:2 和 3。没有特别说明,但记录了意外的回收。在应用程序池的 IIS7 高级设置中,还有一个“生成回收事件日志条目”值,您可以在其中配置哪些回收事件生成日志。如果 IIS 6 有这样的功能,但它没有在我可以看到的管理 UI 中公开,我不会感到惊讶。
    • @AnthonyWJones, 1. 如果我在我的代码中明确设置了会话超时,并在IIS concole中配置了会话超时,还配置了应用程序池空闲时间,哪一个会生效? 2. 我觉得应用池重启或者闲置一段时间,session就会全部过期,对吗?如果是,我很感兴趣应用程序池将如何处理空闲?和 ASP 对待空闲的方式一样(在会话过期的情况下)?
    【解决方案4】:

    基于您的更新的一些想法:

    1. 您的session("timeToken") 可能为空还有其他原因吗?某处的另一段代码或者变量在某处拼写错误?

    2. session("timeToken") 的实际值在您的代码中有何变化?它是在会话开始时设置的吗?是否定期更新?它存储了什么值?

    您编写的代码似乎没问题,所以如果不是代码问题,很可能是真正的会话问题……只是需要先检查一些事情。

    更新:

    • ASP 会话状态通常使用 cookie 维护 - 您能否检查客户端是否启用了 cookie?
    • ASP 应用程序是否由多个服务器提供服务?如果它是从网络场或集群提供服务的,您需要确保会话状态可以在机器上持续存在,或者用户的会话是“粘性的”——也就是说,它始终由同一台服务器提供服务。

    更多信息和帮助可以在这里找到:http://msdn.microsoft.com/en-us/library/ms972338.aspx

    【讨论】:

    • 什么意思“2.session("timeToken")的实际值如何变化?” -- 在什么情况下它会自动从我的代码中改变出来?
    • 如果您能告诉我来自 IIS 或操作系统或浏览器端的任何影响会话到期的设置,不胜感激?
    • 抱歉耽搁了 - 我在回答中提出了更多想法
    • @Damovisa,还有一个问题。检查会话变量是否为 String.Empty 来确定会话是否像我在原始代码中显示的那样过期是优雅的代码吗?我有这种困惑,因为我没有找到提到这是优雅方式的正式文件。
    • 我的客户端启用了会话,我使用单个 Web 服务器来托管 Web 应用程序,使用进程内会话管理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2013-09-18
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多