在会话中找不到我刚才放过的东西(但仅在某些时候)

时间:2020-03-06 14:58:17  来源:igfitidea点击:

我们的服务器有时会出现一个奇怪的问题。通常在升级我们的一个或者多个Web应用程序时发生。调试问题使我到此为止...

在处理请求期间:

  • 在ASP.NET应用程序中,我们将一个对象放入会话中
  • 在稍后运行的代码(相同的请求)中,我们查找相同的会话值。它是空的!

因此,会话服务似乎无法正常工作,对吧?该代码每天运行数百次,并且在开发环境或者生产环境中绝不会失败,仅与升级Web服务器上的Web应用程序有关。

奇怪的是:我们也没有真正喜欢解决问题的正确方法。 IIS重置,ASP.NET状态服务器停止/启动,web.config编辑,甚至服务器重新启动都通常正常使用所有bin,需要结合使用来修复它,再加上很多宣誓和提请。而且在大多数情况下,它不是立即修复的,而是在第三个IIS重置后的两到三分钟之内修复的。 (因此,毕竟这可能不是解决问题的方法。)

我在这里疯了。任何想法可能是什么问题?这是微软的错误吗?

更多信息:

  • 我们在.NET 2.0下运行
  • 我们正在使用ASP.NET状态服务
  • 访问会话变量并返回null的代码在ASP.NET应用程序引用的程序集中。它使用HttpContect.Current来获取会话

解决方案

我们可以考虑不使用会话变量吗?

如果在同一会话中需要数据,则可以使用HttpContext.Items,它比使用会话变量轻得多。

回答问题:
首次访问会话时,可能尚未创建该会话。如果不存在,它将引发异常。

检查

If Not IsNothing(Context.Session) Then
    'do something
end if

HttpContext.Items仅在请求的生命周期内可用,而在整个会话期间不可用,因此需要加以考虑。

要回答原始问题,

  • 当我们将项目添加到会话中时,是否可以在下一行中成功检索到它?
  • 它是服务器特定的吗?即一台服务器可以在会话中看到该值,而另一台服务器看不到?
  • 尝试访问该变量的dll,例如,平台上是否存在任何平台目标差异。 .net 1.1与.net 2.0?