为什么在StateServer模式下运行时会丢失会话?

时间:2010-04-23 11:30:01

标签: asp.net session stateserver

我已检查服务器(Win Server 2003)应用程序事件日志中是否存在未显示的以下问题http://support.microsoft.com/kb/308097。对于随机用户来说,会话​​似乎随机丢失

这是一个单一的服务器设置,没有网络农场,也没有负载平衡

即使我在上面指出的问题没有出现在日志中,还是值得增加stateNetworkTimeout属性吗?目前的配置只是

<sessionState mode="StateServer" cookieless="false" stateConnectionString="tcpip=localhost:42424" timeout="60"/>

更新

使用FormsAuth和Timeout设置为60

IIS6设置

  1. 回收工作进程(以分钟为单位)= 120
  2. 回收工作进程(请求数)= 35000
  3. 在以下时间回收工作进程=未选中
  4. 最大虚拟内存=未选中
  5. 最大已用内存=未选中
  6. 空闲后关闭工作进程= 90
  7. 限制内核请求队列= 1500
  8. Everthing else =未选中

2 个答案:

答案 0 :(得分:4)

我意识到这是一个较老的问题,但我最近遇到过类似的问题。就我而言,额外的日志记录显示,在一系列.aspx页面中,Session变量似乎随机丢失。

在遇到这个blog post后,我查看了我的代码,果然,我的所有Response.Redirect语句都是默认语句(例如Response.Redirect(target)或true)(例如Response.Redirect(target,真的))。明智地审查我的重定向并将Session变量设置后的那些设置为false(例如Response.Redirect(target,false)) - 问题[貌似]解决了!我会注意到你需要在执行此操作时要小心,因为在传递false时重定向之后页面的其余部分仍将执行。在许多情况下,我需要在重定向之后添加一个return语句,以防止运行在重定向后我不打算运行的代码。

我只在生产和负载下遇到过丢失的会话变量(从不在开发或测试中)。关于为什么这解决了我的问题的理论是Response.Redirect(默认/ true)强制结束执行线程 - 如果线程仍在忙于序列化会话对象并将它们放回状态服务器时(线程)被中断,他们(会话对象)可能会丢失。

答案 1 :(得分:0)

您还需要在表单身份验证部分设置超时(默认为30分钟)

http://weblogs.asp.net/scottgu/archive/2005/11/08/430011.aspx