在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不应该存储任何依赖于外部链接性或关键资源的内容。