Azure Redis 缓存的 ASP.NET 输出缓存提供程序

Redis 输出缓存提供程序是用于输出缓存数据的进程外存储机制。 此数据专门用于完整 HTTP 响应(页面输出缓存)。 此提供程序会插入 ASP.NET 4 中引入的新输出缓存提供程序扩展点。 对于 ASP.NET Core 应用程序,请参阅 ASP.NET Core 中的响应缓存

要使用 Redis 输出缓存提供程序,首先配置用户的缓存,然后使用 Redis 输出缓存提供程序 NuGet 包配置 ASP.NET 应用程序。 本文提供有关配置应用程序以使用 Redis 输出缓存提供程序的指南。 有关创建和配置 Azure 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 连接字符串。 此属性可提供 hostportaccessKeyssl 和其他 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 输出缓存提供程序。

第三方输出缓存提供程序

后续步骤

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