在Web開發(fā)的早期,Web頁面彼此是相互獨立的。它們很少需要了解其他頁面的內(nèi)容(如果需要了解,一般通過查詢字符串或通過Form的方式傳遞)。隨著Internet的發(fā)展,Web頁面也變得更加復(fù)雜,僅僅瀏覽一個頁面查看它的內(nèi)容是遠遠不夠的?,F(xiàn)在的Web站點的設(shè)計都希望考慮工作流的問題——即需要從一個頁面移動到另一頁面。
因此會話狀態(tài)(Session State)就應(yīng)運而生。會話狀態(tài)變量允許Web頁面保存和用戶瀏覽器的具體一次“會話”的相關(guān)的信息。在同一次會話中接下來的頁面可以按需要引用這些會話變量。該信息被綁定到用戶瀏覽器會話。一旦瀏覽器會話關(guān)閉,該信息就被刪除。該信息存儲在Web服務(wù)器上,在客戶端瀏覽器的所有調(diào)用中都是一種保存的。
當(dāng)回送發(fā)生時,ASP.NET能夠使用它在用戶第一次連接時創(chuàng)建的唯一的SessionID(SessionID是在服務(wù)器上對客戶端瀏覽器唯一的標(biāo)識,每個客戶端瀏覽器有一個對應(yīng)的SessionID)來檢索會話信息(如果瀏覽器支持Cookie,并且ASP.NET Web頁面配置為使用Cookie);或者通過被ASP.NET追加到URL中的一個加密的字符串來檢索會話信息(對于瀏覽器不支持Cookie或者ASP.NET Web 頁面配置為不使用Cookie的情況)。
Session在web.config的配置:
<sessionStatemode="[Off|InProc|StateServer|SQLServer|Custom]"timeout="number of minutes"cookieName="session identifier cookie name"cookieless="[true|false|AutoDetect|UseCookies|UseUri|UseDeviceProfile]"regenerateExpiredSessionId="[True|False]"sqlConnectionString="sql connection string"sqlCommandTimeout="number of seconds"allowCustomSqlDatabase="[True|False]"useHostingIdentity="[True|False]"stateConnectionString="tcpip=server:port"stateNetworkTimeout="number of seconds"customProvider="custom provider name"><providers>...</providers></sessionState>
Session的存儲模式:InProc,StateServer,SQL Server,Custom,Off.默認(rèn)存儲和模式為InProc。
InProc 模式,此模式將會話狀態(tài)存儲在 Web 服務(wù)器上的內(nèi)存中,將會話狀態(tài)值和變量存儲在本地 Web 服務(wù)器上的內(nèi)存中。
StateServer模式,將會話狀態(tài)存儲在一個名為 ASP.NET狀態(tài)服務(wù)的單獨進程中。這確保了在重新啟動 Web 應(yīng)用程序時會保留會話狀態(tài),并讓會話狀態(tài)可用于網(wǎng)絡(luò)場中的多個 Web 服務(wù)器。使用該模式需設(shè)定ASP.NET狀態(tài)服務(wù)為啟動。ASP.NET狀態(tài)服務(wù)進程是獨立于 ASP.NET 輔助進程或 IIS 應(yīng)用程序池的單獨進程。使用此模式可以確保在重新啟動 Web 應(yīng)用程序時保留會話狀態(tài),并使會話狀態(tài)可用于網(wǎng)絡(luò)場中的多個 Web 服務(wù)器。若設(shè)置StateServer模式,需設(shè)置stateConnectionString屬性。如:
<configuration><system.web><sessionState mode="StateServer"stateConnectionString="tcpip=127.0.0.1:42424"cookieless="false"timeout="20"/></system.web></configuration>
SQLServer模式將會話狀態(tài)存儲到一個 SQL Server 數(shù)據(jù)庫中。這確保了在重新啟動 Web 應(yīng)用程序時會保留會話狀態(tài),并讓會話狀態(tài)可用于網(wǎng)絡(luò)場中的多個 Web 服務(wù)器。若要使用 SQLServer 模式,必須首先確保在 SQL Server 上安裝了 ASP.NET 會話狀態(tài)數(shù)據(jù)庫。
<configuration><system.web><sessionState mode="SQLServer"sqlConnectionString="Integrated Security=SSPI;datasource=ASPNETServer;" /></system.web></configuration>
Custom 模式,此模式允許您指定自定義存儲提供程序。
Off 模式,此模式禁用會話狀態(tài)。
在ASP.NET中,Session是一個帶有方法和屬性的.NET對象,可以在一個.NET會話狀態(tài)對象中存儲任何數(shù)據(jù)類型(包括用戶定于的類和結(jié)構(gòu))。但是,存儲數(shù)據(jù)也是以性能為代價,代價的大小取決于保存會話信息的多少,還是數(shù)據(jù)的類型信息。
創(chuàng)建兩個頁面:一個頁面(SessionAdd.aspx)來添加Session的Key和Value,另一個(SessionResult.aspx)來顯示Session的信息。
SessionAdd的代碼:
<div>Session Variable:<asp:TextBox ID="txtSessionVariable" runat="server" /><br/>Value: <asp:TextBox ID="txtSessionValue" runat="server" /><br /><asp:Button ID="btnAdd" runat="server" Text="Add Session"onclick="btnAdd_Click" /><asp:Button ID="banView" runat="server" Text="View Session"onclick="banView_Click" /></div>
后臺代碼:
protected void btnAdd_Click(object sender, EventArgs e){Session[txtSessionVariable.Text] = txtSessionValue.Text;}protected void banView_Click(object sender, EventArgs e){Server.Transfer("SessionResult.aspx");}
頁面效果:
SessionResult.aspz頁面:
<div><asp:TextBox ID="txtSessionResult" runat="server" TextMode="MultiLine" Width="240px" Height="200px" /><br /><asp:Button ID="btnBack" runat="server" Text="Clear and Back"onclick="btnBack_Click" /></div>
后臺代碼:
protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){StringBuilder sb = new StringBuilder();foreach (String strKey in Session.Keys){sb.Append(strKey);sb.Append("=");sb.Append(Session[strKey]);sb.Append("\n");}txtSessionResult.Text = sb.ToString();}}protected void btnBack_Click(object sender, EventArgs e){Session.Clear();Server.Transfer("SessionAdd.aspx");}
頁面效果:
以上的列子簡單說明Session的添加,查看,清空。
基于性能的考慮,Session不應(yīng)該存儲任何依賴于外部鏈接性或關(guān)鍵資源的內(nèi)容。