我有一个In-Proc会话状态的生产问题。MVC3 .NET会话随机丢失会话值并返回为空
我们的应用程序基于MVC 3 .NET框架,并集成到我们运行Sitecore CMS的站点中。
我们的用户在整个应用程序流程中都会遇到“对象引用未设置为对象的实例”。
经过广泛的日志记录和跟踪之后,我们可以得出结论,这是在会话对象返回null时导致的。
下面是关于我们发现的以及我们所知道的一些细节。
- 会话ID对于同一个用户持续存在,并以正确的方式将所有的 传递给应用程序。
- 我不认为这是一个代码问题,因为这只发生在随机时间间隔的生产中,绝不会发生在本地,开发或分段环境中。
- 有两台生产服务器通过负载平衡器运行。
- 不是服务器持久性问题,因为我们通过睡眠服务器之一并将所有流量路由到一台服务器进行测试。通过日志记录,我们可以确定用户正在访问同一台服务器,但会话已变为空。
- 这似乎也不是一个客户端问题,因为即使它们以前遇到错误,它们也能够成功地通过应用程序。
- 这似乎不是一个流量负载或服务器负载问题,因为它发生在随机时间的一天,发生在随机用户期间。
- 这似乎不是由回收应用程序池造成的。
- 这似乎不是由会话超时引起的,因为我们将超时设置为两个小时,而在我们跟踪日志时,用户可以在流中体验这个5-10分钟。
备注:由于我们的Sitecore CMS,我们必须使用In-Proc会话状态。所以改变设计不是一种选择。
我有一个理论,它可能与会话锁定或从并发访问尝试损坏有关。
有几个地方我们看到这个问题的发生很多从我们的应用程序是当用户被JavaScript(windows.location)重定向。
而在正在进行异步ajax调用的区域。
我们在这个问题上一直在挠头,我想知道有没有人会对这个问题有什么看法或理论?
感谢
新增注:
@Mystere & & @ H27Studio,所以我也发现了关于会话ID或会话重置问题的东西。在某些情况下,我们发现在页面重定向时,它会触发对该方法的两次重复GETS调用,第一次调用缺少sessionID并随机重定向到其中一个服务器(这是因为来自负载均衡器的服务器持久会话是基于客户端IP,会话ID和其他头信息创建独特的会话,以保持客户端在一台服务器上)。当我们的重定向页面使用window.location时,每次都会发生这种情况。
如果bad,no sessionID调用碰到同一台服务器,这将导致客户端的“Object reference not set ..”问题。 (这可能是因为没有sessionID的第一次错误调用导致应用程序创建覆盖原始会话对象的新会话)因此,即使在正确的sessionID传递到应用程序的第二个调用中,我们也会发现session对象包含null 。
所以我相信有重复调用清除会话对象的问题,它不知道为什么或者是什么原因造成的。
任何人都有这方面的线索?谢谢
更新: 我们计划采取这些步骤,希望能够解决此问题。
- 我们在制作异步Ajax调用的地方存在问题,所以我们打算删除异步功能并让它同步运行Ajax。
- 我们遇到了Windows.location的JavaScript重定向发生的问题。我们已经创建了一个使用回传的替代方法,希望能够解决这个问题。
- 其他与上述问题无关的区域仍然悬而未决。
一旦我们将其部署到生产环境中,更改的效果将会发布。
感谢您的所有意见。
不信任会话超时。如果服务器需要更多内存,它将释放会话。我有一个小时的工作时间,大多数人在20分钟之前会休会,有时会在5-10分钟之内。 (它是一台拥有69Gbs内存的机器,而且流量不是很大......) – H27studio
我的公司一直在为此挠头,即使在使用'inproc'进行'elmah'等测试之后...... –
@ H27studio,你有没有参考“如果服务器需要更多的内存,它将释放会话”? –