如果我想在静态对象中存储变量那是对的吗? 我不希望这个对象与另一个请求共享它的值。
public static object Objects
{
get
{
if (HttpContext.Current.Items["Objects"] != null)
return (object)HttpContext.Current.Items["Objects"];
else
{
HttpContext.Current.Items["Objects"] = new object();
return new object();
}
}
set { HttpContext.Current.Items["Objects"] = value; }
}
THX
答案 0 :(得分:3)
静态字段在整个AppDomain中共享。这意味着ASP.NET Web应用程序中的所有请求将使用相同的值,您必须确保该变量是线程安全的。如果这不是您想要的,请考虑以下事项:
HttpContext.Current.Session
HttpContext.Current.Items
。这样,该值将在整个当前请求中缓存,但不会在请求之间共享。但是,在您的情况下,您使用的是static
属性。这个静态属性在你的情况下映射到HttpContext.Current.Items
,这意味着每个请求自动获得自己的变量,并且不共享变量。
换句话说,您的代码是线程安全的。
答案 1 :(得分:1)
我不希望这个对象与另一个对象分享它的价值 请求。
你不应该把它变成静态的。
答案 2 :(得分:1)
如果要使用静态变量而不在所有请求中共享它,可以将会话变量存储在静态属性中。使用HttpContext.Session
进行访问。
public static object Objects
{
get
{
if (HttpContext.Current.Session["Objects"] != null)
return (object)HttpContext.Current.Session["Objects"];
else
{
var obj = new object();
HttpContext.Current.Session["Objects"] = obj;
return obj;
}
}
set { HttpContext.Current.Session["Objects"] = value; }
}
但是,您不应该返回object
,但正确的类型会增加可读性,可以防止异常并避免在您使用它时将其强制转换。
答案 3 :(得分:0)
有4个主服务器Dictionary对象在请求之间存储值。 应用程序 - 在所有请求和用户之间共享值。 缓存 - 在所有请求和用户之间共享值,但无需重新启动应用程序即可使其无效。 会话 - 在同一会话中的请求之间共享值,所有页面共享相同的会话对象,并且是特定于用户的。 ViewState - 在请求之间共享值,但是特定于页面和用户特定。
答案 4 :(得分:-2)
如果您希望在单个请求中获得静态优势。也就是说,只有一个请求可以访问相同的值。改为使用会话变量。
Session['variable'] = value
这会将值存储在当前会话中,这样每个请求就会有不同的值。