我有一个解决方案,其中包括2个项目和2个通过引用调用的类文件。在我的一个项目中,我在Session_Start块中的Global.asax中有一些代码,它从数据库加载一些变量并将它们设置为会话变量。如果我在Global.asax中设置一个断点,我可以验证变量实际上是否正确设置。
当我在任何代码隐藏模块或项目中的类中引用类中的会话变量时,它们就在那里。但是如果我在其中一个通过引用调用的类(实质上是共享类)中引用它们,则Session变量都为null。
我正在使用HttpContext.Current.Session [“varName”]来访问类中的变量,这是标准的。
我是否还需要考虑其他方法才能访问这些会话变量?它可能是命名空间问题吗?
答案 0 :(得分:5)
之前我遇到过同样的问题,我一直在丢失我的会话变量(尽管与你的会话变量不在同一个环境中)。我发现这些文章对我的问题很有帮助:ASP.NET Case Study: Lost session variables and appdomain recycles和PRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode。希望它也可以帮到你。干杯!
答案 1 :(得分:3)
您是否在代码中的任何位置调用Session.Abandon()?我在我的Web应用程序开始时这样做,以确保我从一个“新鲜”的会话开始。事实证明,任何存储在“放弃”之后的会话变量都将被删除(即使SessionID被强制通过其他方式保持相同,例如使用Server.Transfer(Url,true)而不是比起Response.Redirect),在回发时。
即。我可以追踪到我的应用程序,观察所有会话变量是否正确设置,然后当任何事件处理程序(任何具有AutoPostBack =“True”的东西,如UpdatePanel上的复选框或按钮)被调用,BAM,我有同样的SessionID,但零会话变量。
删除对Session.Abandon()的先发制人调用直接解决了我的问题。
杰夫
答案 2 :(得分:0)
在Maximum Worker Process
高级设置中检查AppPool
属性设置为1
窗口。
如果您无意中将其设置为大于1,则应用程序池将为Web Garden
,因此即使它们中仍然存在Session
或Application
变量,您也找不到它们。