Поставщик состояний сеансов ASP.NET для Кэша Azure для Redis

Кэш Azure для Redis предоставляет поставщика состояний сеансов, который вы можете использовать для сохранения состояния сеанса в памяти с помощью кэша Azure для Redis вместо базы данных SQL Server. Для использования поставщика состояний сеансов с кэшированием сначала настройте кэш, а затем настройте приложение ASP.NET для кэша с помощью пакета кэша Azure для Redis NuGet для состояний сеансов. Для приложений ASP.NET Core прочтите Управление сеансами и состоянием в ASP.NET Core.

Не хранить определенные виды состояний сеансов пользователя в облачном приложении бывает нецелесообразно, но разные подходы по-разному влияют на производительность и масштабируемость. Если вам нужно хранить состояния, лучшим решением будет хранить небольшой объем состояний в файлах cookie. Если это невозможно, лучшей альтернативой будет использование состояний сеансов ASP.NET с помощью поставщика распределенного кэша в памяти. Худшее решение с точки зрения масштабируемости и производительности — использовать базу данных резервного поставщика состояний сеансов. Эта статья содержит указания по использованию поставщика состояний сеансов ASP.NET для Кэша Azure для Redis. Сведения о других параметрах состояний сеансов см. в разделе Параметры состояний сеансов ASP.NET.

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

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

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

Install-Package Microsoft.Web.RedisSessionStateProvider

Важно!

Если вы используете функцию кластеризации на уровне "Премиум", вы увидите RedisSessionStateProvider 2.0.1 (или более новую версию), либо будет создано исключение. Переход на версию 2.0.1 или более позднюю версию является критическим изменением.

Пакет NuGet поставщика состояний сеансов Redis имеет зависимость от пакета 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 — укажите конечную точку кэша.
  • порт — используйте порт, отличный от TLS/SSL, или порт TLS/SSL, в зависимости от настроек TLS.
  • accessKey — используйте для кэша первичный или вторичный ключ.
  • ssl — true, если вы хотите защитить кэш/клиентскую связь с помощью TLS; в противном случае — false. Обязательно укажите правильный порт.
    • Порт без TLS по умолчанию отключен для новых кэшей. Укажите true, чтобы этот параметр использовал порт TLS. Дополнительные сведения о включении порта без TLS см. в разделе Порты доступа статьи о настройке кэша.
  • 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 — этот параметр позволяет переопределить параметр connectTimeout в клиенте StackExchange.Redis. Если для параметра connectTimeout значение не указано, по умолчанию используется значение 5000. Дополнительную информацию см. в статье Модель конфигурации StackExchange.Redis.
  • operationTimeoutInMilliseconds — этот параметр позволяет переопределить параметр syncTimeout в клиенте StackExchange.Redis. Если значение не задано, для syncTimeout используется значение по умолчанию 1000. Дополнительную информацию см. в статье Модель конфигурации StackExchange.Redis.
  • redisSerializerType — этот параметр позволяет задать пользовательскую сериализацию содержимого сеанса, отправляемого в Redis. Указанный тип должен реализовывать Microsoft.Web.Redis.ISerializer и объявить общедоступный конструктор без параметров. По умолчанию используется System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.

Дополнительные сведения об этих свойствах см. в записи блога Объявление поставщика состояний сеансов ASP.NET для кэша Redis.

Не забудьте закомментировать раздел поставщика состояния стандартного InProc сеанса в конфигурации web.config.

<!-- <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 убедитесь, что типы данных, хранящиеся в состоянии сеанса, — сериализуемые.

Параметры состояния сеанса ASP.NET

  • Поставщик состояний сеансов в памяти сохраняет состояние сеанса в памяти. Преимущества использования этого поставщика заключаются в его простоте и скорости. Но если вы используете поставщик в памяти, вы не сможете масштабировать свои веб-приложения, так как поставщик не распределяется.
  • Поставщик состояний сеансов в базе данных SQL Server сохраняет состояние сеанса в базе данных SQL Server. Используйте этот поставщик, если требуется сохранять состояние сеанса в постоянном хранилище. Вы можете масштабировать свое веб-приложение, но использование SQL Server для сеанса может негативно повлиять на производительность веб-приложения. Кроме того, вы можете повысить производительность, применяя этот поставщик с конфигурацией выполняющейся в памяти OLTP.
  • Распределенный в памяти поставщик состояний сеансов, например поставщик состояний сеансов для кэша Azure для Redis, обладает преимуществами предыдущих двух поставщиков. Веб-приложение может использовать простой, быстрый и масштабируемый поставщик состояний сеансов. Этот поставщик сохраняет состояние сеанса в кэше, поэтому ваше приложение должно принимать в расчет все характеристики, связанные с распределенным кэшем в памяти, например временные неполадки в сети. Рекомендации по использованию кэша см . в руководстве по кэшированию из руководства по проектированию и реализации облачных приложений Azure.

Дополнительные сведения о состоянии сеанса и другие рекомендации см. в статье Рекомендации по веб-разработке (создание реальных облачных приложений с помощью Azure).

Сторонние поставщики состояния сеанса

Следующие шаги

Ознакомьтесь со статьей ASP.NET Output Cache Provider for Azure Cache for Redis (Поставщик кэша вывода ASP.NET для кэша Azure для Redis).