ASP.NET随机丢失会话值

Ste*_*hen 7 asp.net session

我一直在寻找相关时间的答案,因为它继续困扰着我.我们在会话状态(InProc)中存储用户登录信息和有关用户当前活动的其他数据.我经常尝试使用其中一个会话变量的Null Reference异常.它发生在随机页面上,带有随机的Session变量.我修改了web.config httpRuntime和compliation标签以防止appPool重启:

<httpRuntime requestValidationMode="2.0" waitChangeNotification="86400" maxWaitChangeNotification="86400" />
<compilation debug="False" strict="false" explicit="true" targetFramework="4.0" numRecompilesBeforeAppRestart="1000" />
Run Code Online (Sandbox Code Playgroud)

我已将IIS设置为在凌晨3点重新启动应用程序池,以确保在人们忙于使用服务器时它不会重新启动.我正在事件日志中记录应用程序池重新启动,以确保我知道它何时发生.

Dim runtime As HttpRuntime = GetType(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic Or BindingFlags.Static Or BindingFlags.GetField, Nothing, Nothing, Nothing)
Dim shutDownMessage As String = runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing)

Dim shutDownStack As String = runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, runtime, Nothing)
Dim evtSource As String = "ASP.NET"
Dim log As New EventLog
log.Source = evtSource
log.WriteEntry(String.Format("_shutDownMessage={0}{2}_shutDownStack={1}", shutDownMessage, shutDownStack, vbCrLf & vbCrLf), EventLogEntryType.Warning)
Run Code Online (Sandbox Code Playgroud)

应用程序池重新启动时,我会收到事件日志条目.发生这些错误时,应用程序池不会重新启动.

当特定会话变量丢失时,同一用户的大多数其他会话变量仍然存在.此外,通常还有另外10-20个用户登录该站点时不会受到影响.
获得错误的用户将备份,再次浏览相同的页面,它将正常工作.

我在运行带有.NET 3.5 32位和4GB内存的IIS6的Windows Server 2003(32位)上遇到此问题.作为我们服务器升级的一部分,大约一年前我们得到了一个新的Web服务器 - 运行IIS的Windows Server 2008(64位) 7带16GB内存.我将网站升级到.NET 4.0 64位.在新机器上仍然存在相同的问题(通常每天1-3次 - 在一天中的随机时间).

由于其随机特性,我无法在调试中实现它,但我相信它也会在我们的开发环境中随机发生.开发服务器实际上与生产服务器具有相同的规格.
这两个环境都是隔离的,并作为单个Web服务器运行,而不是Web场的一部分.

我想我可能会尝试实现一个状态服务器以退出InProc模式,但这只是在黑暗中的另一个刺痛.
除了尝试状态服务器之外,还有什么我可以做的来确定何时发生这种情况还是防止它?

Mas*_*uso 7

如果您的Web应用程序部署在服务器场(多于一个服务器Web)正如您所说的那样,您正在使用InProc会话,并且可能会发生用户重定向到与存储该会话变量的服务器不同的服务器.在这种情况下,你应该像你提到的那样进行proc会话(Session State Server)

如果您为了状态服务器而牢记以下内容,以防止出现任何其他问题:

由于Stateserver将ASP.NET会话ID与IIS应用程序路径相结合以创建唯一键,因此当通过其中一个Web访问时,无法找到为五个新Web中的一个发布的会话,这显然是非常不幸的加权循环负载平衡网络农场

http://www-jo.se/f.pfleger/session-lost

还要看一下这个记录器,了解该应用程序是否可以根据您的意愿进行回收:

http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx

http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx


Ste*_*hen 7

对于任何有兴趣或处理类似问题的人,我想在这里跟进我的问题的原因.

我在大约7或8个月前为应用程序缓存和会话状态实现了NCache进程外状态服务器.不幸的是,在我的网站上选择报告期间,在会话期间移动会话对我丢失随机会话变量的问题没有任何影响.而且,由于我无法复制这个问题,直到最近,当另一个问题让我的脑袋里的光线消失时,我还没有花更多的精力去尝试修复它.

为了达到目的 - 我没有覆盖我没有意识到的某个会话变量,但问题是用户正在打开第二个(或第三个)选项卡来并排比较报表选择选项.我们有几个自定义报告,用户可以选择多个选项来生成自定义报告(可以将其视为向导控件,其中有几个步骤可以创建自定义报告).如果用户在第3步(共5步)中,然后打开新选项卡并再次开始报告选择过程,则新选择将覆盖旧选项b/c 2个选项卡共享同一会话.我通过打开多个选项卡并逐步完成选择过程来验证这种情况.

我正在尝试区分多个报表运行,以便使用来自其他报表选择的唯一会话密钥存储一个报表的选择.这也证明是困难的,但与我认为缺少会话数据的问题并没有真正关联.

如果有人发现此帖并认为他们正在随机丢失会话数据并且无法复制它,请尝试调试您的网站并打开多个标签.同时踩到两个标签照亮了我的问题.

HTH