Общие сведения о состоянии приложения 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

Другие ресурсы

What's New in ASP.NET State Management