0

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

 using System.Web;

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

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

4

2 回答 2

2

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

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

更新

我的假设是准证实的:

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

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

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

于 2013-01-06T04:26:41.153 回答
1

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

该特定实例有一Session本专为您的用户准备的字典。

于 2013-01-06T04:43:55.880 回答