簡體   English   中英

靜態變量ASP.NET

[英]static variable ASP.NET

在asp.net Web應用程序中,如果我想將變量存儲在靜態對象中是嗎? 我不希望該對象與另一個請求共享其值。

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; }
}

謝謝

靜態字段在整個AppDomain中共享。 這意味着ASP.NET Web應用程序中的所有請求都將使用相同的值,並且您必須確保該變量是線程安全的。 如果這不是您想要的,請考慮以下因素:

  • 在用戶會話中存儲值: HttpContext.Current.Session
  • 將值存儲在請求中: HttpContext.Current.Items 這樣,該值將在整個當前請求中緩存,但不會在請求之間共享。
  • 根本不存儲值。

但是,就您而言,您正在使用static屬性。 在您的情況下,此靜態屬性映射到HttpContext.Current.Items ,這意味着每個請求都會自動獲取其自己的變量,並且變量不會共享。

換句話說,您的代碼是線程安全的。

我不希望該對象與另一個請求共享其值。

那你不應該把它設為靜態。

如果要使用靜態變量而不在所有請求之間共享它,則可以將會話變量存儲在靜態屬性中。 使用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而應返回正確的類型,這將增加可讀性,防止異常並避免始終將其強制轉換為使用對象的位置。

有4個主服務器Dictionary對象,用於存儲請求之間的值。 應用程序-在所有請求和用戶之間共享值。 緩存-在所有請求和用戶之間共享值,但是可以在不重新啟動應用程序的情況下使其無效。 會話-在同一會話內的請求之間共享值,所有頁面共享同一會話對象,並且是用戶特定的。 ViewState-在請求之間共享值,但特定於頁面和特定於用戶。

如果您希望通過單個請求獲得靜態收益。 也就是說,只有一個請求可以訪問相同的值。 請改用會話變量。

Session['variable'] = value

這會將值存儲在當前會話中,這樣您的每個請求的值將有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM