2013-04-30 162 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 - 共享請求之間的值,但是頁面特定和用戶特定的。