2013-04-30 129 views
0

在asp.net web应用程序中如果我想将变量存储在一个静态对象中,那对吗? 我不希望这个对象与另一个请求共享它的值。静态变量ASP.NET

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

也许你可以将它存储在会话变量中吗? – pollirrata 2013-04-30 15:36:58

+0

这是一个非常令人困惑的问题。 '对象'不是一个变量,它是一个属性。 HttpContext.Current.Items不是静态的,它是本地的请求。 – 2013-04-30 15:38:15

+0

如果要使用静态变量而不跨所有请求共享,可以将会话变量存储在静态属性中。使用'HttpContext.Session'来访问它。 – 2013-04-30 15:38:24

回答

3

静态字段在整个AppDomain中共享。这意味着ASP.NET Web应用程序中的所有请求将使用相同的值,您必须确保该变量是线程安全的。如果这不是你想要的,考虑以下因素:

  • 在用户会话中存储的值:HttpContext.Current.Session
  • 存储在请求中的值:HttpContext.Current.Items。通过这种方式,该值在当前请求中缓存,但不会在请求间共享。
  • 根本不存储该值。

对你而言,你正在使用static属性。这种静态属性在你的情况下映射到HttpContext.Current.Items,这意味着每个请求会自动获取自己的变量并且不会共享变量。

换句话说,你的代码是线程安全的。

1

我不希望这个对象将与另一 要求分享其价值。

然后你不应该使它成为静态的。

+0

这让我笑了起来。 – Yatrix 2013-04-30 15:38:41

+1

它应该没问题,因为返回的对象存储在'HttpContext'中。 – 2013-04-30 15:39:51

+0

Adil,你没有看代码,使得属性不是静态的并不会产生任何影响,因此你的回答是误导性的。 – Steven 2013-04-30 15:44:29

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但正确的类型,这将增加可读性,防止异常和避免总是铸造它,你使用它。

-2

如果您希望在单个请求中获得静态的好处。也就是说,有一个请求可以访问相同的值。改用会话变量。

Session['variable'] = value 

这会将值存储在当前会话中,这样每个请求的值就会不同。

0

有4个主要服务器字典对象存储请求之间的值。 应用程序 - 共享所有请求和用户之间的值。 缓存 - 共享所有请求和用户之间的值,但无需重新启动应用程序即可失效。 会话 - 共享同一会话内的请求之间的值,所有页面共享相同的会话对象,并且是用户特定的。 ViewState - 共享请求之间的值,但是页面特定和用户特定的。