background image

stateConnectionString 属性来配置。该属性指定了服务所在的服务器,以及要监视的端
口:
<sessionState mode="StateServer"
    stateConnectionString="tcpip=myserver:42424"
    cookieless="false" timeout="20" />
  
   在这个例子中,状态服务在一台名为 myserver 的机器的 42424 端口(默认端口)运

HKLM\SYSTEM\CurrentControlSet\Services\aspnet_state 注册表项中的 Port 值。

显然,使用状态服务的优点在于进程隔离,并可在 Web farm

 

中共享。 使用这种模式,

会话状态的存储将不依赖于 iis 进程的失败或者重启,然而,一旦状态服务中止,所有会
话数据都会丢失。换言之,状态服务不像 SQL Server 那样能持久存储数据;它只是将数
据存储在内存中。

 4  用 SQL Server 进行会话管理
   ASP.NET 还允许将会话数据存储到一个数据库服务器中,方法是将 mode 属性变成
SqlServer。在这种情况下,ASP.NET 尝试将会话数据存储到由 sqlConnectionString 属
性(其中包含数据源以及登录服务器所需的安全凭证)指定的 SQL Server 中。
为了用恰当的数据库对象来配置 SQL erver,管理员还需要创建 ASPState 数据库,方
法是运行 WinDir\Microsoft.Net\Framework\Version 文件夹中的 InstallState.sql 脚
本(WinDir 是服务
器的 Windows 文件夹,而 Version 是你使用的.NET 框架版本的安装文件夹)。
要配置 SQL 服务器,可以在命令行中运行 SQL Server 提供的命令行工具 osql.exe
osql -S [ server name] -U [user] -P [password] <InstallSqlState.sql
例如:
osql -S (local)\NetSDK -U sa -P "" -i InstallSqlState.sql

  在这里用户名必须是 SQL 服务器上的 sa 帐号,或者具有同等权限的其他帐号。有兴趣
的读者可以打开这个脚本文件来了解 ASP.NET 是如何和 SQL Server 配合实现状态管理
的。卸载这些表和存储过程,可以使用 UninstallSqlState.sql 脚本,使用方法与上面类
似。

做好必要的数据库准备工作后,将 web.config 文件中的 sessionstate 元素的 mode

改为"sqlserver",并且指定 SQL 连接字符串。具体如下:

 mode="sqlserver"
 sqlConnectionString="data source=127.0.0.1; userid=sa; password="

配置好 SQL Server 后,应用程序代码运行时就和 InProc 模式没有什么区别。但要注意
的是,由于数据不存储在本地内存,所以存储会话状态的对象需要进行序列化和反序列
化,以便通过网络传给数据库服务器,以及从数据库服务器传回。这当然会影响性能。通
过在数据库中存储会话状态,可分别针对扩展性及可靠性来有效地平衡性能。另外,可以
利用 SQL Server 的集群,使状态存储不依赖于单个的 SQL Server,
这样就可以为应用程序提供极大限度的可靠性。