Поставщик кэша вывода ASP.NET для кэша Azure для Redis

Поставщик кэша вывода Redis представляет собой механизм внепроцессного хранения для выходных данных кэширования. Эти данные предназначены специально для полных HTTP-ответов (кэширование вывода страниц). Поставщик подключается к новой точке расширения поставщика вывода кэша, которая появилась в ASP.NET 4. Для приложений ASP.NET Core см. раздел Кэширование ответов в ASP.NET Core.

Чтобы использовать поставщик кэша вывода Redis, сначала настройте кэш, а затем приложение ASP.NET, используя пакет NuGet поставщика кэша вывода Redis. Эта статья содержит информацию о том, как настроить приложение, чтобы оно использовало поставщик кэша вывода Redis. Дополнительные сведения о создании и настройке экземпляра кэша Azure для Redis см. в разделе Создание кэша.

Сохранение выходных данных страницы ASP.NET в кэше

Чтобы настроить клиентское приложение в Visual Studio, используя пакет NuGet состояний сеансов Кэша Azure для Redis, в меню Сервис выберите Диспетчер пакетов NuGet, а затем — Консоль диспетчера пакетов.

Выполните следующую команду в окне Package Manager Console:

Install-Package Microsoft.Web.RedisOutputCacheProvider

Пакет NuGet поставщика кэша вывода Redis имеет зависимость от пакета StackExchange.Redis. Если в проекте отсутствует пакет StackExchange.Redis, он будет установлен. Дополнительные сведения о пакете NuGet RedisOutputCacheProvider см. на странице NuGet RedisOutputCacheProvider.

Пакет 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>

Настройте слева атрибуты со значениями из кэша на портале Microsoft Azure. Кроме того, настройте другие нужные вам значения. Инструкции по доступу к свойствам кэша см. в разделе Настройка параметров кэша Azure для Redis.

attribute Тип По умолчанию Описание
узел строка "localhost" IP-адрес или имя узла сервера Redis
port положительное целое число 6379 (не TLS/SSL)
6380 (TLS/SSL)
Порт сервера Redis
accessKey строка "" Пароль сервера Redis, если включена авторизация Redis. Значение по умолчанию — пустая строка, что означает, что поставщик состояний сеансов не будет использовать пароль при подключении к серверу Redis. Если сервер Redis находится в общедоступной сети, например "Кэш Azure для Redis", обязательно включите авторизацию Redis для укрепления защиты и предоставьте безопасный пароль.
ssl Логическое false Следует ли подключаться к серверу Redis по протоколу TLS. Изначально это значение равно false (ложь), так как Redis не поддерживает TLS по умолчанию. Если вы используете Кэш Azure для Redis, который поддерживает протокол SSL без дополнительной настройки, установите значение true (истина) для повышения безопасности.

Порт без TLS по умолчанию отключен для новых кэшей. Укажите true, чтобы этот параметр использовал порт без TLS. Дополнительные сведения о включении порта без TLS см. в разделе Порты доступа статьи о настройке кэша.
databaseIdNumber положительное целое число 0 Этот атрибут можно указать только с помощью web.config или AppSettings.

Укажите, какую базу данных Redis использовать.
connectionTimeoutInMilliseconds положительное целое число Предоставляется StackExchange.Redis Используется для задания ConnectTimeout при создании StackExchange.Redis.ConnectionMultiplexer.
operationTimeoutInMilliseconds положительное целое число Предоставляется StackExchange.Redis Используется для задания SyncTimeout при создании StackExchange.Redis.ConnectionMultiplexer.
connectionString (допустимая строка подключения StackExchange.Redis) строка Недоступно Либо ссылка на параметр AppSettings или web.config, либо допустимая строка подключения StackExchange.Redis. Этот атрибут может предоставлять значения для host, port, accessKey, ssl и других атрибутов StackExchange.Redis. Более подробные сведения о connectionString см. в разделе Настройка connectionString в примечаниях к атрибутам.
settingsClassName
settingsMethodName
строка
строка
Недоступно Эти атрибуты можно указать только с помощью web.config или AppSettings.

Используйте эти атрибуты для предоставления строки подключения. settingsClassName должно быть полным именем класса сборки, содержащим метод, заданный параметром settingsMethodName.

Метод, заданный параметром settingsMethodName, должен быть общедоступным, статическим и пустым (не принимать параметры), с типом возвращаемого значения string. Этот метод возвращает фактическую строку подключения.
loggingClassName
loggingMethodName
строка
строка
Недоступно Эти атрибуты можно указать только с помощью web.config или AppSettings.

Используйте эти атрибуты для отладки приложения, предоставив журналы из состояния сеанса/кэша вывода вместе с журналами из StackExchange.Redis. loggingClassName должно быть полным именем класса сборки, содержащим метод, заданный параметром loggingMethodName.

Метод, заданный параметром loggingMethodName, должен быть общедоступным, статическим и пустым (не принимать параметры), с типом возвращаемого значения System.IO.TextWriter.
applicationName строка Имя модуля текущего процесса или "/" Только SessionStateProvider
Этот атрибут можно указать только с помощью web.config или AppSettings.

Префикс имени приложения для использования в кэше Redis. Клиент может использовать один кэш Redis для разных целей. Чтобы избежать конфликта сеансовых ключей, можно указать имя приложения в качестве префикса.
throwOnError Логическое Да Только SessionStateProvider
Этот атрибут можно указать только с помощью web.config или AppSettings.

Следует ли выдавать исключение при возникновении ошибки.

Дополнительные сведения о throwOnError см. в разделе Примечания к throwOnError в примечаниях к атрибутам.
retryTimeoutInMilliseconds положительное целое число 5000 Только SessionStateProvider
Этот атрибут можно указать только с помощью web.config или AppSettings.

Продолжительность повторов при сбое операции. Если это значение меньше operationTimeoutInMilliseconds, поставщик не будет повторять попытки.

Дополнительные сведения о retryTimeoutInMilliseconds см. в разделе Примечания к retryTimeoutInMilliseconds в примечания к атрибутам.
redisSerializerType строка Недоступно Указывает полное имя типа сборки класса, реализующего 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.windows.net: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.windows.net: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.windows.net: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 с использованием JSON.NET:

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.

Сторонние поставщики кэша выходных данных

Дальнейшие действия

Посетите страницу ASP.NET Session State Provider for Azure Cache for Redis (Поставщик состояний сеансов ASP.NET для кэша Azure для Redis).