会话状态模式

 

ASP.NET 会话状态支持若干用于会话数据的存储选项。 每个选项都由 SessionStateMode 枚举中的一个值标识。 下面的列表描述了可用的会话状态模式:

  • InProc 模式,此模式将会话状态存储在 Web 服务器上的内存中。 这是默认值。

  • StateServer 模式,此模式将会话状态存储在一个名为 ASP.NET 状态服务的单独进程中。 这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。

  • SQLServer 模式将会话状态存储到一个 SQL Server 数据库中。 这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。

  • Custom 模式,此模式允许您指定自定义存储提供程序。

  • Off 模式,此模式禁用会话状态。

通过在应用程序的 Web.config 文件中为 sessionState 元素的 mode 特性分配一个 SessionStateMode 枚举值,可以指定要让 ASP.NET 会话状态使用的模式。 除了 InProcOff 之外,其他模式都需要附加参数,例如将在本主题后面讨论的连接字符串值。 通过访问 HttpSessionState.Mode 属性的值,可以查看当前选定的会话状态。

进程内模式是默认的会话状态模式,使用 InProcSessionStateMode 枚举值指定。 进程内模式将会话状态值和变量存储在本地 Web 服务器上的内存中。 它是唯一支持 Session_OnEnd 事件的模式。 有关 Session_OnEnd 事件的更多信息,请参见会话状态事件

警告说明警告

如果您通过在应用程序的 Web.config 文件的 processModel 元素中将 webGarden 特性设置为 true,从而启用网络园模式,请不要使用 InProc 会话状态模式。 如果使用此模式,则在同一会话的不同请求由不同的辅助进程进行处理时,可能会发生数据丢失。

StateServer 模式将会话状态存储在一个称为 ASP.NET 状态服务的进程中,该进程是独立于 ASP.NET 辅助进程或 IIS 应用程序池的单独进程。 使用此模式可以确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于网络场中的多个 Web 服务器。

若要使用 StateServer 模式,必须首先确保 ASP.NET 状态服务运行在用于存储会话的服务器上。 ASP.NET 状态服务在安装 ASP.NET 和 .NET Framework 时作为一个服务进行安装。 ASP.NET 状态服务安装在以下位置:

系统根目录Microsoft.NETFramework版本号aspnet_state.exe

若要将某个 ASP.NET 应用程序配置为使用 StateServer 模式,请在该应用程序的 Web.config 文件中执行以下操作:

  • sessionState 元素的 mode 特性设置为 StateServer

  • stateConnectionString 特性设置为 tcpip=服务器名称:42424

    注意注意

    在使用 StateServer 模式时,若要提高应用程序的安全性,建议您对配置文件的 sessionState 节进行加密,以保护 stateConnectionString 值。 有关详细信息,请参见使用受保护的配置加密配置信息

下面的示例演示了 StateServer 模式的一种配置设置,其中会话状态存储在一个名为 SampleStateServer 的远程计算机上:

 
 
<configuration>
  <system.web>
    <sessionState mode="StateServer"
      stateConnectionString="tcpip=SampleStateServer:42424"
      cookieless="false"
      timeout="20"/>
  </system.web>
</configuration>
注意注意

如果模式设置为 StateServer,则存储在会话状态中的对象必须是可序列化的。 有关可序列化对象的信息,请参见 SerializableAttribute 类。

若要在网络场中使用 StateServer 模式,则必须在 Web 配置文件的 machineKey 元素中为网络场中的所有应用程序指定相同的加密密钥。 有 关如何创建计算机密钥的信息,请参见位于 http://support.microsoft.com 上的 Microsoft 知识库中的文章 313091“How to create keys by using Visual Basic .NET for use in Forms authentication”(如何使用 Visual Basic .NET 创建用于 Forms 身份验证的密钥)。

SQLServer 模式将会话状态存储到一个 SQL Server 数据库中。 使用此模式可以确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于网络场中的多个 Web 服务器。

注意注意

如果是 SQL Server 模式,则存储在会话状态中的对象必须是可序列化的。 有关可序列化对象的信息,请参见 SerializableAttribute 类。

若要使用 SQLServer 模式,必须首先确保在 SQL Server 上安装了 ASP.NET 会话状态数据库。 可以使用 Aspnet_regsql.exe 工具安装 ASP.NET 会话状态数据库,本主题稍后将对此进行说明。

若要将某个 ASP.NET 应用程序配置为使用 SQLServer 模式,请在该应用程序的 Web.config 文件中执行以下操作:

  • sessionState 元素的 mode 特性设置为 SQLServer

  • sqlConnectionString 特性设置为 SQL Server 数据库的连接字符串。

    注意注意

    在使用 SQLServer 模式时,若要提高应用程序的安全性,建议您对配置文件的 sessionState 节进行加密,以保护 sqlConnectionString 值。 有关详细信息,请参见使用受保护的配置加密配置信息

下面的示例演示了 SQLServer 模式的一种配置设置,其中会话状态存储在一个名为“SampleSqlServer”的 SQL Server 上:

 
 
<configuration>
  <system.web>
    <sessionState mode="SQLServer"
      sqlConnectionString="Integrated Security=SSPI;data 
        source=SampleSqlServer;" />
  </system.web>
</configuration>
注意注意

如果在配置文件中使用 sessionState 元素的 sqlConnectionString 特性指定一个到 SQL Server 的受信任连接,则 SessionStateModule 将使用 SQL Server 集成安全性连接到 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 数据库。 对于在 SQL Server 数据库中共享会话状态的所有 Web 服务器,在 IIS 元数据库中 ASP.NET 应用程序的路径必须是相同的。 有 关解决服务器之间应用程序路径不同的问题的步骤信息,请参见位于 http://support.microsoft.com 上的 Microsoft 知识库中的文章 325056“PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode”(PRB:如果使用 SqlServer 或 StateServer 会话模式则会在网络场中丢失会话状态)。

使用 Aspnet_regsql.exe 工具安装会话状态数据库

若要在 SQL Server 上安装会话状态数据库,请运行 Aspnet_regsql.exe 工具,该工具位于 Web 服务器上的系统根目录Microsoft.NETFramework版本号 文件夹中。 使用命令提供以下信息:

  • 使用 -S 选项指定 SQL Server 实例的名称。

  • 有权在 SQL Server 上创建数据库的帐户的登录凭据。 使用 -E 选项,以使用当前登录的用户,或者使用 -U 选项指定用户 ID,并使用 -P 选项指定密码。

  • 用于添加会话状态数据库的 -ssadd 命令行选项。

    默认情况下,不能使用 Aspnet_regsql.exe 工具在 SQL Server Express 上安装会话状态数据库。 若要运行 Aspnet_regsql.exe 工具来安装 SQL Server Express 数据库,必须首先使用如下所示的 Transact-SQL 命令来启用 Agent XPs SQL Server 选项:

     
     
    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 实例运行这些 Transact-SQL 命令。

默认情况下,Aspnet_regsql.exe 工具将创建一个名为 ASPState 的数据库,该数据库包含支持 SQLServer 模式的存储过程。 默认情况下,会话数据本身存储在 tempdb 数据库中。 您可以选择使用 -sstype 选项来更改会话数据的存储位置。 下表给出了 -sstype 选项可能的值:

选项

说明

t

将会话数据存储到 SQL Server tempdb 数据库中。 这是默认值。 如果将会话数据存储到 tempdb 数据库中,则在重新启动 SQL Server 时将丢失会话数据。

p

将会话数据存储到 ASPState 数据库中,而不是存储到 tempdb 数据库中。

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 工具配置 ASP.NET 以将会话状态存储到持久性 SQL Server 数据库中。 不过,您可以采用脚本将会话状态存储到持久性数据库中。 有关详细信息,请参见位于 http://support.microsoft.com 上的 Microsoft 知识库中的文章 311209“如何为持久性 SQL Server 会话状态管理配置 ASP.NET”。 或者,运行 ASP.NET 1.0 或 ASP.NET 1.1 的 Web 服务器也可以将持久性会话状态定向到已安装 ASP.NET 2.0 会话状态架构的 SQL Server 中。

SQLServer 模式下,可以将某些运行 SQL Server 的计算机配置为故障转移群集,故障转移群集是两台或多台运行 SQL Server 的相同计算机,用于存储单个数据库的数据。 如果一台运行 SQL Server 的计算机出现故障,群集中的另一台服务器就会接管它的工作,处理请求,而不会丢失会话数据。 若要配置 SQL Server 模式以实现故障转移群集,必须在执行 Aspnet_regsql.exe 工具时指定 -sstype p,从而使会话状态数据存储到 ASPState 数据库,而不是 tempdb 数据库。 SQL Server 群集不支持将会话状态存储到 tempdb 数据库中。 有 关设置 SQL Server 模式以实现故障转移群集的更多信息,请参见位于 http://support.microsoft.com 上的 Microsoft 知识库中的文章 323262“How to use ASP.NET session state SQL Server Mode in a failover cluster”(如何在故障转移群集中使用 ASP.NET 会话状态 SQL Server 模式)。

Custom 模式指定您希望使用自定义会话状态存储提供程序来存储会话状态数据。 在使用 CustomMode 配置 ASP.NET 应用程序时,必须使用 sessionState 配置元素的 providers 子元素指定会话状态存储提供程序的类型。 使用 add 子元素来指定提供程序类型,并包括指定提供程序类型名称的 type 特性以及指定提供程序实例名称的 name 特性。 然后,将提供程序实例的名称提供给 sessionState 元素的 customProvider 特性,将 ASP.NET 会话状态配置为使用该提供程序实例来存储和检索会话数据。

下面的示例演示了一个 Web.config 文件中的一些元素,这些元素指定 ASP.NET 会话状态使用自定义会话状态存储提供程序:

 
 
<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>

有关自定义会话状态存储提供程序的更多信息,请参见 实现会话状态存储提供程序

注意注意

自定义会话状态存储提供程序将使用 ASP.NET 进程标识或向 identity 配置元素提供的用户凭据(如果存在)来访问任何安全的资源,例如 SQL Server。 而通过指定 <identity impersonate="true" />,并将 sessionState 配置元素的 useHostingIdentity 特性设置为 false,则可指定使用由 IIS 模拟的标识。 有关 ASP.NET 进程标识的更多信息,请参见配置 ASP.NET 进程标识ASP.NET 模拟

原文地址:https://www.cnblogs.com/pxsbest/p/3155759.html