Один из наиболее распространенных вопросов при разработке приложений ASP.NET в Windows Azure — как управлять состоянием сеанса. Цель этой статьи — обсудить несколько вариантов управления состоянием сеанса для приложений ASP.NET в Windows Azure.
Что такое состояние сеанса?
Состояние сеанса обычно используется для хранения и извлечения значений для пользователя на страницах ASP.NET в веб-приложении. Существует четыре доступных режима хранения значений сеанса в ASP.NET:
- In-Proc, который хранит состояние сеанса в памяти отдельного веб-сервера. Это опция по умолчанию, если конкретный режим не указан явно.
- Сервер состояний, который хранит состояние сеанса в другом процессе, называемом службой состояний ASP.NET.
- SQL Server, который хранит состояние сеанса в базе данных SQL Server
- Пользовательский, который позволяет выбрать поставщика нестандартного хранилища.
Вы можете получить больше информации о состоянии сеанса ASP.NET здесь .
Сеанс In-Proc не работает в Windows Azure
Опция In-Proc, которая использует память отдельного веб-сервера, не работает в Windows Azure. Это может быть применимо для тех из вас, кто размещает ваше приложение в среде веб-фермы с несколькими экземплярами; Балансировщик нагрузки Windows Azure использует циклическое распределение между несколькими экземплярами.
Например: у вас есть три экземпляра (A, B и C) веб-роли. При первом запросе страницы балансировщик нагрузки выделяет экземпляр A для обработки вашего запроса. Однако нет гарантии, что экземпляр A всегда будет обрабатывать последующие запросы. Аналогично, значение, которое вы установили в памяти экземпляра A, не может быть доступно другим экземплярам.
На следующем рисунке показано, как работает состояние сеанса в нескольких экземплярах за балансировщиком нагрузки.
Рисунок 1 — WAPTK BuildingASP.NETApps.pptx Слайд 10
Другие варианты
1. Таблица хранения
Поставщик хранилища таблиц является подмножеством поставщиков Windows Azure ASP.NET, написанным группой разработчиков Windows Azure. Фактически поставщик сеансов хранилища таблиц — это пользовательский поставщик, который компилируется в библиотеку классов (файл .dll), позволяя разработчикам сохранять состояние сеанса в хранилище таблиц Windows Azure.
Как это работает на самом деле — хранить каждый сеанс в виде записи в Table Storage Каждая запись будет иметь столбец с истекшим сроком, который описывает время истечения каждого сеанса, если нет взаимодействия с пользователем.
Преимущество Table Storage Session Provider заключается в его относительно низкой стоимости: 0,14 долл. США за ГБ в месяц при емкости хранилища и 0,01 долл. США за 10 000 транзакций хранения . Тем не менее, согласно моему собственному опыту, одним из заметных недостатков провайдера сеансов хранения таблиц является то, что он может работать не так быстро, как другие варианты, описанные ниже.
Следующий фрагмент кода должен применяться в web.config при использовании поставщика хранилища таблиц.
<sessionState mode="Custom" customProvider="TableStorageSessionStateProvider"> <providers> <clear/> <add name="TableStorageSessionStateProvider" type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider" /> </providers> </sessionState>
Вы можете получить более подробную информацию об использовании Table Session Provider поэтапно здесь .
2. SQL Azure
Поскольку SQL Azure по сути является подмножеством SQL Server, SQL Azure также можно использовать в качестве хранилища для состояния сеанса. С помощью всего лишь нескольких модификаций поставщик сеансов SQL Azure можно получить из поставщика сеансов SQL Server .
При использовании поставщика сеансов SQL Azure вам потребуется применить следующий фрагмент кода в файле web.config:
<sessionState mode="SQLServer" sqlConnectionString="Server=tcp:[serverName].database.windows.net;Database=myDataBase;User ID=[LoginForDb]@[serverName];Password=[password];Trusted_Connection=False;Encrypt=True;" cookieless="false" timeout="20" allowCustomSqlDatabase="true" />
Для получения подробных сведений об использовании поставщика сеансов SQL Azure вы можете:
- Следуйте пошаговым инструкциям из этого поста .
- Или используйте универсальных провайдеров ASP.NET через Nuget .
Преимущество использования SQL Azure в качестве поставщика сеансов заключается в том, что он экономически эффективен, особенно если у вас есть база данных SQL Azure. Хотя в большинстве случаев он работает лучше, чем поставщик сеансов хранения таблиц, он требует, чтобы вы очистили истекший сеанс вручную, вызвав хранимую процедуру DeleteExpiredSessions. Еще одним недостатком использования SQL Azure в качестве поставщика сеансов является то, что Microsoft не предоставляет никакой официальной поддержки для этого.
3. Windows Azure Caching
Кэширование Windows Azure, вероятно, является наиболее предпочтительным вариантом на сегодняшний день. Он обеспечивает высокопроизводительный сервис распределенного кэширования в памяти. Поставщик состояния сеанса Windows Azure представляет собой механизм хранения вне процесса для приложений ASP.NET. Как мы все знаем, доступ к ОЗУ происходит намного быстрее, чем доступ к диску, поэтому Windows Azure Caching, очевидно, обеспечивает доступ с максимальной производительностью из всех доступных параметров.
Windows Azure Caching также поставляется с .NET API, который позволяет разработчикам легко взаимодействовать со службой кэширования. При использовании Cache Session Provider вы должны применить следующий фрагмент кода в web.config:
<sessionState mode="Custom" customProvider="AzureCacheSessionStoreProvider"> <providers> <add name="AzureCacheSessionStoreProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cacheName="default" useBlobMode="true" dataCacheClientName="default" /> </providers> </sessionState>
Пошаговое руководство по использованию службы кэширования в качестве поставщика сеансов можно найти здесь .
Помимо обеспечения высокопроизводительного доступа, еще одним преимуществом кэширования Windows Azure является то, что он официально поддерживается Microsoft. Несмотря на свои преимущества, плата за кэширование Windows Azure относительно высока: от 45 долларов в месяц за 128 МБ до 325 долларов в месяц за 4 ГБ .
Вывод
Я не обсуждал все доступные варианты управления состоянием сеанса в Windows Azure, но три из них, которые я обсудил, — это самые популярные варианты, и те, которые большинство людей рассматривают в качестве использования.
Кэширование Windows Azure остается рекомендуемым вариантом, несмотря на его недостатки, но разработчики и архитекторы не должны бояться выбирать другой вариант, если он более подходит для них в данном сценарии.