3

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

基本上,该应用程序的工作方式如下:

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

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

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

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

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

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

编辑:一些额外的信息:

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

2 回答 2

2

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

编辑:还有一件事。在将 ASP 与 MS Access 一起使用时,我经常看到此类错误,但我永远无法弄清楚。

于 2013-01-19T06:44:13.787 回答
0

As a debugging exercise, I'd be tempted to log info from the ASP Session events including the session OnStart, OnEnd and abandon. Maybe try and get as much info from the request and then work out a given lifecycle/page flow for sessions and then determine if there is anything in common that occurs when the session is either ended or abandoned.

Also, while looking up the Session_OnEnd event, I came across an article that suggests it behaves weirdly in IIS 7.0 See http://blogs.iis.net/lprete/archive/2009/01/04/session-onend-classic-asp-and-iis-7-0.aspx just in case this might be of use.

Good luck.

于 2013-01-24T08:56:19.303 回答