【发布时间】:2012-02-19 02:53:18
【问题描述】:
我的 In-Proc 会话状态存在生产问题。
我们的应用程序基于 MVC 3 .NET 框架,并集成到我们运行 Sitecore CMS 的站点中。
我们的用户在整个应用程序流程中随机遇到“对象引用未设置为对象实例”。
经过大量的日志记录和跟踪,我们可以得出结论,这是由于会话对象返回 null 造成的。
这里有一些关于我们发现和知道的细节。
- 会话 ID 对同一用户保持不变并通过了所有 正确进入应用程序的方式。
- 我认为这不是代码问题,因为这只在生产环境中随机发生,绝不会在本地、开发或暂存环境中发生。
- 有两个生产服务器通过负载平衡器运行。
- 不是服务器持久性问题,因为我们通过休眠其中一台服务器并将所有流量路由到一台服务器进行了测试。此外,通过日志记录,我们可以识别出该用户正在访问同一台服务器,但会话已变为空。
- 这似乎也不是客户端问题,因为即使之前遇到错误,他们也能够成功通过应用程序。
- 这似乎不是流量负载或服务器负载问题,因为它在一天中的随机时间发生,并且在此期间发生在随机用户身上。
- 这似乎不是回收应用程序池造成的。
- 这似乎不是由会话超时引起的,因为我们已将超时设置为两小时,并且在我们跟踪日志时,用户可能会在 5-10 分钟内体验到流程。
旁注:由于我们的 Sitecore CMS,我们必须使用 In-Proc 会话状态。所以改变设计不是一种选择。
我有一个理论,它可能与会话锁定或因并发访问尝试而损坏有关。
在我们的应用程序中我们经常看到这个问题发生的几个地方是当用户被 javascript (windows.location) 重定向时。
以及在进行异步 ajax 调用的区域。
我们对此一直摸不着头脑,我想知道是否有人对可能出现的问题有任何见解或理论?
谢谢
补充说明:
@Mystere && @H27Studio,所以我还发现了一些与 sessionID 或会话重置问题有关的东西。在某些情况下,我们发现在页面重定向上它会触发对该方法的两次重复的GETS调用,第一次调用缺少sessionID并随机重定向到其中一个服务器(这是因为来自负载均衡器的服务器持久会话是基于客户端 IP、sessionID 和其他标头信息来创建唯一会话以将客户端保持在一台服务器上)。当我们的重定向页面使用 window.location 时,每次在流程中都会发生这种情况。
如果错误的、没有 sessionID 调用击中同一服务器,这将导致客户端出现“未设置对象引用..”问题。 (这可能是因为第一个没有 sessionID 的错误调用导致应用程序创建一个覆盖原始会话对象的新会话)所以即使在第二次调用正确的 sessionID 传递给应用程序时,我们也会发现会话对象包含 null .
所以我认为清除会话对象的重复调用存在问题,不确定原因或原因导致该对象开始。
有人知道这件事吗?谢谢
更新: 我们正计划采取这些措施来解决这个问题。
- 我们在进行 Async Ajax 调用的区域存在问题,因此我们计划移除 Async 功能并让它与 Ajax 同步运行。
- 我们遇到了发生 Windows.location javascript 重定向的问题。我们创建了一种使用回发的替代方法,希望能解决该领域的问题。
- 与上述问题之一无关的其他领域仍悬而未决。
一旦我们将其部署到生产环境中,就会发布更改的效果。
感谢所有cmets。
【问题讨论】:
-
不信任会话超时。如果服务器需要更多内存,它将释放会话。我有 1 小时的工作时间,但大多数人仍然会在 20 分钟之前放松训练,有时会在 5 到 10 分钟。 (而且它是一台具有 69Gbs 内存的机器,而且流量并不多......)
-
即使在
elmah使用inproc登录等之后,我的公司也一直在为此摸不着头脑... -
@H27studio,你有没有参考“如果服务器需要更多内存,它将释放会话”?
-
Bte,您确定负载均衡器不会在高负载时间将用户从一台服务器发送到另一台服务器吗?听起来确实如此。
-
@Mystere Man 和 @@H27studio,我已经添加了关于您的评论的附加说明。感谢 cmets
标签: .net asp.net-mvc-3 session sitecore inproc