Azure Redis 缓存的 ASP.NET 输出缓存提供程序
Redis 输出缓存提供程序是用于输出缓存数据的进程外存储机制。 此数据专门用于完整 HTTP 响应(页面输出缓存)。 此提供程序会插入 ASP.NET 4 中引入的新输出缓存提供程序扩展点。
对于 ASP.NET Core 应用程序,请参阅在 .NET 8 中使用 Redis 输出 ASP.NET Core 中的缓存。
要使用 Redis 输出缓存提供程序,首先配置用户的缓存,然后使用 Redis 输出缓存提供程序 NuGet 包配置 ASP.NET 应用程序。 本文提供有关配置应用程序以使用 Redis 输出缓存提供程序的指南。 有关创建和配置 Azure Redis 缓存实例的详细信息,请参阅创建缓存。
在 Redis 中存储 ASP.NET Core 页面输出
有关完整功能规范,请参阅 ASP.NET Core 输出缓存。
有关演示用法的示例应用程序,请参阅使用 Redis 输出缓存和 Azure OpenAI 的 .NET 8 Web 应用程序。
在 Redis 中存储 ASP.NET 页面输出
若要使用 Azure Cache for Redis 会话状态 NuGet 包在 Visual Studio 中配置客户端应用程序,请在“工具”菜单中依次选择“NuGet 包管理器”、“包管理器控制台” 。
从 Package Manager Console
窗口运行以下命令:
Install-Package Microsoft.Web.RedisOutputCacheProvider
Redis 输出缓存提供程序 NuGet 包依赖于StackExchange.Redis包。 如果项目中没有StackExchange.Redis包,则会安装它。 有关 Redis 输出缓存提供程序 NuGet 包的详细信息,请参阅 RedisOutputCacheProvider NuGet 页。
NuGet 包会下载并添加所需的程序集引用,并将以下节添加到 web.config 文件中。 此节包含的配置是 ASP.NET 应用程序使用 Redis 输出缓存提供程序所必需的。
<caching>
<outputCache defaultProvider="MyRedisOutputCache">
<providers>
<add name="MyRedisOutputCache" type="Microsoft.Web.Redis.RedisOutputCacheProvider"
host=""
accessKey=""
ssl="true" />
</providers>
</outputCache>
</caching>
在第一个列中使用来自 Azure 门户中的缓存的值配置特性。 另外,配置所需的其他值。 有关访问缓存属性的说明,请参阅配置 Azure Redis 缓存设置。
属性 | 类型 | 默认 | 说明 |
---|---|---|---|
_host* | string | "localhost" | Redis 服务器 IP 地址或主机名 |
port | 正整数 | 6379(非 TLS/SSL) 6380(TLS/SSL) |
Redis 服务器端口 |
accessKey | string | "" | 启用 Redis 授权时的 Redis 服务器密码。 该值默认为空字符串,这意味着会话状态提供程序在连接到 Redis 服务器时不使用任何密码。 如果 Redis 服务器位于 Azure Cache for Redis 等可公开访问的网络中,请务必启用 Redis 授权以提高安全性,并提供安全密码。 |
ssl | boolean | false | 是否要通过 TLS 连接到 Redis 服务器。 此值默认为“false”,因为 Redis 默认不支持 TLS。 如果使用默认支持 SSL 的 Azure Cache for Redis,请务必将此值设置为 true,以提高安全性。 默认情况下,将为新缓存禁用非 TLS 端口。 为此设置指定“true”可使用非 TLS 端口。 有关启用非 TLS 端口的详细信息,请参阅配置缓存一文中的访问端口部分。 |
databaseIdNumber | 正整数 | 0 | 只能通过 web.config 或 AppSettings 指定此属性。 指定要使用的 Redis 数据库。 |
connectionTimeoutInMilliseconds | 正整数 | 由 StackExchange.Redis 提供 | 用于在创建 StackExchange.Redis.ConnectionMultiplexer 时设置 ConnectTimeout。 |
operationTimeoutInMilliseconds | 正整数 | 由 StackExchange.Redis 提供 | 用于在创建 StackExchange.Redis.ConnectionMultiplexer 时设置 SyncTimeout。 |
connectionString(有效的 StackExchange.Redis 连接字符串) | string | n/a | 对 AppSettings 或 web.config 的参数引用,或有效的 StackExchange.Redis 连接字符串。 此属性可提供 host、port、accessKey、ssl 和其他 StackExchange.Redis 属性的值。 若要更详细地了解 connectionString,请参阅属性说明部分中的设置 connectionString。 |
settingsClassName settingsMethodName |
string string |
n/a | 只能通过 web.config 或 AppSettings 指定这些属性。 使用这些属性提供连接字符串。 _settingsClassName* 应是程序集限定的类名,其中包含settingsMethodName指定的方法。 settingsMethodName 指定的方法应是 public、static 和 void(不接受任何参数),其返回类型为 string。 此方法返回实际的连接字符串。 |
loggingClassName loggingMethodName |
string string |
n/a | 只能通过 web.config 或 AppSettings 指定这些属性。 使用这些属性可以通过提供会话状态/输出缓存的日志以及 StackExchange.Redis 的日志,来调试应用程序。 loggingClassName 应是程序集限定的类名,其中包含 loggingMethodName 指定的方法。 loggingMethodName 指定的方法应是 public、static 和 void(不接受任何参数),其返回类型为 System.IO.TextWriter。 |
applicationName | string | 当前进程的模块名称,或“/” | 仅限 SessionStateProvider 只能通过 web.config 或 AppSettings 指定此属性。 要在 Redis 缓存中使用的应用名称前缀。 客户可以使用相同的 Redis 缓存来实现不同的目的。 为了确保会话密钥不发生冲突,可以使用应用程序名称作为前缀。 |
throwOnError | boolean | 是 | 仅限 SessionStateProvider 只能通过 web.config 或 AppSettings 指定此属性。 出错时是否引发异常。 有关 throwOnError 的详细信息,请参阅属性说明部分中的有关 throwOnError 的说明。 |
retryTimeoutInMilliseconds | 正整数 | 5000 | 仅限 SessionStateProvider 只能通过 web.config 或 AppSettings 指定此属性。 操作失败时要重试多长时间。 如果此值小于operationTimeoutInMilliseconds,则提供程序不会重试。 有关 retryTimeoutInMilliseconds 的详细信息,请参阅属性说明部分中的有关 retryTimeoutInMilliseconds 的说明。 |
redisSerializerType | string | n/a | 指定某个类的程序集限定类型名称,该类实现 Microsoft.Web.Redis. 序列化程序,包含用于序列化和反序列化值的自定义逻辑。 有关详细信息,请参阅属性说明部分中的关于 redisSerializerType。 |
属性说明
设置 connectionString
connectionString 的值用作密钥,从 AppSettings 中提取实际的连接字符串(如果 AppSettings 中存在此类字符串)。 如果在 AppSettings 中未找到此字符串,connectionString的值会用作密钥,从 web.config 的ConnectionString 节(如果存在该节)中提取实际的连接字符串。 如果 AppSettings 或 web.config 的ConnectionString节中不存在该连接字符串,则创建 StackExchange.Redis.ConnectionMultiplexer 时,会将connectionString的文本值用作连接字符串。
以下示例演示如何使用 connectionString。
示例 1
<connectionStrings>
<add name="MyRedisConnectionString" connectionString="mycache.redis.cache.chinacloudapi.cn:6380,password=actual access key,ssl=True,abortConnect=False" />
</connectionStrings>
在web.config
中,使用密钥作为参数值而不是实际值。
<sessionState mode="Custom" customProvider="MySessionStateStore">
<providers>
<add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
name = "MySessionStateStore"
connectionString = "MyRedisConnectionString"/>
</providers>
</sessionState>
示例 2
<appSettings>
<add key="MyRedisConnectionString" value="mycache.redis.cache.chinacloudapi.cn:6380,password=actual access key,ssl=True,abortConnect=False" />
</appSettings>
在web.config
中,使用密钥作为参数值而不是实际值。
<sessionState mode="Custom" customProvider="MySessionStateStore">
<providers>
<add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
name = "MySessionStateStore"
connectionString = "MyRedisConnectionString"/>
</providers>
</sessionState>
示例 3
<sessionState mode="Custom" customProvider="MySessionStateStore">
<providers>
<add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
name = "MySessionStateStore"
connectionString = "mycache.redis.cache.chinacloudapi.cn:6380,password=actual access key,ssl=True,abortConnect=False"/>
</providers>
</sessionState>
有关 throwOnError 的说明
目前,如果在会话操作期间出错,则会话状态提供程序将引发异常。 引发异常会关闭应用程序。
此行为现已修改,符合现有 ASP.NET 会话状态提供程序用户的预期,同时还允许处理异常。 发生错误时,默认行为仍会引发异常,这与其他 ASP.NET 会话状态提供程序一致。 现有代码的运行方式应与以前相同。
如果将 throwOnError 设置为 false,则出错时不会引发异常,而是以无提示方式失败。 若要查看是否已出错,从而发现具体的异常是什么,请检查静态属性 Microsoft.Web.Redis.RedisSessionStateProvider.LastException。
有关 retryTimeoutInMilliseconds 的说明
retryTimeoutInMilliseconds 设置提供了一些逻辑,用于简化会话操作在因网络故障或其他原因而失败时重试的过程。 retryTimeoutInMilliseconds 设置还可用于控制重试超时或完全选择退出重试。
如果将retryTimeoutInMilliseconds设置为某个数字(例如 2000),则当会话操作失败时,它会重试 2000 毫秒,如果仍然失败,系统将认为出错。 若要让会话状态提供程序应用此重试逻辑,只需配置超时。 首次重试发生在 20 毫秒之后,在大多数情况下,发生网络小故障时,此时间已足够。 此后,操作会每隔一秒重试一次,直到超时。超时过后,操作会紧接着再试一次,以确保不会将超时终止(最多)一秒。
如果你认为不需要重试或者要自行处理重试逻辑,请将 retryTimeoutInMilliseconds 设置为 0。 例如,当在与应用程序相同的计算机上运行 Redis 服务器时,你可能不希望重试。
关于 redisSerializerType
默认情况下,用于在 Redis 上存储值的序列化是以 BinaryFormatter 类提供的二进制格式完成的。 使用 redisSerializerType 可以指定某个类的程序集限定类型名称,该类实现 Microsoft.Web.Redis.ISerializer,且包含用于序列化和反序列化值的自定义逻辑。 例如,以下是一个使用 JSON.NET 的 Json 序列化程序类:
namespace MyCompany.Redis
{
public class JsonSerializer : ISerializer
{
private static JsonSerializerSettings _settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All };
public byte[] Serialize(object data)
{
return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data, _settings));
}
public object Deserialize(byte[] data)
{
if (data == null)
{
return null;
}
return JsonConvert.DeserializeObject(Encoding.UTF8.GetString(data), _settings);
}
}
}
假设此类在名为 MyCompanyDll 的程序集中定义,你可以设置参数 redisSerializerType 来使用该类:
<sessionState mode="Custom" customProvider="MySessionStateStore">
<providers>
<add type = "Microsoft.Web.Redis.RedisSessionStateProvider"
name = "MySessionStateStore"
redisSerializerType = "MyCompany.Redis.JsonSerializer,MyCompanyDll"
... />
</providers>
</sessionState>
输出缓存指令
将 OutputCache 指令添加到希望为其缓存输出的每个页面中。
<%@ OutputCache Duration="60" VaryByParam="*" %>
在上例中,缓存的页面数据可在缓存中保留 60 秒,并且为每个参数组合缓存不同版本的页面。 有关 OutputCache 指令的详细信息,请参阅 @OutputCache。
执行这些步骤后,应用程序已配置为使用 Redis 输出缓存提供程序。