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