Azure Redis 缓存的 ASP.NET 会话状态提供程序

Azure Redis 缓存提供了一个会话状态提供程序,可使用该提供程序通过 Azure Redis 缓存将会话状态存储在内存中而不是存储在 SQL Server 数据库中。 要使用缓存会话状态提供程序,首先配置缓存,然后使用用于 Azure Redis 缓存会话状态 NuGet 包为缓存配置 ASP.NET 应用程序。 对于 ASP.NET Core 应用程序,请参阅 ASP.NET Core 中的会话和状态管理

在云应用中避免存储某种形式的用户会话状态通常是不现实的,但某些方法相比其他方法而言,对性能和可伸缩性的影响更大。 如果需要存储状态,最佳解决方案是使状态量保持较小并将其存储在 Cookie 中。 如果这不可行,下一个最佳解决方案是将 ASP.NET 会话状态与提供程序配合使用以实现分布式内存中缓存。 从性能和可伸缩性的角度来看,最差的解决方案是使用数据库支持的会话状态提供程序。 本文提供有关使用 Azure Redis 缓存的 ASP.NET 会话状态提供程序的指南。 有关其他会话状态选项的信息,请参阅 ASP.NET 会话状态选项

在缓存中存储 ASP.NET 会话状态

若要使用 Azure Cache for Redis 会话状态 NuGet 包在 Visual Studio 中配置客户端应用程序,请在“工具”菜单中依次选择“NuGet 包管理器”、“包管理器控制台” 。

Package Manager Console 窗口运行以下命令。

Install-Package Microsoft.Web.RedisSessionStateProvider

重要

如果使用高级层的聚类分析功能,则必须使用 RedisSessionStateProvider 2.0.1 或更高版本,否则会引发异常。 迁移到 2.0.1 或更高版本是一项中断性变更。

Redis 会话状态提供程序 NuGet 包依赖于 StackExchange.Redis 包。 如果项目中没有 StackExchange.Redis 包,则会安装它。

NuGet 包会下载并添加所需的程序集引用,并将以下节添加到 web.config 文件中。 此部分包含 ASP.NET 应用程序使用 Azure Redis 缓存会话状态提供程序所需的配置。

<sessionState mode="Custom" customProvider="MySessionStateStore">
  <providers>
    <!-- Either use 'connectionString' OR 'settingsClassName' and 'settingsMethodName' OR use 'host','port','accessKey','ssl','connectionTimeoutInMilliseconds' and 'operationTimeoutInMilliseconds'. -->
    <!-- 'throwOnError','retryTimeoutInMilliseconds','databaseId' and 'applicationName' can be used with both options. -->
    <!--
      <add name="MySessionStateStore" 
        host = "127.0.0.1" [String]
        port = "" [number]
        accessKey = "" [String]
        ssl = "false" [true|false]
        throwOnError = "true" [true|false]
        retryTimeoutInMilliseconds = "5000" [number]
        databaseId = "0" [number]
        applicationName = "" [String]
        connectionTimeoutInMilliseconds = "5000" [number]
        operationTimeoutInMilliseconds = "1000" [number]
        connectionString = "<Valid StackExchange.Redis connection string>" [String]
        settingsClassName = "<Assembly qualified class name that contains settings method specified below. Which basically return 'connectionString' value>" [String]
        settingsMethodName = "<Settings method should be defined in settingsClass. It should be public, static, does not take any parameters and should have a return type of 'String', which is basically 'connectionString' value.>" [String]
        loggingClassName = "<Assembly qualified class name that contains logging method specified below>" [String]
        loggingMethodName = "<Logging method should be defined in loggingClass. It should be public, static, does not take any parameters and should have a return type of System.IO.TextWriter.>" [String]
        redisSerializerType = "<Assembly qualified class name that implements Microsoft.Web.Redis.ISerializer>" [String]
      />
    -->
    <add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider"
         host=""
         accessKey=""
         ssl="true" />
  </providers>
</sessionState>

注释部分提供了属性及每个属性的示例设置的一个示例。

在 Azure 门户中使用左侧来自缓存的值配置这些属性,并根据需要配置其他值。 有关访问缓存属性的说明,请参阅配置 Azure Redis 缓存设置

  • host - 指定缓存终结点。
  • port - 使用非 TLS/SSL 端口或 TLS/SSL 端口,具体取决于 TLS 设置。
  • accessKey - 使用缓存的主密钥或辅助密钥。
  • ssl - 如果要使用 TLS 保护缓存/客户端通信,则为 true;否则为 false。 请务必指定正确的端口。
    • 默认情况下,将为新缓存禁用非 TLS 端口。 为此设置指定“true”可使用 TLS 端口。 有关启用非 TLS 端口的详细信息,请参阅配置缓存一文中的访问端口部分。
  • throwOnError - 如果希望在失败时引发异常,则为 true;如果希望操作以静默方式失败,则为 false。 通过选中 Microsoft.Web.Redis.RedisSessionStateProvider.LastException 属性检查故障。 默认值为 true。
  • retryTimeoutInMilliseconds - 在此时间间隔内重试失败的操作,以毫秒为单位指定。 第一次重试发生 20 毫秒后,每秒重试一次,直到 retryTimeoutInMillisecond 间隔期满。 在此时间间隔过后,立即重试操作最后一次。 如果操作仍失败,根据 throwOnError 设置,将异常情况返回到调用程序。 默认值为 0,这意味着不重试。
  • databaseId - 指定要用于缓存输出数据的数据库。 如果未指定,则使用默认值 0。
  • applicationName - 密钥存储在 Redis 中作为 {<Application Name>_<Session ID>}_Data。 此命名方案使多个应用程序可以共享同一 Redis 实例。 此参数是可选的,如果未提供它,则使用默认值。
  • connectionTimeoutInMilliseconds - 此设置可替代 StackExchange.Redis 客户端中的 connectTimeout 设置。 如果未指定,则使用默认 connectTimeout 设置 5000。 有关详细信息,请参阅 StackExchange.Redis 配置模型
  • operationTimeoutInMilliseconds - 此设置允许覆盖 StackExchange.Redis 客户端中的 syncTimeout 设置。 如果未指定,则使用默认 syncTimeout 设置 1000。 有关详细信息,请参阅 StackExchange.Redis 配置模型
  • redisSerializerType - 此设置允许你为发送到 Redis 的会话内容指定自定义序列化。 指定的类型必须实现 Microsoft.Web.Redis.ISerializer 并且必须声明公共无参数构造函数。 默认使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

有关这些属性的详细信息,请参阅 宣布推出适用于 Redis 的 ASP.NET 会话状态提供程序中的原始博客文章公告。

请不要忘记将 web.config 文件中的标准 InProc 会话状态提供程序注释掉。

<!-- <sessionState mode="InProc"
     customProvider="DefaultSessionProvider">
     <providers>
        <add name="DefaultSessionProvider"
              type="System.Web.Providers.DefaultSessionStateProvider,
                    System.Web.Providers, Version=1.0.0.0, Culture=neutral,
                    PublicKeyToken=31bf3856ad364e35"
              connectionStringName="DefaultConnection" />
      </providers>
</sessionState> -->

执行这些步骤后,应用程序已配置为使用 Azure Redis 缓存会话状态提供程序。 在应用程序中使用会话状态时,会话状态将存储在 Azure Redis 缓存实例中。

重要

与可以存储在默认的内存中 ASP.NET 会话状态提供程序中的数据不同,在缓存中存储的数据必须可序列化。 使用适用于 Redis 的会话状态提供程序时,请确保在会话状态中存储的数据类型可序列化。

ASP.NET 会话状态选项

  • 内存中会话状态提供程序 - 此提供程序将会话状态存储在内存中。 使用此提供程序的好处是简单且快速。 但是,如果使用内存中提供程序,由于它不是分布式的,因此不能缩放 Web 应用。
  • SQL Server 会话状态提供程序 - 此提供程序将会话状态存储在 SQL Server 中。 如果要将会话状态保存在持久性存储中,请使用此提供程序。 可以缩放 Web 应用,但将 SQL Server 用于会话将对 Web 应用造成性能影响。 还可以将此提供程序与内存中 OLTP 配置一起使用来帮助提高性能。
  • 分布式内存中会话状态提供程序(如 Azure Redis 缓存会话状态提供程序) - 此提供程序提供两全其美的功能。 Web 应用可以使用简单、快速且可缩放的会话状态提供程序。 由于此提供程序将会话状态存储在缓存中,应用必须考虑到在与分布式内存中缓存通信时关联的所有特征,如暂时性网络故障。 有关使用缓存的最佳做法,请参阅 Microsoft 模式和做法“Azure 云应用程序设计和实现指南”中的缓存指南

有关会话状态和其他最佳实践的详细信息,请参阅 Web Development Best Practices (Building Real-World Cloud Apps with Azure)(Web 开发最佳做法(使用 Azure 构建实际的云应用))。

第三方会话状态提供程序

后续步骤

请查看用于 Azure Redis 缓存的 ASP.NET 输出缓存提供程序