Модель приложения ASP.NET

137

Различие, существующее между приложениями 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.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 предлагает несколько каталогов специального назначения:

Специальные каталоги 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 В этом каталоге хранятся темы, которые могут использоваться в данном веб-приложении.
Пройди тесты
Лучший чат для C# программистов