Модель приложения ASP.NET
137ASP.NET --- Основы ASP.NET --- Модель приложения ASP.NET
Различие, существующее между приложениями ASP.NET и многофункциональными клиентскими приложениями, обретает большой смысл при анализе модели выполнения ASP.NET. В отличие от приложений для Windows, конечный пользователь никогда не запускает приложение ASP.NET напрямую. Наоборот, пользователь запускает браузер и запрашивает определенный URL-адрес (такой как http://www.mysite.com/mypage.aspx) через HTTP. Этот запрос получает веб-сервер. В процессе отладки приложения в Visual Studio используется только локальный тестовый сервер. В процессе развертывания приложения применяется веб-сервер IIS.
Веб-сервер не имеет понятия об отдельно существующих приложениях — он просто передает запрос рабочему процессу ASP.NET. Однако рабочий процесс ASP.NET тщательно разделяет выполнение кода в различные домены приложений на основе виртуального каталога. Веб-страницы, которые находятся в одном и том же виртуальном каталоге (или в одном из его подкаталогов), выполняются в одном и том же домене приложения. Веб-страницы из разных виртуальных каталогов выполняются в разных доменах приложений.
Домен приложения
Домен приложения — это устанавливаемая средой CLR граница, которая гарантирует, что одно приложение не сможет влиять на другое приложение (или видеть хранящиеся в его памяти данные). Следующие характеристики являются прямым следствием модели домена приложения:
Все веб-страницы в одном веб-приложении совместно используют одни и те же ресурсы, находящиеся в памяти — глобальные данные приложения, данные сеансов отдельных пользователей, а также кэшированные данные. Эта информация не доступна напрямую, другим приложениям ASP.NET или ASP.
Все веб-страницы в одном веб-приложении совместно используют одни и те же основные конфигурационные настройки. Однако можно настраивать некоторые параметры конфигурации в отдельных подкаталогах одного и того же виртуального каталога. Например, можно установить только один механизм аутентификации для веб-приложения, независимо от того, какое количество подкаталогов в нем имеется.
С другой стороны, в каждом каталоге могут быть предусмотрены различные правила авторизации, чтобы в точности определить, кому будет разрешен доступ к различным группам страниц.
Все веб-приложения генерируют глобальные события приложений на различных стадиях (когда домен приложения создается в первый раз, когда он уничтожается, и т.д.). С помощью кода в файле global.asax, расположенном в виртуальном каталоге приложения, можно присоединять обработчики событий, которые будут реагировать на эти глобальные события приложений.
Другими словами, виртуальный каталог является базовой групповой структурой, определяющей границы приложения ASP.NET. Допустимое приложение ASP.NET вполне может содержать единственную веб-форму (файл .aspx). Однако в принципе каждое приложение ASP.NET может включать все перечисленные ниже компоненты:
- Веб-формы (файлы .aspx)
Эти компоненты являются основополагающими в любом приложении ASP.NET.
- Мастер-страницы (файлы .master)
Эти компоненты представляют собой шаблоны, которые позволяют строить множество веб-форм с одинаковой структурой.
- Веб-службы (файлы .asmx)
Эти компоненты позволяют совместно использовать полезные функции приложениями, которые расположены на других компьютерах и платформах.
- Файлы отделенного кода
В зависимости от используемой модели кода, также могут присутствовать и отдельные файлы исходного кода. Если эти файлы содержат код на языке C#, то они имеют расширение .cs.
- Конфигурационный файл (web.config)
В этом файле содержится множество параметров уровня приложения, которые отвечают за настройку всех аспектов, начиная с безопасности и заканчивая отладкой и управлением состоянием.
- Файл Global.asax
В этом файле содержатся обработчики событий, реагирующие на глобальные события приложения (такие как его первый запуск).
- Другие компоненты
К их числу относятся скомпилированные сборки, в которых содержатся либо отдельные компоненты, разработанные вами, либо компоненты сторонних поставщиков, имеющие полезную функциональность. Эти компоненты позволяют отделять бизнес-логику от логики доступа к данным и создавать специальные элементы управления.
Естественно, виртуальный каталог может содержать большое количество дополнительных ресурсов, которые будут использоваться веб-приложениями ASP.NET, включая таблицы стилей, изображения, XML-файлы и т.д. Вдобавок вы можете расширять модель ASP.NET, разрабатывая специализированные компоненты — обработчики HTTP и модули HTTP, которые могут встраиваться в приложение и принимать участие в обработке веб-запросов ASP.NET.
В одном и том же виртуальном каталоге вполне могут храниться файлы разных типов, принадлежащие разным обработчикам. В качестве простого примера можно привести ситуацию со смешиванием файлов .aspx и .asp. В более сложном примере среда ASP.NET 4 может быть сконфигурирована на обработку запросов к файлам .aspx, a ASP.NET 3.5 — на обработку запросов к файлам с каким-то другим расширением.
Время жизни приложения
Для создания доменов приложений ASP.NET использует технологию отложенной, или "ленивой" инициализации (lazy initialization). Это означает, что домен для веб-приложения создается при первом получении запроса на страницу в этом приложении.
Работа домена приложения может завершаться по разным причинам, в том числе и по причине завершения работы самого веб-сервера. Но, как правило, приложения самостоятельно перезапускаются в новых доменах приложений в ответ на ошибки либо изменения в конфигурации.
В случае изменения приложения среда ASP.NET автоматически обновляет домены приложений. Одним из примеров может быть модификация файла web.config. Другой пример — замена существующего файла веб-страницы или DLL-файла сборки. В обоих этих случаях ASP.NET запускает новый домен приложения для обработки всех будущих запросов и сохраняет существующий домен приложения в рабочем состоянии до тех пор, пока не завершится обработка всех незаконченных запросов (включая те, что находятся в очереди).
Сравнение доменов приложений и пулов приложений
В IIS поведение веб-приложений конфигурируется с помощью пулов приложений. Параметры пула приложений определяют версию .NET, которую должно получить приложение, сколько оно может оставаться в бездействии, прежде чем завершится, должно ли оно перезапускаться автоматически при возникновении определенных ошибок, и т.д.
Концепция пула приложений подобна понятию доменов приложений, но является немного более широкой. Отличие состоит в следующем. Каждый пул приложений IIS может конфигурировать одно или более веб-приложений. Во время выполнения каждое веб-приложение обычно состоит из одного домена приложения. Формально пулы приложений являются конфигурационным средством IIS, a домены приложений — частью инфраструктуры .NET.
Обновление приложений
Одной из наиболее примечательных особенностей модели выполнения ASP.NET является то, что она позволяет обновлять веб-приложение, не перезапуская веб-сервер и не беспокоясь о том, что это может причинить вред существующим клиентам. Это означает, что файлы в виртуальном каталоге могут заменяться, добавляться и удаляться в любое время. ASP.NET затем выполняет точно такой же переход на новый домен приложения, как и в случае изменения конфигурационного файла web.config.
Возможность обновлять любую часть приложения в любое время, не прерывая выполнение существующих запросов, является мощным средством. Однако важно понимать, что именно в архитектуре ASP.NET делает это доступным. Многие разработчики ошибочно предполагают, что плавно переходить на новый домен приложения ASP.NET позволяет среда CLR. Но на самом деле CLR-среда всегда блокирует файлы сборок, когда выполняет их.
Чтобы обойти это ограничение, ASP.NET не использует сами файлы ASP.NET, находящиеся в виртуальном каталоге. Вместо этого во время компиляции она применяет прием, который называется теневым копированием (shadow copy), и создает копии всех файлов в каталоге c:\Windows\Microsoft.NET\Framework\[версия]\Temporary ASP.NET Files. Рабочий процесс ASP.NET загружает сборки из этого каталога, а это означает, что заблокированными будут именно эти сборки.
Второй примечательной особенностью является способность ASP.NET обнаруживать изменения в исходных файлах. Здесь все довольно понятно — ASP.NET просто полагается на возможность операционной системы Windows отслеживать каталоги и файлы и отправлять немедленные уведомления об изменениях. ASP.NET поддерживает активный список всех сборок, загруженных в домен конкретного приложения, и использует код мониторинга для наблюдения за изменениями и выполнения соответствующих действий.
ASP.NET может использовать файлы, хранящиеся в глобальном кэше сборок (Global Assembly Cache — GAC), который представляет собой доступное в пределах компьютера хранилище и содержит все основные ингредиенты, такие как сборки для библиотеки классов .NET Framework. В GAC можно помещать и собственные сборки, но это обычно усложняет развертывание и управление веб-приложениями.
Структура каталогов приложения
Каждое веб-приложение должно иметь хорошо продуманную структуру каталогов. Какую бы структуру каталогов не проектировал разработчик, ASP.NET предлагает несколько каталогов специального назначения:
Каталог | Описание |
---|---|
Bin | В этом каталоге содержатся все заранее скомпилированные сборки .NET (обычно имеющие вид DLL-файлов), которые использует данное веб-приложение ASP.NET. В число этих сборок
могут входить как предварительно скомпилированные классы веб-страниц, так и другие сборки, на которые ссылаются эти классы. Если для разработки веб-приложения в Visual Studio используется модель с проектом, а не более распространенная модель веб-сайта, в каталоге Bin будет также содержаться сборка со скомпилированным кодом всего веб-приложения. Эта сборка имеет такое же, как у приложения имя, например WebApplication1.dll. |
App_Code | В этом каталоге содержатся файлы исходного кода, которые динамически компилируются для использования в данном приложении. Эти файлы кода обычно подставляют собой отдельные компоненты, такие как компонент для входа в систему или библиотека доступа к данным. Динамически компилируемый код никогда не появляется в каталоге Bin, поскольку ASP.NET помещает его во временные каталоги, предназначенные специально для этих целей. |
App_GlobalResources | В этом каталоге хранятся глобальные ресурсы, которые доступны для каждой страницы в данном веб-приложении. |
App_LocalResources | Этот каталог служит той же цели, что и каталог Арр_GlobalResources, но только содержащиеся в нем ресурсы доступны лишь тем страницам в приложении, для которых они специально предназначены. |
App_WebReferences | В этом каталоге хранятся ссылки на веб-службы, которые использует данное веб-приложение, включая файлы WSDL и документы обнаружения. |
App_Data | Этот каталог предназначен для хранения данных, включая файлы базы данных SQL Server Express и файлы XML. Разумеется, файлы данных можно сохранять в других каталогах. |
App_Browsers | В этом каталоге содержатся определения браузеров, хранящиеся в XML-файлах. Эти XML-файлы определяют возможности клиентских браузеров по выполнению различных действий, связанных с визуализацией. Хотя ASP.NET делает это глобально (по всему компьютеру), каталог App_Browsers позволяет конфигурировать данное поведение для отдельных веб-приложений. |
App_Themes | В этом каталоге хранятся темы, которые могут использоваться в данном веб-приложении. |