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 会话状态选项。
若要使用 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。 请务必指定正确的端口。
- 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 的会话状态提供程序时,请确保在会话状态中存储的数据类型可序列化。
- 内存中会话状态提供程序 - 此提供程序将会话状态存储在内存中。 使用此提供程序的好处是简单且快速。 但是,如果使用内存中提供程序,由于它不是分布式的,因此不能缩放 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 构建实际的云应用))。