【问题标题】:ASP losing session between two pagesASP 在两个页面之间丢失会话
【发布时间】:2013-01-16 08:46:05
【问题描述】:

当客户从 Windows 2003 升级到 2008R2 时,我必须为他们更新旧的 ASP+COM 应用程序。这个过程虽然不是 100% 无痛,但还是成功了,但仍然存在一个问题:应用程序似乎随机丢失了会话状态,或者至少丢失了我保存会话 COM 对象的会话变量。

基本上,该应用程序是这样工作的:

登录表单页面 -> 登录页面(在此处创建对象并保存在 Session("MyObject") 中,检查用户凭据 -> 在代码顶部检查第一个实际应用程序页面(Session("MyObject")) )。

仅当凭据正确但始终创建​​对象时才会发生第二次重定向。

但是,用户报告说他们在输入凭据后经常被重定向到登录表单页面。

经过一番调查,应用程序似乎正确地通过了登录页面,创建了 COM 对象的实例并重定向到了第一个应用程序页面。在那里,会话变量再次为空,因此用户被发送回登录表单。

更重要的是,它还不是系统性的:问题发生得相当频繁,但绝对不是一直发生。当它启动时,用户必须登录 2 或 3 次才能通过。如果应用程序被回收,它通常会在一段时间内解决问题,尽管这不是系统的,甚至不是总是必要的。

有人知道这里会发生什么吗?

编辑:一些额外的信息:

  • ASP 会话处理处于活动状态
  • 代码的任何部分都没有被静默抑制错误。如果它们发生在 COM 对象可以捕捉到它们的地方或用户可以捕捉到的地方,它们将转到日志文件。
  • 在 COM 对象日志文件、IIS 日志或服务器的事件日志中看不到任何错误。
  • 使用 ProcMon 跟踪进程活动并没有发现任何特别之处。
  • 查看 COM 对象日志文件,我清楚地看到正在创建 COM 对象实例,从登录页面调用“LoginUser”方法并成功返回,然后调用第一个应用程序页面并检查是否存在会话中存储的对象失败。
  • 只有一个 Web 服务器,没有服务器场。

【问题讨论】:

  • 您是否在页面中有on error resume next 以便不会显示任何实际错误?
  • 不,错误没有被抑制。
  • MyObject 中存储的内容——经典 ASP 难以在会话中存储对象。您不能以不同的方式将用户存储在会话中吗?
  • 会话变量中存储的是COM对象的一个​​实例。该对象是实际完成所有工作并保存用户会话状态的元素。如果不重写大部分应用程序,就无法以不同的方式存储它(它实际上是一个非常古老的程序的一个端口,最初在 NT4 上运行,然后被移植到 200,然后是 2003)。它曾经在 2003 年完美运行,所以从历史上看,过去 IIS 可以很好地完成这项工作,

标签: asp-classic windows-server-2008-r2


【解决方案1】:

我确实有一个 ASP 网站在过去做了完全相同的事情。您需要检查日志文件并查看此应用程序或网站是否在其自己的专用应用程序池上运行,并且由于代码错误,应用程序池没有被自动回收。如果会话正在创建然后被删除,则将初始会话值传递给另一个会话 - 比如说 Session("MyObject2") 并在主页中检查它。如果用户仍然被注销,那么我确信应用程序池正在被回收由于太多失败,例如重定向无限循环或其他原因。

编辑:还有一件事。在使用带有 MS Access 的 ASP 时,我经常看到这样的错误,但我永远无法弄清楚。

【讨论】:

  • 感谢您的回答。我检查了日志文件,没有看到有关应用程序被回收甚至失败的任何信息(尽管应用程序很可能包含一些错误,甚至可能阻止内置错误跟踪和故障转储工作的错误)。如果我错过了,您能否更具体地说明您正在谈论的日志?哦,它根本没有使用访问权限。不过,我会检查您的“其他会话变量”技巧:我没有想到。谢谢。
  • 应用程序池回收使所有会话终止,因此这很可能是您的问题的根源。我刚刚记得但不确定是否会有所帮助的另一件事是,您是否可能在 Windows 2008 R2 64 位上运行 32 位 dll,因此您需要从应用程序池的高级设置中启用 32 位应用程序。以下是如何获取相关应用程序池的所有日志:blogs.iis.net/ganekar/archive/2008/12/12/…
  • 看起来确实是 COM 对象内部的错误导致应用程序回收。我会找到并修复它,但您给了我正确的指示,让我朝着正确的方向前进,非常感谢。
  • 很高兴我能提供帮助!让我知道结果如何。谢谢。
【解决方案2】:

作为调试练习,我很想记录来自 ASP 会话事件的信息,包括会话 OnStart、OnEnd 和放弃。也许尝试从请求中获取尽可能多的信息,然后为会话制定一个给定的生命周期/页面流,然后确定会话结束或放弃时是否有任何共同点。

另外,在查找 Session_OnEnd 事件时,我发现一篇文章表明它在 IIS 7.0 中的行为很奇怪,请参阅http://blogs.iis.net/lprete/archive/2009/01/04/session-onend-classic-asp-and-iis-7-0.aspx,以防万一这可能有用。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 2012-10-25
    • 2023-03-24
    • 1970-01-01
    • 2012-06-15
    • 2011-12-15
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多