ASP.NET 3.5:什么原因会导致会话提前超时?

4
我们的会话设置为120分钟后超时。然而,最近我们的一个生产服务器遇到了很多问题。由于我无法访问服务器本身,因此我的信息有限。我们有两个服务器部署我们的网站。服务器A一直正常工作,但服务器B经常出现会话过期的问题。这是最近才发生的,大约在过去两周内。
我知道我提供的信息不足以直接确定问题,但是有哪些问题可能导致会话被无缘无故地重置呢?

你是否正在使用某种负载均衡? - canon
5个回答

4
显然,我已经解决了问题。我同时打开了两个服务器的IIS7应用程序池高级设置,并注意到一个差异:在A服务器上,“定期时间间隔”设置为5,在B服务器上则为1740。我将A服务器的设置更改为1740(默认值),问题立即停止了。
奇怪的是,这发生在服务器管理员执行一个月前的回滚操作时。某些东西出了问题,导致这些设置必须被改变。
虽然我仍然不完全理解我所做的是如何解决问题的,但要么这只是巧合,要么就是那个低的5分钟设置是问题所在。
如果有人能够阐明这一点,那么请务必这样做。

1
应用程序池可能因多种原因而回收。有许多设置,超过其中任何一个都会导致 ASP.NET 回收:
  1. 回收工作进程(以分钟为单位)
  2. 回收工作进程(按请求计数)
  3. 在以下时间回收工作进程
  4. 最大虚拟内存
  5. 最大使用内存

如果您正在使用 in-proc 会话状态,则如果应用程序池回收,会话将丢失。

如果没有更改任何设置,则最有可能是您遇到了内存问题,可能是由于内存泄漏引起的(这可能不是“真正”的泄漏,但是在应该释放时仍然保留了引用)。

您说您正在使用两个服务器。如果会话状态丢失,则听起来您正在使用 in-proc 会话状态。在这种情况下,我假设您正在使用带有“粘性会话”(后续请求发送到同一服务器)的负载平衡?

如果我错了,并且您正在使用共享状态(例如 SQL Server 会话状态提供程序或 State Server),那么您的服务器时钟是否不同步?


是的,有两个负载均衡服务器。我以前从未听说过“进程内”会话这个术语,但它使用服务器内存来进行会话,而不是数据库表。我需要更多地研究1-3项,但对于4和5项,它们是基于硬件和/或操作系统配置还是在web.config中设置的?换句话说,如果服务器有8GB RAM,那么在web.config中是否有最大虚拟/已用内存设置,会覆盖它? - oscilatingcretin

1

有几件事需要考虑:

正如@Steve Morgan所说,如果您正在使用进程内会话和“粘性”会话,则可能是负载均衡器中存在问题导致的。在负载平衡时,会话应始终为进程外,因为“粘性”并不意味着会话不会在两台机器之间跳动。这只是意味着它不太可能发生。如果负载均衡器超载,则用户将被发送到与第一个服务器不同的服务器。

应用程序池回收是丢失会话的另一个原因;再次由于使用进程内会话管理。如果您转移到进程外,它将隐藏该问题。然而,这里真正的问题需要进行调查,因为它几乎总是由糟糕的代码引起的。

我猜您可能遇到了多种问题。首先尝试移动到进程外会话并设置状态服务器。这将解决即时痛苦。然后开始查看负载均衡器和Web服务器日志,以确定是否需要更好的负载均衡器或需要进行代码更改以修复内存泄漏。


0
最近您的服务器上是否新增了任何新站点?當我們轉移到.NET 4時,出現了這個問題,我們沒有想到要為新的.NET 4站點創建一個新的應用程序池(而不是.NET 2/3.5的)。這導致應用程序池不斷重啟,因為它們無法在同一個應用程序池下運行。
此外,您是否上傳了任何可能卡在循環中的新代碼,這也可能會使應用程序池崩潰,導致會話重啟?
還有一個想法...您的服務器上是否有待安裝的更新...這也可能會造成無法解釋的問題。

-1

工作解决方案:

  1. 在服务中启动“ASP.NET状态服务器”(将其设置为自动启动,以便始终启动)
  2. 将以下内容添加到您的web.config中(按原样复制!):
<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以获得更多的性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接