Поделиться через


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

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

Сведения о приложениях ASP.NET Core см. в разделе "Кэширование выходных данных" в ASP.NET ядрах с помощью Redis в .NET 8.

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

Хранение выходных данных ASP.NET основной страницы в Redis

Полные спецификации функций см. в разделе ASP.NET кэширование основных выходных данных.

Пример приложения, демонстрирующего использование, см. в веб-приложении .NET 8 с кэшированием выходных данных Redis и Azure OpenAI.

Хранение выходных данных страниц ASP.NET в Redis

Чтобы настроить клиентское приложение в 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.

Атрибут Тип По умолчанию. Description
_хозяин* строка "localhost" IP-адрес или имя узла сервера Redis
port положительное целое число 6379 (не TLS/SSL)
6380 (TLS/SSL)
10000 для Redis Enterprise и Управляемого Redis Azure (предварительная версия)
Порт сервера Redis
accessKey строка "" Пароль сервера Redis, если включена авторизация Redis. Значение является пустой строкой по умолчанию, что означает, что поставщик состояний сеанса не использует пароль при подключении к серверу Redis. Если сервер Redis находится в общедоступной сети, например "Кэш Azure для Redis", обязательно включите авторизацию Redis для укрепления защиты и предоставьте безопасный пароль.
ssl boolean 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 boolean true Только SessionStateProvider
Этот атрибут можно указать только с помощью web.config или AppSettings.

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

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

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

Дополнительные сведения о retryTimeoutInMilliseconds см. в разделе Примечания к retryTimeoutInMilliseconds в примечания к атрибутам.
redisSerializerType строка Недоступно Указывает полное имя типа сборки класса, реализующего Microsoft.Web.Redis. Сериализатор, содержащий пользовательскую логику для сериализации и десериализации значений. Дополнительные сведения см. в разделе О redisSerializerType в примечаниях к атрибутам.

Примечания к атрибутам

Настройка connectionString

Значение connectionString используется в качестве ключа для получения фактической строки подключения из AppSettings, если такая строка существует в AppSettings. Если значение connectionString не найдено в AppSettings, значение connectionString используется в качестве ключа для получения фактических строка подключения из раздела ConnectionString web.config, если этот раздел существует. Если строка подключения не существует в AppSettings или в разделе ConnectionString web.config, литеральное значение connectionString используется в качестве строка подключения при создании StackExchange.Redis.ConnectionMultiplexer.

Следующий пример иллюстрирует использование 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).