ASP.NET 会话状态的模式
2007-01-18 17:45
309 查看
ASP.NET 会话状态为会话数据提供了几个不同的存储选项。每个选项都通过一个
你可以通过在应用程序 Web.config 文件中为
小心:如果你通过在应用程序的 Web.config 文件中把
要使用
systemroot\Microsoft.NET\Framework\版本号\aspnet_state.exe
要配置 ASP.NET 应用程序来使用
把
把
提示:要在使用
如下实例说明了一个为被存储在名为 SampleStateServer 的远程计算机中的会话状态而使用
提示:如果
要在 Web 农场中使用
提示:如果
要使用
要配置 ASP.NET 应用程序来使用
把
把
提示:要在使用
如下实例说明了一个为被存储在名为 SampleStateServer 的远程计算机中的会话状态而使用
提示:如果你在配置文件中使用
要配置 Web 农场的
SQL Server 实例的名称,使用 -S 选项。
一个拥有 SQL Server 数据库创建权限的用户帐号的登入凭证。使用 -E 选项来使用当前已登入的用户,或连同指定密码的 -P 选项一起使用 -U 选项来指定一个用户 ID。
-ssadd 命令行选项用来添加会话状态数据库。
默认时,你不能使用 Aspnet_regsql.exe 工具在 SQL Server Express Edition 中安装会话状态数据库。要运行 Aspnet_regsql.exe 工具来安装一个 SQL Server Express Edition 的数据库,你必须先使用如下所示的 T-SQL 命令来启用 Agent XPs 选项:
如果有必要,你必须在任何禁用了 Agent Xps 选项的 SQL Server Express Edition 实例中运行这些 T-SQL 命令。
默认时,Aspnet_regsql.exe 工具将创建一个名为 ASPState 并包含对
例如,如下命令在一个名为 SampleSqlServer 的 SQL Server 实例中创建了一个名为 ASPState 的数据库并指定会话状态也同样需要被存储在 ASPState 数据库中:
aspnet_regsql.exe -S SampleSqlServer -E -ssadd -sstype p
提示:如果你运行了 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 配置]。
使用
如下实例说明了来自于一个指定 ASP.NET 会话状态使用自定义会话状态存储提供者的 Web.config 文件中的元素集:
关于自定义会话状态存储提供者的更多信息,请参考:[实现会话状态存储提供者]。
提示:自定义的会话状态存储提供者能够对任何安全资源(如 SQL Server)进行访问,通过使用现有的 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 模式
InProc模式是使用
SessionStateMode枚举的
InProc值所指定的默认的会话状态模式。
InProc模式在本地 Web 服务器的内存中存储会话状态的值和变量。同时它也是唯一能够支持
Session_OnEnd事件的模式。更多关于
Session_OnEnd事件的信息,请参考:[会话状态的事件]。
小心:如果你通过在应用程序的 Web.config 文件中把
processModel元素的
webGarden参数值设置成
true的方式来启用 Web 花园模式,注意这时候将不能使用
InProc会话状态模式,如果你坚持这样,那么在不同的工作者而提供的相同会话的不同请求中将会出现数据丢失的现象。
StateServer 模式
StateServer模式在进程中存储会话状态,被称之为 ASP.NET 状态服务,并独立于 ASP.NET 工作者进程或 IIS 应用程序池。如果 Web 应用程序被重启并同时为 Web 农场产生了被多个 Web 服务器可用的会话状态,那么通过使用这个模式就能够确保会话状态会被保持。
要使用
StateServer模式,你必须先确认 ASP.NET 状态服务已经在已使用会话存储的服务器中被运行。在安装了 ASP.NET 和 .NET Framework 的时候,ASP.NET 状态服务会被安装成一个系统服务。ASP.NET 状态服务被安装在系统中的如下位置:
systemroot\Microsoft.NET\Framework\版本号\aspnet_state.exe
要配置 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 模式
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 农场的会话状态的丢失]。
使用 Aspnet_regsql.exe 工具来安装会话状态数据库
要在 SQL Server 中安装会话状态数据库,就需要运行位于 Web 服务器的 Systemroot\Microsoft.NET\Framework\版本号 目录中的 Aspnet_regsql.exe 工具。该工具支持如下命令行信息:SQL Server 实例的名称,使用 -S 选项。
一个拥有 SQL Server 数据库创建权限的用户帐号的登入凭证。使用 -E 选项来使用当前已登入的用户,或连同指定密码的 -P 选项一起使用 -U 选项来指定一个用户 ID。
-ssadd 命令行选项用来添加会话状态数据库。
默认时,你不能使用 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 选项来包括自定义数据库的名称。 |
aspnet_regsql.exe -S SampleSqlServer -E -ssadd -sstype p
提示:如果你运行了 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模式指定了你需要用来存储会话状态数据的一个自定义会话状态存储提供者。在你使用
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 角色扮演]。
相关文章推荐
- ASP.NET Session State(会话状态)SQLServer模式和设置
- 在无cookie模式中,会话话状态的ID将会自动保存在ASP.NET的查询字符串中
- 在无cookie模式中,会话话状态的ID将会自动保存在ASP.NET的查询字符串中
- 关于:“无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化
- 【解决】SharePoint 2010 - ASP.NET 的会话状态已禁用。报表查看器控件要求在本地模式下启用会话状态
- 无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。
- 关于:“无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。”的问题
- ASP.NET 的会话状态已禁用。报表查看器控件要求在本地模式下启用会话状态。
- ASP.NET 会话状态的模式
- Asp.net中SqlServer模式Session的多站点共享会话状态
- ASP.NET 会话状态概述(补充)
- 认识ASP.NET会话状态
- 无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。
- Redis提供商配置ASP.NET会话状态
- ASP.NET会话(Session)保存模式
- 配置 SQLServer 来存储 ASP.NET 会话状态
- Azure Redis 缓存的 ASP.NET 会话状态提供程序
- ASP.NET 2.0 二级域名Forms验证模式下共享登陆状态
- ASP.NET会话(Session)保存模式