gpt4 book ai didi

ASP.NET 随机丢失 session 值

转载 作者:行者123 更新时间:2023-12-02 17:21:15 27 4
gpt4 key购买 nike

我已经为此寻找答案很长一段时间了,因为它继续困扰着我。我们在 session 状态(InProc)中存储用户登录信息和有关用户当前事件的其他数据。我经常在尝试使用 session 变量之一时遇到空引用异常。它发生在随机页面上,具有随机 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" />

我已将 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)

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

当特定 session 变量丢失时,同一用户的大多数其他 session 变量仍然存在。此外,通常还有另外 10-20 个登录该网站的用户在发生这种情况时不会受到影响。
收到错误的用户将备份,再次浏览相同的页面,并且它会正常工作。

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

由于其随机性,我无法在调试中使其发生,但我确实相信它也会在我们的开发环境中随机发生。开发服务器的规范与生产服务器几乎相同。
这两个环境都是隔离的,并作为单个 Web 服务器运行,而不是 Web 场的一部分。

我想我可能会尝试实现一个状态服务器来摆脱 InProc 模式,但这只是又一次黑暗中的尝试..
除了尝试状态服务器之外,我还能做些什么来识别何时发生或防止这种情况发生?

最佳答案

如果您的 Web 应用程序部署在服务器场上(多个服务器 Web)正如您所说,您正在使用 InProc session ,并且用户可能会重定向到与存储该 session 变量的服务器不同的服务器。在这种情况下,您应该像您提到的那样进行进程外 session ( session 状态服务器)

如果您选择状态服务器,请记住以下几点,以防止出现任何其他问题:

Since the Stateserver combines the ASP.NET Session ID with the IIS application path to create a unique key, sessions issued for one of the five new webs could not be found when accessed through one of the other webs which is obviously extremely unfortunate in a weighted round robin load balanced web farm

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

关于ASP.NET 随机丢失 session 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6958775/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com