服務熱線
153 8323 9821
Session又稱為會話狀態,是Web系統中最常用的狀態,用于維護和當前瀏覽器實例相關的一些信息。舉個例子來說,我們可以把已登錄用戶的用戶名放在Session中,這樣就能通過判斷Session中的某個Key來判斷用戶是否登錄,如果登錄的話用戶名又是多少。
我們知 道,Session對于每一個客戶端(或者說瀏覽器實例)是“人手一份”,用戶首次與Web服務器建 立連接的時候,服務器會給用戶分發一個 SessionID作為標識。SessionID是一個由24個字符組成的隨機字符串。用戶每次提交頁面,瀏覽器都會把這個SessionID包含在 HTTP頭中提交給Web服務器,這樣Web服務器就能區分當前請求頁面的是哪一個客戶端。那么,ASP.NET 2.0提供了哪些存儲SessionID的模式呢:
· Cookie(默認)。如果客戶端禁止了Cookie的使用,Session也將失效。
· URL。Cookie是否開啟不影響Session使用,缺點是不能再使用絕對鏈接了。
前面說了SessionID可以存儲在客戶端的Cookie或者URL中,那么Session真正的內容存儲在哪里呢?ASP.NET 2.0對于Session內容的存儲也提供了多種模式。
· InProc(默認)。Session存儲在IIS進程中(Web服務器內存)。
· StateServer。Session存儲在獨立的Windows服務進程中(可以不是Web服務器)。
· SqlServer。Session存儲在SqlServer數據庫的表中(SqlServer服務器)。
雖然 InProc模式的Session直接存儲在Web服務器IIS進程中,速度比較快,但是每次重新啟動IIS都會導致Session丟失。利用后兩種模 式,我們就完全可以把Session從Web服務器中獨立出來,從而減輕Web服務器的壓力,同時減少Session丟失的概率。
因此,SessionID存儲在客戶端(可以是Cookie或者URL),其他都存儲在服務端(可以是IIS進程、獨立的Windows服務進程或者SQL Server數據庫中)。
讓我們先來實踐一下如何使用Session,進而回答第二個問題:Session存儲的類型限制。Session不需要進行任何配置就可以使用(默認是InProc模式并且依賴Cookie)。首先,在頁面上建立兩個按鈕。
在btn_WriteSession按鈕的Click事件處理方法中,寫入兩個Session,一個是簡單的字符串,另外一個是自定義的類。
protected void btn_WriteSession_Click(object sender, EventArgs e)
{
Session["SimpleString"] = "編程快樂";
MyUser user = new MyUser();
user.sUserName = "小朱";
user.iAage = 24;
Session["CustomClass"] = user;
}
Session的使用非常簡單,直接對某個Key的Session進行賦值即可。自定義類MyUser如下:
class MyUser
{
public string sUserName;
public int iAage;
public override string ToString()
{
return string.Format("姓名:{0},年齡:{1}", sUserName, iAage);
}
}
在這里,我們覆寫了ToString()方法直接返回實例的一些信息。然后,雙擊btn_ReadSession按鈕來實現從Session中讀取數據的代碼:
protected void btn_ReadSession_Click(object sender, EventArgs e)
{
if (Session["SimpleString"]==null)
{
Response.Write("讀取簡單字符串失敗
");
}
else
{
string s=Session["SimpleString"].ToString();
Response.Write(s + "
");
}
if (Session["CustomClass"]==null)
{
Response.Write("讀取簡單自定義類失敗
");
}
else
{
MyUser user=Session["CustomClass"] as MyUser;
Response.Write(user.ToString()+"
");
}
}
在每次讀取 Session的值以前請務必先判斷Session是否為空,否則很有可能出現“未將對象引用設置到對象的實例”的異常。我們看到,從Session 中讀出的數據都是object類型的,我們需要進行類型轉化后才能使用。打開頁面,先單擊寫入Session按鈕,再單擊讀取Session按鈕,頁面輸 出如 圖12-1所示。
由此看來,Session能存儲任意對象,是這樣嗎?現在得出這個結論還太早了一點,因為我們并沒有實踐過StateServer和SqlServer模式的Session。要把Session存儲在Windows服務進程中需要進行以下幾個步驟。
n 第1步是打開狀態服務。依次打開“控制面板”→“管理工具”→“服務”命令,找到ASP.NET狀態服務一項,右鍵單擊服務選擇啟動,如圖12-2所示。
n 如果你正式決定使用狀態服務存儲Session前,別忘記修改服務為自啟動(在操作系統重啟后服務能自己啟動)以免忘記啟動服務而造成網站Session不能使用,如圖12-3所示,雙擊服務把服務的啟動類型設置為自動。
服務正常啟動后可以觀察任務管理器的進程頁,其中的aspnet_state.exe進程就是狀態服務進程,如圖12-4所示。
n 第2步,在system.web節點中加入: