2013-01-06 100 views
0

據我所知,靜態類的靜態方法是在Web應用程序中共享給所有用戶的。
HttpContext.Current.Session [「Key」]如何在靜態類中工作。
由於會話是爲每個用戶創建的。
下面的例子在會議靜態類中的HTTP上下文

using System.Web; 

namespace WebApplication1 
{ 
    public static class UserInfo 
    { 
     public static string showName() 
     { 
      return HttpContext.Current.Session["UserName"] ?? ""; 
     } 
    } 
    } 

我知道這可能已經回答了,但我沒能找到答案返回用戶名。

回答

2

它會表現得很好。是的,這個類可能是靜態的,但它會訪問不同的內存段,並且不會產生衝突。

在內部,我相信,除了會話使用唯一密鑰(我相信是當前會話ID)來存儲和檢索字典中的數據這一事實之外,Session與Cache完全相同。所以,當你存儲會話[「富」] =「酒吧」真的做得會話[SESSION_ID +「富」] =「酒吧」

更新

我的假設是準證實:

比較國供應商 默認情況下,ASP.NET應用程序將會話狀態存儲在工作進程的內存中,特別是存儲在緩存對象的專用插槽中。當選擇InProc模式時,會話狀態存儲在Cache對象內的一個插槽中。該插槽被標記爲私有,並且不以編程方式訪問。換句話說,如果枚舉ASP.NET數據緩存中的所有項目,則不會返回與給定會話狀態相似的對象。 Cache對象提供兩種類型的插槽 - private和public。程序員可以添加和操作公共槽位;該系統,特別是在system.web程序集中定義的類,爲自己保留專用插槽。 每個活動會話的狀態佔用緩存中的專用槽位。該插槽以會話ID命名,該值是名爲SessionStateItem的內部未記錄類的實例。 InProc狀態提供程序獲取會話的ID並檢索緩存中的相應元素。然後將SessionStateItem對象的內容倒入HttpSessionState字典對象中,並通過Session屬性由應用程序訪問。請注意,ASP.NET 1.0中的一個錯誤以編程方式使Cache對象的專用插槽可枚舉。如果您在ASP.NET 1.0下運行以下代碼,則可以枚舉對應於包含當前活動會話狀態的對象的項目。

來源:http://msdn.microsoft.com/en-us/library/aa479041.aspx

(道歉格式從手機發布)

+0

@lcarus感謝您的回答和解釋。我會說很好的解釋! –

1

我想你混淆靜態屬性與靜態字段。神奇的是,HttpContext.Current是一個靜態屬性,它返回的實例不是來自正常的靜態字段,而是來自(鬆散地)稱爲執行上下文的東西,它允許ASP.NET查看您的特定線程當前屬於哪個併發請求以便爲您返回正確的HttpContext實例。

該特定實例有一個Session字典僅供您的用戶使用。

+0

@andreew阿諾特感謝你的迴應。但你能用一個例子來解釋嗎? –

相關問題