我们的会话设置为120分钟后超时。然而,最近我们的一个生产服务器遇到了很多问题。由于我无法访问服务器本身,因此我的信息有限。我们有两个服务器部署我们的网站。服务器A一直正常工作,但服务器B经常出现会话过期的问题。这是最近才发生的,大约在过去两周内。
我知道我提供的信息不足以直接确定问题,但是有哪些问题可能导致会话被无缘无故地重置呢?
我知道我提供的信息不足以直接确定问题,但是有哪些问题可能导致会话被无缘无故地重置呢?
如果您正在使用 in-proc 会话状态,则如果应用程序池回收,会话将丢失。
如果没有更改任何设置,则最有可能是您遇到了内存问题,可能是由于内存泄漏引起的(这可能不是“真正”的泄漏,但是在应该释放时仍然保留了引用)。
您说您正在使用两个服务器。如果会话状态丢失,则听起来您正在使用 in-proc 会话状态。在这种情况下,我假设您正在使用带有“粘性会话”(后续请求发送到同一服务器)的负载平衡?
如果我错了,并且您正在使用共享状态(例如 SQL Server 会话状态提供程序或 State Server),那么您的服务器时钟是否不同步?
有几件事需要考虑:
正如@Steve Morgan所说,如果您正在使用进程内会话和“粘性”会话,则可能是负载均衡器中存在问题导致的。在负载平衡时,会话应始终为进程外,因为“粘性”并不意味着会话不会在两台机器之间跳动。这只是意味着它不太可能发生。如果负载均衡器超载,则用户将被发送到与第一个服务器不同的服务器。
应用程序池回收是丢失会话的另一个原因;再次由于使用进程内会话管理。如果您转移到进程外,它将隐藏该问题。然而,这里真正的问题需要进行调查,因为它几乎总是由糟糕的代码引起的。
我猜您可能遇到了多种问题。首先尝试移动到进程外会话并设置状态服务器。这将解决即时痛苦。然后开始查看负载均衡器和Web服务器日志,以确定是否需要更好的负载均衡器或需要进行代码更改以修复内存泄漏。
工作解决方案:
<system.web>
<sessionState mode="StateServer"
stateConnectionString="tcpip=localhost:42424"
cookieless="false"
timeout="60" />
<machineKey validationKey="DCB7132A24938F2166E362214ADAD861FA6B819E0A337F0E63257F87014A37B5EBC5D9F9AD107C38E3D3378BC35CBAF81407F3E4D8BA430FD65348DDCC469623" decryptionKey="DD09731F76271B2AAE6AE957626F8D1B8E3CBF11EF8E3CDDF01332CDF914D4B5" validation="SHA1" decryption="AES" />
</system.web>
**注意:或者生成您自己的机器密钥:http://aspnetresources.com/tools/machineKey
现在,您可以回收应用程序池、修改web.config或重新启动web服务,而会话仍然保留!
现在,您还可以在池中启用Web Garden以获得更多的性能。