2009-09-04 35 views
3

我目前正在ASP.NET網站上工作。在我的一個頁面中,我有一個用於當前登錄用戶的CompanyId的靜態字段。asp.net web站點中的靜態字段問題

private static Guid _CompanyId = Company.Get().CompanyId; 

Company.Get()返回有關公司的信息,當前登錄的用戶,其中用戶標識是利用檢索到:

System.Web.Security.Membership.GetUser(); 

但作爲其他用戶登錄時,在antoher公司,Company.Get()。CompanyId將從第一家公司返回Guid。

我錯過了使用靜態字段的要點,還是這有其他原因? 我修復了這個問題,在我的代碼中替換了所有對_CompanyId的引用,用Company.Get()。CompanyId來快速修復,但這不是一個很好的解決方案。

回答

5

靜態變量值在應用程序級別存在,因此貫穿用戶明智。你應該使用會話來存儲你的信息。靜態變量值不會改變,直到您重新分配值,應用程序重新啓動等。

3

您應該使用HttpContext.Current來存儲會話級別的變量。靜態變量對Web應用程序中的所有會話均可見。

+0

使用HttpContext.Current.Session來存儲每個用戶,每個會話變量..同意,靜態變量對當前所有用戶可見服務器。 在webfarm環境中,將變量存儲在HttpContext.Current.Items集合中將不允許該數據與用戶一起傳播到服務器場中的另一臺服務器。 –

+0

靜態變量不會與用戶一起旅行,但可以使用進程外會話存儲在網站羣中的服務器之間共享會話。 Microsoft Velocity(http://msdn.microsoft.com/en-us/data/cc655792.aspx)正在成爲一個出色的分佈式緩存解決方案。 –

+0

但是這個解決方案安全嗎?我需要加密內容嗎?公司編號絕對不能改變 – sshow

1

從您的字段定義中刪除static應該會爲您提供所需的內容。

+0

謝謝,但我正在尋找解釋爲什麼它不起作用。 – sshow

+0

我不這麼認爲,使得該字段即時(非靜態)不能解決問題,因爲即使在會話級別它也不會被保留 –