Asp classic ASP在两页之间丢失会话

Asp classic ASP在两页之间丢失会话,asp-classic,windows-server-2008-r2,Asp Classic,Windows Server 2008 R2,当客户从Windows 2003升级到2008R2时,我不得不为他们更新旧的ASP+COM应用程序。这个过程虽然不是100%无痛,但还是成功了,但仍然存在一个问题:应用程序似乎随机丢失了会话状态,或者至少丢失了保存会话COM对象的会话变量 基本上,该应用程序的工作原理如下: 登录表单页面->登录页面(在那里创建对象并保存在会话(“MyObject”),选中用户凭据->第一个实际应用程序页面(在代码顶部选中会话(“MyObject”) 仅当凭据正确但始终创建对象时,才会发生第二次重定向 但是,用户

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

基本上,该应用程序的工作原理如下:

登录表单页面->登录页面(在那里创建对象并保存在会话(“MyObject”),选中用户凭据->第一个实际应用程序页面(在代码顶部选中会话(“MyObject”)

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

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

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

更重要的是,它远不是系统性的:这个问题经常发生,但肯定不是一直都会发生。当它启动时,用户必须登录2到3次才能通过。如果应用程序被回收,它通常会解决一些问题,尽管这不是系统性的,甚至不总是必要的

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

编辑:一些额外信息:

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

我确实有一个asp网站在过去做了完全相同的事情。您需要检查日志文件,查看此应用程序或网站是否在其自己的专用应用程序池上运行,以及应用程序池是否由于错误代码而未被自动回收。如果正在创建会话,则删除该会话,然后通过初始会话n值到另一个会话-说会话(“MyObject2”)并在主页中检查。如果用户仍在注销,则我确信应用程序池正在被回收,因为有太多失败,例如重定向无限循环或其他


编辑:还有一件事。我以前在使用ASP和MS Access时经常看到这样的错误,但我从来没有发现过。

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

此外,在查找Session_oned事件时,我看到一篇文章,其中指出它在IIS 7.0中的行为异常,请参见以防万一


祝你好运。

页面中是否有
错误恢复下一步
,以便不会显示任何实际错误?否,错误不会被抑制。MyObject中存储的内容--classic ASP在会话中存储对象时有困难。你能不能在会话中以不同的方式存储用户?会话变量中存储的内容是什么是COM对象的实例。该对象是实际执行所有工作并保存用户会话状态的元素。如果不重写大部分应用程序,则无法以不同的方式存储它(它实际上是一个非常旧的程序的端口,最初在NT4上运行,然后在2003年被移植到200)。它曾在2003年完美运行,因此,从历史上看,IIS可以很好地完成这项工作,谢谢你的回答。我检查了日志文件,没有发现应用程序被回收,甚至失败(虽然很可能应用程序包含一些bug,甚至可能会阻止内置错误跟踪和崩溃转储工作的bug)。如果我错过了,你能更具体地说明你在说什么日志吗?哦,它根本不使用access。我会检查你的“其他会话变量”诀窍:我没有想到。谢谢。应用程序池回收会导致所有会话终止,所以很可能这就是问题的根源。我刚刚记得的另一件事,但不确定它是否会有帮助,就是如果您可能在Windows 2008 R2 64位上运行32位DLL,那么您需要从advan启用32位应用程序应用程序池的ced设置。下面是如何获取有问题的应用程序池的所有日志:看起来似乎COM对象中确实存在错误,导致应用程序回收。我会找到并修复它,但您给了我正确的指示,让我朝着正确的方向看,非常感谢。很高兴我能够提供帮助!让我知道它是如何完成的好的,谢谢。