【问题标题】:IIS ASP.net Session leaks / loses values 5% of the timeIIS ASP.net 会话在 5% 的时间内泄漏/丢失值
【发布时间】:2012-02-02 12:52:22
【问题描述】:

我正在使用带有 .NET Framework 3.5 SP1 的 IIS V6.0 和 ASP.NET。

一天中的大部分时间我都在解决与 ASP.NET 在请求之间丢失会话变量有关的问题。很郁闷。

例如:我有页面 A 和页面 B。当 A 给 B 一个自己的类的对象时,

Session["something"] = myObject; //on Page A 

而页面 B 想这样使用它:

MyOwnClass myObject= Session["something"] as MyOwnClass;

这在大约 95% 的时间里都有效。但是B上另外5%的myObjectnull,在再次刷新页面时可能是我再次放入Session的对象。

这怎么可能?我该怎么办?

它发生在不同的浏览器上。因此,即使是公司的 IE7 也不应该成为问题的一部分。我尝试了各种会话超时长度,但......没有。

【问题讨论】:

  • 你用什么来存储会话? InProc、StateServer 还是 SQL Server?
  • 您使用 InProc 会话管理器吗?如果是,这是您的问题,请将其移至 SQL
  • 我怎样才能知道? @ZachGreen(它不是 SQL)
  • 好的!它的 InProc 调试了我的应用程序以找出答案。
  • @Harry 你可以在 web.config 上看到这个。设置一个 sql server 会话来解决您的问题

标签: c# asp.net .net session iis


【解决方案1】:

可能“有时” myObject 不是MyOwnClass 类型,因为如果发生这种情况,您将使用安全转换,您不会得到异常(安全转换将返回 null 是对象不是“可转换的”。 尝试使用显式转换:

try{
    MyOwnClass myObject=(MyOwnClass)Session["something"];
   }
catch(InvalidCastException ex){
    //handle the exception
    }

如果这不能解决您的问题,您必须确保:

  • 您没有重新启动应用程序池
  • 您不会更改 Web 配置中的任何内容
  • webfarms 和 web gardens:如果您已经为您的网站配置了 web farms 和 web gardens。 Inproc 会话共享可能会导致问题。
  • 由于代码中的某些问题,您网站的 w3p 进程正在重新启动。或内存泄漏。

【讨论】:

    【解决方案2】:

    我的第一个猜测是您正在使用 InProc 会话状态,当应用程序池回收时,您会丢失会话中的内容。

    这是 II6 将 InProc 更改为 StateServer 的指南:http://dotnetguts.blogspot.com/2009/06/steps-for-session-inproc-mode-to.html

    【讨论】:

    • 这听起来很有趣,但随着越来越多的人使用我的网站,感觉越来越糟,您建议我怎么做?
    • 您可以检查 IIS 以查看该站点是否使用 InProc 作为会话处理程序。如果是,你可以切换到状态服务器(确保 asp.net 状态服务器在服务中启动),看看是否能解决问题。
    • 这似乎有 IIS 6 的步骤:dotnetguts.blogspot.com/2009/06/…
    • 使用 InProc 会导致 95% 的时间为空会话怎么办? OP 没有提到任何会导致我认为应用程序池正在被回收的事情。 Massimiliano Peluso 的回答提出了您的解决方案无法解决的原因。
    • 他说空了 5%,而不是 95%。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多