2011-08-17 34 views
1

我有一個運行在默認應用程序池中的ASP.net Web應用程序。用戶報告獲取返回的結果是針對不同用戶的。據我所知,兩臺不同機器上的兩個用戶不應該看到對方的結果。跨應用程序實例泄漏?

這裏很大致是

namespace SomeApplication 
{ 
public partial class _Default : System.Web.UI.Page 
{ 
    static ArrayList results = new ArrayList(); 

    protected void Button_Click(object sender, EventArgs e) 
    { 
     // Add data to results 
     // Display in asp:Table element 
    } 
    } 
} 

用戶1和用戶使用上述應用在大致同一時刻都在內部結構的外觀。 User1得到了正常的結果,但是user2得到了他們的結果,而User1的結果出現在asp:表中。

現在我知道結果對象在全局範圍內,但我的理解是這是應用程序對象的每個實例。

回答

2

靜態變量不是用戶特定的,它們在當前正在運行的ASP.NET工作進程中是全局的。這一過程完全有可能爲您的用戶提供服務。這意味着在進程中運行的任何代碼都會看到這個靜態變量。靜態也是危險的,因爲IIS可以在任何時候回收工作進程,這會將值存入變量中。

相反,你可能需要使用ASP.NET中提供的國家/緩存機制,如會話狀態之一:

http://msdn.microsoft.com/en-us/library/ms972429.aspx

1

前面已經指出的亞當,靜態變量不是用戶特定的,但根據AppDomain。因此,在一個應用程序池中運行多個站點的ASP.NET場景中,每個應用程序池進程(每個應用程序池可以有多個基於配置的工作進程)將爲每個Web應用程序提供一個應用程序域。所以你所有的用戶都會共享相同的靜態變量。

不僅沒有內置的靜態變量的線程安全,而且當兩個不同的線程訪問這些變量時,您可以真正看到不一致的數據。

對於您所選擇的示例,您最好使用與每個請求範圍(在ASP.NET場景中)相對應的實例變量,但是全部填充大部分用例(並且您不必擔心線程安全)。對於想要通過反覆回發來維護同一頁面的數據,視圖狀態是最好的選擇。對於壽命更長的數據,您可以在Session State,0 ASP.NET Cache,Application state等之間進行選擇。前兩種是線程安全實現,而應用程序狀態提供了在訪問插槽之前鎖定插槽的方法。

參考這些鏈接,您在ASP.NET有各種可用的狀態管理選項: