如何从ASP.NET中的任何类访问会话variables?

我在我的应用程序的App_Code文件夹中创build了一个类文件。 我有一个会话variables

Session["loginId"] 

我想在我的类中访问这个会话variables,但是当我写下面的行时,它会给出错误

 Session["loginId"] 

谁能告诉我如何访问ASP.NET 2.0(C#)中的app_code文件夹中创build的类中的会话variables

(为了完整而更新)
您可以使用System.Web.HttpContext.Current.Session["loginId"].从任何页面或控件使用Session["loginId"]和任何类(例如从类库中)访问会话variablesSystem.Web.HttpContext.Current.Session["loginId"].

但请阅读我的原始答案…


我总是在ASP.NET会话周围使用一个包装类来简化对会话variables的访问:

 public class MySession { // private constructor private MySession() { Property1 = "default value"; } // Gets the current session. public static MySession Current { get { MySession session = (MySession)HttpContext.Current.Session["__MySession__"]; if (session == null) { session = new MySession(); HttpContext.Current.Session["__MySession__"] = session; } return session; } } // **** add your session properties here, eg like this: public string Property1 { get; set; } public DateTime MyDate { get; set; } public int LoginId { get; set; } } 

这个类将自己的一个实例存储在ASP.NET会话中,并允许您从类中以types安全的方式访问会话属性,例如:

 int loginId = MySession.Current.LoginId; string property1 = MySession.Current.Property1; MySession.Current.Property1 = newValue; DateTime myDate = MySession.Current.MyDate; MySession.Current.MyDate = DateTime.Now; 

这种方法有几个优点:

  • 它可以节省你很多types的铸造
  • 您不必在整个应用程序中使用硬编码的会话密钥(例如Session [“loginId”]
  • 您可以通过在MySession的属性上添加XML文档注释来logging会话项目
  • 你可以使用默认值初始化你的会话variables(例如,确保它们不为空)

通过线程访问会话HttpContext: –

 HttpContext.Current.Session["loginId"] 

build议的解决scheme的问题是,如果您使用的是进程外会话存储,它可能会破坏SessionState中内置的一些性能function。 (“状态服务器模式”或“SQL Server模式”)。 在oop模式下,会话数据需要在页面请求的末尾被序列化,并在页面请求的开始处被反序列化,这可能是昂贵的。 为了提高性能,SessionState只试图反序列化第一次访问variables时所需要的反序列化,而只重新序列化并replace已更改的variables。 如果你有很多会话variables,并把它们全部放到一个类中,那么基本上,会话中的所有内容都将在每个使用会话的页面请求中被反序列化,即使只有一个属性发生了变化,所有事情都需要被重新序列化。 只是要考虑如果你使用很多的会议和一个oop模式。

我之前提出的答案为问题提供了合适的解决scheme,但是,我认为了解为什么会出现这种错误非常重要:

Page的Session属性返回一个相对于该特定请求的HttpSessionStatetypes的实例。 Page.Session实际上等同于调用Page.Context.Session

MSDN解释如何这是可能的:

由于ASP.NET页面包含对System.Web命名空间(包含HttpContext类)的默认引用,因此可以在.aspx页面上引用HttpContext的成员,而不需要对HttpContext进行完全限定的类引用。

但是,当您尝试在App_Code中的某个类中访问此属性时,除非您的类来自Page Class,否则该属性将不可用。

我遇到的这个经常遇到的问题的解决scheme是我从不将页面对象传递给类 。 我宁愿从页面Session中提取所需的对象,并根据具体情况以名称值集合/ Array / List的forms将它们传递给Class。

我有同样的错误,因为我试图操作自定义Session类中的会话variables。

我不得不传递当前上下文(system.web.httpcontext.current)到类中,然后一切正常。