ASP.NET 会话状态为会话数据提供了几个不同的存储选项。每个选项都通过一个 SessionStateMode
枚举值进行识别。如下列表中描述了可用的会话状态模式:
InProc
模式:把会话状态存储到 Web 服务器的内存中。这是默认值。 StateServer
模式:把会话状态存储到一个名为 ASP.NET 状态服务的单独进程中。如果 Web 应用程序被重启并同样为 Web 农场产生了被多个 Web 服务器可用的会话状态,那么就能够确保会话状态会被保持。 SQLServer
模式:把会话状态存储到一个 SQL Server 数据库中。如果 Web 应用程序被重启并同样为 Web 农场产生了被多个 Web 服务器可用的会话状态,那么就能够确保会话状态会被保持。 Custom
模式:允许你指定一个自定义的存储提供者。 Off
模式:禁用会话状态。 你可以通过在应用程序 Web.config 文件中为 sessionState
元素的 mode
参数指派一个 SessionStateMode
枚举值的方式来指定你所需要使用的 ASP.NET 会话状态模式。除了 InProc
和 Off
之外的模式都需要使用额外的参数(如将在本文稍后部分讨论的数据库连接字符串)。你可以通过访问 System.Web.SessionState.HttpSessionState.Mode
属性的方式来访问当前所使用的会话状态。
InProc
模式是使用 SessionStateMode
枚举的 InProc
值所指定的默认的会话状态模式。InProc
模式在本地 Web 服务器的内存中存储会话状态的值和变量。同时它也是唯一能够支持 Session_OnEnd
事件的模式。更多关于 Session_OnEnd
事件的信息,请参考:[会话状态的事件]。
小心:如果你通过在应用程序的 Web.config 文件中把 processModel
元素的 webGarden
参数值设置成 true
的方式来启用 Web 花园模式,注意这时候将不能使用 InProc
会话状态模式,如果你坚持这样,那么在不同的工作者而提供的相同会话的不同请求中将会出现数据丢失的现象。
StateServer
模式在进程中存储会话状态,被称之为 ASP.NET 状态服务,并独立于 ASP.NET 工作者进程或 IIS 应用程序池。如果 Web 应用程序被重启并同时为 Web 农场产生了被多个 Web 服务器可用的会话状态,那么通过使用这个模式就能够确保会话状态会被保持。
要使用 StateServer
模式,你必须先确认 ASP.NET 状态服务已经在已使用会话存储的服务器中被运行。在安装了 ASP.NET 和 .NET Framework 的时候,ASP.NET 状态服务会被安装成一个系统服务。ASP.NET 状态服务被安装在系统中的如下位置:
要配置 ASP.NET 应用程序来使用 StateServer
模式,就需要在应用程序的 Web.config 文件中完成如下操作:
sessionState
元素的 mode
参数值设置为 StateServer
。 stateConnectionString
参数值设置为 Tcpip=服务器名称:42424
。 提示:要在使用 StateServer
模式的时候改进应用程序的安全性,建议你通过加密配置文件中的 sessionState
配置段的方式来保存 stateConnectionString
的值。关于详细内容,请参考:[使用已保护的配置来加密配置信息]。
如下实例说明了一个为被存储在名为 SampleStateServer 的远程计算机中的会话状态而使用 StateServer
模式的配置设定。
<configuration> <system.web> <sessionState mode="StateServer" stateConnectionString="tcpip=SampleStateServer:42424" cookieless="false" timeout="20"/> </system.web> </configuration>
提示:如果 mode
被设置成 StateServer
,那么被存储在会话状态中的对象必须能够被序列化。关于序列化对象的信息,请参考:[SerializableAttribute
类]。
要在 Web 农场中使用 StateServer
模式,你必须拥有一个与为 Web 农场中所有应用程序而在 Web 配置的 machineKey
元素中被指定的相同的加密关键字。关于如何创建机器关键字的信息,请参考 http://support.microsoft.com 中的 Microsoft Knowledge Base 文章:[如何使用 Visual Basic .NET 来为窗体验证创建关键字]。
SQLServer
模式在一个 SQL Server 数据库中存储会话状态。如果 Web 应用程序被重启并同时为 Web 农场产生了被多个 Web 服务器可用的会话状态,那么通过使用这个模式就能够确保会话状态会被保持。
提示:如果 mode
被设置成 SQLServer
,那么被存储在会话状态中的对象必须能够被序列化。关于序列化对象的信息,请参考:[SerializableAttribute
类]。
要使用 SQLServer
模式,你必须先确认 ASP.NET 状态数据库已经被安装在 SQL Server 中。你可以使用 Aspnet_regsql.exe 工具来安装 ASP.NET 会话状态数据库,与本文中稍后部分所描述的一样。
要配置 ASP.NET 应用程序来使用 SQLServer
模式,就需要在应用程序的 Web.config 文件中完成如下操作:
sessionState
元素的 mode
参数值设置为 SQLServer
。 sqlConnectionString
参数值设置为 SQL Server 数据库的连接字符串。 提示:要在使用 SQLServer
模式的时候改进应用程序的安全性,建议你通过加密配置文件中的 sessionState
配置段的方式来保存 sqlConnectionString
的值。关于详细内容,请参考:[使用已保护的配置来加密配置信息]。
如下实例说明了一个为被存储在名为 SampleStateServer 的远程计算机中的会话状态而使用 SQLServer
模式的配置设定。
<configuration> <system.web> <sessionState mode="SQLServer" sqlConnectionString="Integrated Security=SSPI;data source=SampleSqlServer;" /> </system.web> </configuration>
提示:如果你在配置文件中使用 sessionState
元素的 sqlConnectionString
参数来为你的 SQL Server 指定一个被信任的连接串,那么 SessionStateModule
将会使用被集成的安全性来连接到你所指定的 SQL Server,并使用现有的 ASP.NET 进程标识或在 identity
配置元素中被提供的用户凭证来产生连接。作为选择,你还可以通过指定 <identity impersonate="true" />
并把 sessionState
配置元素的 useHostingIdentity
参数值设置为 false
的方式来指定 IIS 所扮演的角色。更多关于 ASP.NET 进程标识的信息,请参考:[配置 ASP.NET 进程标识和 ASP.NET 角色扮演]。
要配置 Web 农场的 SQLServer
模式,就需要在每个 Web 服务器的配置文件中设置 sessionState
元素的 sqlConnectionString
参数值来指向相同的 SQL Server 数据库。IIS 元数据中的 ASP.NET 应用程序路径必须与所有在 SQL Server 数据库中共享会话状态的 Web 服务器相同。关于在服务器之间出现不同的应用程序路径时的解决步骤,请参考 http://support.microsoft.com 中的 Microsoft Knowledge Base 文章:[PRB:使用 SqlServer
或 StateServer
会话模式所导致 Web 农场的会话状态的丢失]。
要在 SQL Server 中安装会话状态数据库,就需要运行位于 Web 服务器的 Systemroot\Microsoft.NET\Framework\版本号 目录中的 Aspnet_regsql.exe 工具。该工具支持如下命令行信息:
默认时,你不能使用 Aspnet_regsql.exe 工具在 SQL Server Express Edition 中安装会话状态数据库。要运行 Aspnet_regsql.exe 工具来安装一个 SQL Server Express Edition 的数据库,你必须先使用如下所示的 T-SQL 命令来启用 Agent XPs 选项:
EXECUTE sp_configure 'show advanced options', 1 RECONFIGURE WITH OVERRIDE GO EXECUTE sp_configure 'Agent XPs', 1 RECONFIGURE WITH OVERRIDE GO EXECUTE sp_configure 'show advanced options', 0 RECONFIGURE WITH OVERRIDE GO
如果有必要,你必须在任何禁用了 Agent Xps 选项的 SQL Server Express Edition 实例中运行这些 T-SQL 命令。
默认时,Aspnet_regsql.exe 工具将创建一个名为 ASPState 并包含对 SQLServer
模式提供支持的存储过程的数据库。会话数据本身在默认的时候是被存储在 tempdb 数据库中的。你可以使用 -sstype 选项来改变会话数据的存储位置。下表说明了 -sstype 选项中的可用值:
选项 | 描述 |
---|---|
t | 默认值,把会话数据存储到 SQL Server 的 tempdb 数据库中。存储在 tempdb 数据库中的会话数据会在 SQL Server 被重启的时候被丢失。 |
p | 把会话数据存储到用来替代 tempdb 数据库的 ASPState 数据库中。 |
c | 把会话数据存储到一个自定义的数据库中。如果你指定了 c 选项,那么你还必须使用 -d 选项来包括自定义数据库的名称。 |
例如,如下命令在一个名为 SampleSqlServer 的 SQL Server 实例中创建了一个名为 ASPState 的数据库并指定会话状态也同样需要被存储在 ASPState 数据库中:
提示:如果你运行了 ASP.NET 1.0 或 ASP.NET 1.1,那么 Aspnet_regsql.exe 工具就不能提供选项来把会话数据存储到 ASPState 数据库中。但是,你还是能够使用脚本来把会话数据存储到一个持续保持的数据库中。关于详细内容,请参考 http://support.microsoft.com 中的 Microsoft Knowledge Base 文章:[ASP.NET 实践:持续保持的 SQL Server 会话状态管理时的 ASP.NET 配置]。
使用 SQLServer
模式,你能够把几台同时运行 SQL Server 的计算机配置成为故障转移群集,即两台或更多完全相同的并且都为同一个数据库而存储数据的 SQL Server 的计算机。如果其中有一台运行 SQL Server 的计算机出现故障,那么群集中的另外一台服务器就可以在不丢失会话数据的情况下进行接管并继续为请求提供服务。要配置一个故障转移群集的 SQL Server 模式,你必须在执行 Aspnet_regsql.exe 工具把存储会话状态数据的 tempdb 数据库替换成 ASPState 数据库的时候使用 -sstype p 选项。SQL Server 群集不支持在 tempdb 数据库中存储会话状态。更多关于为故障转移群集配置 SQL Server 模式的信息,请参考 http://support.microsoft.com 中的 Microsoft Knowledge Base 文章:[如何在故障转移群集中使用 ASP.NET 会话状态的 SQL Server 模式]。
Custom
模式指定了你需要用来存储会话状态数据的一个自定义会话状态存储提供者。在你使用 Custom
模式来配置 ASP.NET 应用程序的时候,你必须使用 sessionState
配置元素的 providers
子元素来指定会话状态存储提供者的类型。你可以通过同时为子元素添加 type
参数(包括用来指定提供者的类型名称)和 name
参数(用来指定提供者的实例名称)的方式来指定提供者的类型。于是提供者的实例名称被提供给 sessionState
元素的 customProvider
参数并用来配置 ASP.NET 会话状态以对这个存储并获取会话数据的提供者实例进行使用。
如下实例说明了来自于一个指定 ASP.NET 会话状态使用自定义会话状态存储提供者的 Web.config 文件中的元素集:
<configuration> <connectionStrings> <add name="OdbcSessionServices" connectionString="DSN=SessionState;" /> </connectionStrings> <system.web> <sessionState mode="Custom" customProvider="OdbcSessionProvider"> <providers> <add name="OdbcSessionProvider" type="Samples.AspNet.Session.OdbcSessionStateStore" connectionStringName="OdbcSessionServices" writeExceptionsToEventLog="false" /> </providers> </sessionState> </system.web> </configuration>
关于自定义会话状态存储提供者的更多信息,请参考:[实现会话状态存储提供者]。
提示:自定义的会话状态存储提供者能够对任何安全资源(如 SQL Server)进行访问,通过使用现有的 ASP.NET 进程标识或在 identity
配置元素中被提供的用户凭证,你可以通过指定 <identity impersonate="true" />
并把 sessionState
配置元素的 useHostingIdentity
参数值设置为 false
的方式来指定 IIS 所扮演的角色。更多关于 ASP.NET 进程标识的信息,请参考:[配置 ASP.NET 进程标识和 ASP.NET 角色扮演]。