据我所知,静态类的静态方法被共享给Web应用程序中的所有用户。
HttpContext.Current.Session [" Key"]如何在静态类中工作。
由于会话是为每个用户创建的。
下面的示例返回会话中的用户名
using System.Web;
namespace WebApplication1
{
public static class UserInfo
{
public static string showName()
{
return HttpContext.Current.Session["UserName"] ?? "";
}
}
}
我知道这可能已经回答,但我找不到答案。
答案 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
字典。