当客户从 Windows 2003 升级到 2008R2 时,我不得不为他们更新旧的 ASP+COM 应用程序。该过程虽然不是 100% 无痛,但还是成功了,但仍然存在一个问题:应用程序似乎随机丢失了会话状态,或者至少丢失了我保存会话 COM 对象的会话变量。
基本上,该应用程序的工作方式如下:
登录表单页面 -> 登录页面(在此处创建对象并保存在 Session("MyObject") 中,检查用户凭据 -> 第一个实际应用程序页面(在代码顶部检查 Session("MyObject"))。
仅当凭据正确但始终创建对象时才会发生第二次重定向。
但是,用户报告说他们在输入凭据后经常被重定向到登录表单页面。
经过一番调查,应用程序似乎正确地通过了登录页面,创建了 COM 对象的实例并重定向到了第一个应用程序页面。在那里,会话变量再次为空,因此用户被发送回登录表单。
更重要的是,它到目前为止还不是系统的:问题发生得相当频繁,但绝对不是一直发生。当它启动时,用户必须登录 2 或 3 次才能通过。如果应用程序被回收,它通常会在一段时间内解决问题,尽管这不是系统的,甚至不是总是必要的。
有人知道这里会发生什么吗?
编辑:一些额外的信息:
- ASP 会话处理处于活动状态
- 在代码的任何部分都不会默默地抑制错误。如果它们发生在 COM 对象可以捕获它们的地方,或者用户可以捕获它们,它们将进入日志文件。
- 在 COM 对象日志文件、IIS 日志或服务器的事件日志中看不到任何错误。
- 使用 ProcMon 跟踪流程活动并没有发现任何特别之处。
- 查看 COM 对象日志文件,我清楚地看到正在创建 COM 对象实例,从登录页面调用“LoginUser”方法并成功返回,然后调用第一个应用程序页面并检查存储的对象是否存在在会话失败。
- 有一个 Web 服务器,没有服务器场。