ASP.NET随机丢失会话值

时间:2011-08-05 15:28:40

标签: 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" />

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

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

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

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

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

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

6 个答案:

答案 0 :(得分:7)

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

进入proc会话

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

  

由于Stateserver将ASP.NET会话ID与IIS结合在一起   应用程序路径创建一个唯一的密钥,为其中一个发布的会话   当通过其中一个访问时,找不到五个新的网站   其他网站在加权方面显然非常不幸   循环负载平衡网络农场

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

答案 1 :(得分:7)

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

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

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

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

如果有人发现此帖并认为他们正在随机丢失会话数据而无法复制它,请尝试调试您的网站并打开多个标签。同时单步跳过两个标签可以解决我的问题。

HTH

答案 2 :(得分:1)

由于多种原因,您可能会遇到会话问题

  1. 会话过期:当您使用Inproc模式时,会话是 仅对sessiontimeout timeperiod有效。这是20分钟 默认。尝试在你的system.web部分使用sessionstate标记 web .config并将超时值设置为更大的值。

  2. 另一个问题可能是因为网络农场和网络花园。如果 您已为您的网站配置了Web场和Web园。 Inproc会话共享可能会导致问题。

  3. 进程重启:您网站的w3p进程正在进行中 由于代码中的某些问题而重新启动。或内存泄漏。

答案 3 :(得分:1)

我遇到了这个问题,因为我们的服务器设置为运行https。如果我在简单的http下运行,会话将不会被保留。但是,在https上运行时会保留会话。因此,我们设置了一个URL重写规则,以便在通过http进入时始终将应用程序发送到https。

此外,如果您在web.config文件中包含以下内容,则除非您正在运行https(请注意https末尾的S),否则会话将无法在本地或服务器上运行:

<httpCookies httpOnlyCookies="true" requireSSL="true"/>

答案 4 :(得分:0)

还有一个条件是会话可能会失去其价值。

您可以使用Fiddler工具来追踪此问题。

当你在解决方案中找不到像源这样的元素时,可以找到最多的条件。此时,服务器将尝试通过重新启动项目来重新加载无根据或丢失的对象。重新启动项目将导致重置所有会话对象。

感谢。

答案 5 :(得分:0)

由于我花了一段时间才想出这个,我想我会在这里发布这个以防万一它也帮助别人。

我遇到了IE和Chrome都随机丢弃会话变量的情况。我搜索和搜索,每个人都说通常的事情...检查域名,检查你的IIS设置的cookie ......等等。

我的问题结果是权限问题。

在我的web.config中,我有一个&#39; public&#39;的权限条目。未经身份验证的公众可以访问的文件夹。

<location path="public">
<system.web>
  <authorization>
    <allow users="*" />
    <allow users="?" />
  </authorization>
</system.web>

问题是公共端.js调用HttpHandler,而不是公共方面。 为了重用代码,我将安全和公共方面都指向了安全方面的代码。我猜这是一个副作用,它杀死了会话,没有非常有意义的错误消息。

我可以为该处理程序添加另一个条目,或者我可以制作该代码的公开和安全副本(一种不太理想的方法)。

相关问题