静态类中的HTTP上下文

本文关键字:上下文 HTTP 静态类 | 更新日期: 2023-09-27 17:50:45

据我所知,静态类的静态方法在web应用程序中共享给所有用户
HttpContext.Current.Session["Key"]如何在静态类中工作
因为会话是为每个用户创建的
下面的示例返回会话中的用户名

 using System.Web;
 namespace WebApplication1 
 {
    public static class UserInfo
    {
        public static string showName()
        { 
            return HttpContext.Current.Session["UserName"] ?? "";
        }
     }
  }

我知道这可能有答案,但我没能找到答案。

静态类中的HTTP上下文

它会表现得很好。是的,这个类可能是静态的,但它将访问内存的不同部分,因此不应该出现冲突。

在内部,我认为Session的工作原理与Cache完全相同,只是Session使用唯一的Key(我认为是当前会话Id(来存储和检索字典中的数据。因此,当您存储会话["Foo"]="Bar"时,实际上是在执行会话[Session_id+"Foo"]="Bar">

更新

我的假设几乎得到了证实:

比较状态提供程序默认情况下,ASP.NET应用程序将会话状态存储在工作进程的内存中,特别是缓存对象的专用插槽中。当选择InProc模式时,会话状态将存储在Cache对象内的插槽中。此插槽被标记为专用插槽,无法通过编程访问。换句话说,如果枚举ASP.NET数据缓存中的所有项,则不会返回看起来像给定会话状态的对象。Cache对象提供了两种类型的插槽——专用插槽和公用插槽。程序员可以添加和操作公共插槽;系统,特别是system.web程序集中定义的类,为自己保留专用插槽。每个活动会话的状态占用缓存中的一个专用插槽。插槽以会话ID命名,值是名为SessionStateItem的内部未记录类的实例。InProc状态提供程序获取会话的ID,并在缓存中检索相应的元素。然后,SessionStateItem对象的内容被注入HttpSessionState字典对象,并由应用程序通过Session属性进行访问。请注意,ASP.NET 1.0中的一个错误使Cache对象的私有槽在编程上可枚举。如果在ASP.NET 1.0下运行以下代码,则可以枚举与每个当前活动会话的状态打包的对象相对应的项。

来源:http://msdn.microsoft.com/en-us/library/aa479041.aspx

(对格式表示歉意。从手机上发布(

我认为您混淆了静态属性和静态字段。神奇的是,HttpContext.Current是一个静态属性,它返回的HttpContext实例不是来自普通的静态字段,而是来自(松散地(称为执行上下文的东西,它允许ASP.NET查看您的特定线程当前属于许多并发请求中的哪一个,以便为您返回正确的HttpContext实例。

那个特定的实例有一个Session字典,只供您的用户使用。