静态类中的HTTP上下文

时间:2013-01-06 04:06:52

标签: c# asp.net httpcontext

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

 using System.Web;

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

我知道这可能已经回答,但我找不到答案。

2 个答案:

答案 0 :(得分:2)

表现得很好。是的,该类可能是静态的,但它将访问不同的内存部分,并且不会产生任何冲突。

在内部,我相信,Session的工作原理与Cache完全相同,只是Session使用一个唯一的Key(我相信是当前的会话Id)来存储和检索字典中的数据。所以当你存储Session [“Foo”] =“Bar”真的在做Session [session_id +“Foo”] =“Bar”

更新

我的假设是准确的:

比较州提供商 默认情况下,ASP.NET应用程序将会话状态存储在工作进程的内存中,特别是在Cache对象的专用槽中。选择InProc模式时,会话状态存储在Cache对象的槽中。此插槽标记为私有,无法以编程方式访问。换句话说,如果枚举ASP.NET数据高速缓存中的所有项,则不会返回看起来像给定会话状态的对象。 Cache对象提供两种类型的slot-private和public。程序员可以添加和操作公共插槽;系统,特别是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

(格式道歉。从手机发布)

答案 1 :(得分:1)

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

该特定实例仅为您的用户提供了Session字典。

相关问题