ASP.NET状态管理——Session篇
在Web开发的早期,Web页面彼此是相互独立的。它们很少需要了解其他页面的内容(如果需要了解,一般通过查询字符串或通过Form的方式传递)。随着Internet的发展,Web页面也变得更加复杂,仅仅浏览一个页面查看它的内容是远远不够的。现在的Web站点的设计都希望考虑工作流的问题——即需要从一个页面移动到另一页面。
因此会话状态(Session State)就应运而生。会话状态变量允许Web页面保存和用户浏览器的具体一次“会话”的相关的信息。在同一次会话中接下来的页面可以按需要引用这些会话变量。该信息被绑定到用户浏览器会话。一旦浏览器会话关闭,该信息就被删除。该信息存储在Web服务器上,在客户端浏览器的所有调用中都是一种保存的。
当回送发生时,ASP.NET能够使用它在用户第一次连接时创建的唯一的SessionID(SessionID是在服务器上对客户端浏览器唯一的标识,每个客户端浏览器有一个对应的SessionID)来检索会话信息(如果浏览器支持Cookie,并且ASP.NET Web页面配置为使用Cookie);或者通过被ASP.NET追加到URL中的一个加密的字符串来检索会话信息(对于浏览器不支持Cookie或者ASP.NET Web 页面配置为不使用Cookie的情况)。
Session在web.config的配置:
<sessionState mode="[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.默认存储和模式为InProc。
InProc 模式,此模式将会话状态存储在 Web 服务器上的内存中,将会话状态值和变量存储在本地 Web 服务器上的内存中。
StateServer模式,将会话状态存储在一个名为 ASP.NET状态服务的单独进程中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。使用该模式需设定ASP.NET状态服务为启动。ASP.NET状态服务进程是独立于 ASP.NET 辅助进程或 IIS 应用程序池的单独进程。使用此模式可以确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于网络场中的多个 Web 服务器。若设置StateServer模式,需设置stateConnectionString属性。如:
<configuration> <system.web> <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20"/> </system.web> </configuration>
SQLServer模式将会话状态存储到一个 SQL Server 数据库中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。若要使用 SQLServer 模式,必须首先确保在 SQL Server 上安装了 ASP.NET 会话状态数据库。
<configuration> <system.web> <sessionState mode="SQLServer" sqlConnectionString="Integrated Security=SSPI;data source=ASPNETServer;" /> </system.web> </configuration>
Custom 模式,此模式允许您指定自定义存储提供程序。
Off 模式,此模式禁用会话状态。
在ASP.NET中,Session是一个带有方法和属性的.NET对象,可以在一个.NET会话状态对象中存储任何数据类型(包括用户定于的类和结构)。但是,存储数据也是以性能为代价,代价的大小取决于保存会话信息的多少,还是数据的类型信息。
简单示例
创建两个页面:一个页面(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不应该存储任何依赖于外部链接性或关键资源的内容。