了解 ASP.NET 会话状态
一、引言
会话被定义为用户与 Web 应用程序交互的唯一时间段。为了保留唯一用户会话数据,Active Server Pages (ASP) 开发人员可以利用会话状态的内置功能。
二、会话状态概述
从编程的角度来看,会话状态类似于一个字典或哈希表,存储键值对,允许在用户会话期间设置和读取数据。例如,用户选择跟踪的股票,Web 应用程序可以将这些值存储在用户的 ASP 会话实例中。
Session("Stocks") = "MSFT; VRSN; GE"
在后续页面上,这些值可以被读取,用户无需重新输入。
// 获取股票数据并分割字符串
string StockString;
StockString = Session["Stocks"].ToString(); // 从会话中读取股票数据
ASP 通过在会话开始时向客户端提供分配的唯一密钥来维护会话状态。此密钥存储在客户端,并在每次请求时发送到服务器的 HTTP cookie 中。服务器可以从 cookie 中读取密钥并重新填充会话状态。
三、ASP 会话状态的问题
尽管 ASP 会话状态功能强大,但也存在局限性:
3.1 进程相关性
会话状态存在于承载 ASP 的进程中,进程被回收或失败时,会话状态将丢失。
3.2 服务器场限制
在 Web 服务器场中,当用户从一个服务器移动到另一个服务器时,会话状态不会随之移动。ASP 会话状态是特定于计算机的。
3.3 依赖 Cookie
不接受 HTTP Cookie 的客户端无法利用会话状态。一些客户端可能禁用 Cookie,导致会话状态不可用。
四、ASP.NET 会话状态的改进
ASP.NET 会话状态解决了传统 ASP 的许多问题。
4.1 进程独立性
ASP.NET 会话状态可以在不同于 ASP.NET 主机进程的进程中运行,进程可以随时启动和退出,而会话状态进程则保持可用。
4.2 支持服务器场配置
通过转向进程外模型,ASP.NET 允许场中的所有服务器共享会话状态。
4.3 独立于 Cookie
ASP.NET 允许选择不使用 Cookie 的客户端站点利用会话状态,简化了无 Cookie 状态管理的配置。
五、使用 ASP.NET 会话状态
ASP.NET 中的会话状态设置通过 ASP.NET XML 配置文件 config.web
进行配置。配置文件有两种类型:机器配置文件和应用程序配置文件,二者名称均为 config.web
。
5.1 会话配置示例
以下是用于配置 ASP.NET 应用程序的会话状态设置的示例 config.web
文件:
<configuration>
<sessionState
mode="InProc"
cookieless="false"
timeout="20"
sqlConnectionString="data source=127.0.0.1;user id=<user id>;password=<password>"
server="127.0.0.1"
port="42424" />
</configuration>
-
模式:支持 InProc
、SqlServer
和StateServer
三种选项。 -
Cookieless:布尔设置,表示是否使用 Cookie。 -
超时:控制会话有效时间。 -
SqlConnectionString:SQL 连接字符串。 -
服务器和端口:指定用于进程外模式的服务器和端口。
六、会话状态应用程序示例
以下是一个简单的 C# 应用程序代码示例,演示如何写入和读取会话状态:
<Script runat="server">
Public void Session_Add(Object sender, EventArgs e)
{
Session("MySession") = text1.Value; // 将文本框值存入会话
span1.InnerHtml = "Session data updated! <p>Your session contains: <font color='red'>" +
Session("MySession").ToString() + "</font>";
}
Public void CheckSession(Object sender, EventArgs e)
{
If (Session("MySession") == null)
{
span1.InnerHtml = "NOTHING, SESSION DATA LOST!";
}
Else
{
span1.InnerHtml = "Your session contains: <font color='red'>" +
Session("MySession").ToString() + "</font>";
}
}
</Script>
<form runat="server" ID="Form1">
<input id="text1" type="text" runat="server" NAME="text1">
<input type="submit" runat="server" OnServerClick="Session_Add" Value="Add to Session State" ID="Submit1" NAME="Submit1">
<input type="submit" runat="server" OnServerClick="CheckSession" Value="View Session State" ID="Submit2" NAME="Submit2">
</form>
<hr size="1">
<font size="6"><span id="span1" runat="server" /></font>
七、会话状态配置模式
7.1 进程内模式
使用与传统 ASP 相似的方式管理会话状态,性能较高,但在进程循环时会丢失状态。
7.2 进程外模式
使用 Windows NT 服务 ASPState
管理会话状态,需要先启动该服务。
net start aspstate
配置示例:
<configuration>
<sessionState
mode="StateServer"
cookieless="false"
timeout="20"
sqlConnectionString="data source=127.0.0.1;user id=<user id>;password=<password>"
server="127.0.0.1"
port="42424" />
</configuration>
7.3 SQL Server 模式
会话状态信息存储在 SQL Server 中,需创建必要的表和存储过程。
7.4 无 Cookie 状态
配置无 Cookie 会话状态,URL 中会嵌入唯一标识会话的 ID。
<configuration>
<sessionState
mode="StateServer"
cookieless="true"
timeout="20"
sqlConnectionString="data source=127.0.0.1;user id=<user id>;password=<password>"
server="127.0.0.1"
port="42424" />
</configuration>
八、性能和可靠性考虑
-
进程内模式:适用于性能要求高的单服务器应用。 -
进程外模式:在多服务器环境中保持状态的可靠性。 -
SQL Server 模式:提供最高的数据可靠性,适用于需要高可用性的应用。