ASP.NET 会话状态的模式

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 选项来包括自定义数据库的名称。

例如,如下命令在一个名为 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 配置]。

使用 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 角色扮演]。

上一篇:Linux下 ntp 时间同步服务ntpd 出现 the NTP socket is in use, exiting 解决


下一篇:Linux下实现与Internet时间同步