2011-09-29 121 views
4

我有一个解决方案,其中包括2个项目和2个类文件,通过引用调用。在我的一个项目中,我在Session_Start块中的Global.asax中有一些代码,它从数据库加载一些变量并将它们设置为会话变量。如果我在Global.asax中放置一个断点,我可以验证这些变量实际上是否正确设置。ASP.NET C#会话变量丢失

当我在我的任何代码隐藏模块或项目中的类中引用会话变量时,它们都在那里。但是如果我在引用调用的类之一(本质上是共享类)中引用它们,那么会话变量都是空的。

我使用HttpContext.Current.Session [“varName”]来访问类中的变量,就像标准一样。

有什么我需要考虑有权访问这些会话变量?它可能是一个命名空间问题?

+3

那么,从“关注点分离”的角度来看,好像“其他”项目不应该直接意识到Web环境。你能否将会议中的任何价值传递给“其他项目”? – RQDQ

+0

尝试:System.Web.HttpContext.Current.Session [“varName”]。另外,请注意您尝试读取会话的ASP.NET页面生命周期的哪个阶段 - 例如当您尝试阅读时会话尚未加载吗? –

+0

Moe - 我正在根据用于访问系统的URL来定制登录屏幕上显示的徽标。当我通过时,我在global.asax中设置了一个断点,并首先停止,并设置变量。然后,下一个中断点是当我的登录模块尝试从数据库加载徽标时。它从该'其他'共享类调用一个过程来处理图像加载,并且数据库名称为空。我想我可以尝试从它正在工作的模块获取会话变量,并将它传递给加载图像的类中的方法...我会尝试。 –

回答

3

我以前有同样的问题,我一直在失去我的会话变量(虽然不是在你的相同的上下文中)。我发现这篇文章对我的问题很有帮助:ASP.NET Case Study: Lost session variables and appdomain recyclesPRB: Session Data Is Lost When You Use ASP.NET InProc Session State Mode。希望它也可以帮助你。干杯!

+0

谢谢安妮,但那不是我的问题。我正在使用SQLServer模式。我可以在我的主项目中使用会话。当我尝试访问外部项目中的Session vars(在相同的解决方案中)时,我遇到了问题。 –

3

你是否在代码中的任何地方调用Session.Abandon()?在我的Web应用程序开始时,我正在这样做,以确保我以“新鲜”会话开始。事实证明,即使之后之间存储的任何会话变量都将被丢弃(即使SessionID被迫通过其他方式保持相同,例如使用Server.Transfer(Url,true)而不是Response.Redirect) ,在回发。

即我可以追踪到我的应用程序,观察所有会话变量被正确设置,然后任何事件处理程序(任何与AutoPostBack =“True”,如UpdatePanel上的复选框或按钮)被称为BAM ,我有相同的SessionID,但零会话变量。

删除对Session.Abandon()的抢先呼叫直接解决了我的问题。

Jeff