Общие сведения о состоянии приложения ASP.NET
Обновлен: Ноябрь 2007
Состояние приложения является хранилищем данных, которые доступны всем классам в приложении ASP.NET. Состояние приложения хранится в памяти на сервере, и работа с ним выполняется быстрее, чем при хранении и извлечении информации из базы данных. В отличие от состояния сеанса, которое относится к сеансу одного пользователя, состояние приложения применяется ко всем пользователям и сеансам. Таким образом, состояние приложения является удобным местом для хранения часто используемых данных небольшого объема, которые не изменяются в зависимости от пользователя. Дополнительные сведения о сохранении данных для отдельных пользователей см. в разделах Общие сведения о состоянии сеанса ASP.NET и Общие сведения о свойствах профилей ASP.NET.
Использование состояния приложения
Состояние приложения хранится в экземпляре класса HttpApplicationState. Этот класс предоставляет словарь пар "ключ-значение" объектов.
Экземпляр HttpApplicationState создается при первом обращении пользователя к любому ресурсу URL в приложении. Чаще всего доступ к классу HttpApplicationState осуществляется с помощью свойства Application класса HttpContext.
Состояние приложения можно использовать двумя способами. Можно выполнять операции добавления и удаления значений или обращения к значениям коллекции Contents непосредственно через код. Обратиться к классу HttpApplicationState можно в любое время в течение жизненного цикла приложения. Однако оптимальнее загружать данные состояния приложения при запуске этого приложения. Для этого можно поместить код для загрузки состояния приложения в метод Application_Start файла Global.asax. Дополнительные сведения см. в разделе Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0.
Также можно добавить объекты в коллекцию StaticObjects, используя объявление <object runat="server"> в файле Global.asax веб-приложения. После этого к состоянию приложения, заданному таким образом, можно обратиться из кода в любом месте приложения. В примере далее показано объявление объекта для значения состояния приложения:
<object runat="server" scope="application" ID="MyInfo"
PROGID="MSWC.MYINFO">
</object>
Добавление объектов в коллекцию StaticObjects возможно только в файле Global.asax. При попытке добавления объектов непосредственно через код в коллекции возникает исключение NotSupportedException.
Получить доступ к элементам объектов, хранящимся в состоянии приложения, можно без обращения к коллекции Application. В следующем примере кода показано обращение к элементу объекта, заданному в коллекции состояния приложения StaticObjects:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
Label1.Text = MyInfo.Title
End Sub
protected void Page_Load(Object sender, EventArgs e)
Label1.Text = MyInfo.Title;
End Sub
Аспекты использования состояния приложения
При использовании состояния приложения необходимо помнить о следующих важных факторах:
Ресурсы Поскольку состояние приложения сохраняется в памяти, его работа отличается высокой скоростью по сравнению с сохранением данных на диск или в базу данных. Однако перемещение информации большого объема в состояние приложения может переполнить память сервера и приведет к переносу памяти на диск. Для хранения крупных блоков данных приложения можно использовать механизм кэширования ASP.NET вместо состояния приложения. Кэш ASP.NET также отличается высокой скоростью, благодаря сохранению данных в память; однако ASP.NET активно управляет кэшем и может удалять элементы при переполнении памяти. Дополнительные сведения см. в разделе Общие сведения о кэшировании в ASP.NET.
Изменчивость Поскольку состояние приложения сохраняется в памяти сервера, остановка или перезагрузка приложения могут привести к потере данных. Например, изменение файла Web.config приводит к перезагрузке приложения и утере состояния приложения. Этого можно избежать, записав значения состояния приложения в постоянную среду хранения, например, в базу данных.
Масштабируемость Состояние приложения не используется совместно несколькими серверами, обслуживающими одно и то же приложение (например, в веб-ферме), или в нескольких рабочих процессах, обслуживающих одно и то же приложение на базе одного сервера (например, в веб-саде). Следовательно, данные состояния приложения не являются едиными для различных серверов или процессов. Поэтому для обеспечения соответствия данных в рамках приложения, выполняемого в многопроцессорных или многосерверных средах, следует выбрать более масштабируемые решения хранения данных, как, например, базы данных.
Параллелизм Состояние приложения не зависит от потока, то есть доступ к данным состояния приложения можно получить одновременно из нескольких потоков. Следовательно, очень важно предотвратить возможность возникновения конфликтов между потоками, чего можно добиться с помощью встроенной поддержки синхронизации. Методы Lock и UnLock позволят обеспечить целостность данных, допуская единовременную запись данных только из одного источника. Избежать проблем с параллелизмом также может помочь инициализация значений состояния приложения, реализуемая с помощью метода Application_Start файла Global.asax. Дополнительные сведения см. в разделе Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0.
См. также
Задачи
Практическое руководство. Сохранение значений в состоянии приложения
Практическое руководство. Считывание значений из состояния приложения
Основные понятия
Общие сведения об управлении состоянием ASP.NET