【发布时间】: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