Анатомия приложений ASP.NET
Служебные объекты ASP.NET
В некоторых ситуациях в процессе работы приложения требуется получать специфические данные о контексте исполнения. Например, необходимо работать с данными HTTP-запроса и HTTP-ответа, получать серверную информацию или оставлять отладочные данные. Обычно в других платформах для построения веб-приложений использовались переменные окружения. Для работы с этими данными в ASP.NET существует ряд служебных объектов ASP.NET, позволяющих выполнять указанные операции более удобно и безопасно.
Основными служебными объектами ASP.NET являются:
- HttpContext;
- Request;
- Response;
- Server;
- Trace.
Объект HttpContext является "входной точкой" для получения доступа ко всем остальным объектам. Фактически, через этот объект можно получить всю информацию о текущем контексте исполнения. Обычно объект HttpContext используется за пределами страницы, т.к. страница также позволяет получить доступ к этим объектам. Для того, чтобы получить доступ к текущему контексту достаточно обратиться к статическому свойству Current класса HttpContext: "HttpContext.Current". При получении доступа к текущему контексту становятся доступны все остальные объекты с одноименными названиями свойств.
Объекты Request и Response отвечают за содержимое HTTP-запроса и HTTP-ответа.
Объект Request содержит все параметры URL, HTTP-заголовки и другую информацию, отправляемую клиентом. Кроме того, в этом объекте инкапсулируется информация о браузере клиента.
Объект Response описывает HTTP-ответ, который впоследствии отправляется клиенту. Используя объект Response можно модифицировать HTTP-ответ – выставлять коды возврата, перенаправлять пользователя на другую страницу, задавать заголовки HTTP-ответа или просто формировать содержимое, которое будет отправлено клиенту. Для помещения данных в выходной буфер используется метод Write класса Response. Таким способом пользуются при разработке собственных элементов управления или HTTP-обработчиков.
Например, давайте создадим фрагмент кода, который считывает адрес, по которому обратился пользователь и количество HTTP-заголовков в HTTP-запросе и сохраним их в HTTP-заголовках HTTP-ответа. Для этого у объектов Request и Response существует коллекция Headers.
Этот пример показывает, каким образом можно работать с объектами Request и Response.
Объект Server предоставляет вспомогательные методы и свойства, необходимые для функционирования веб-приложения. Основные методы и свойства объекта Server:
MachineName | позволяет узнать имя компьютера; |
HtmlEncode() и HtmlDecode() | заменяет обычную строку строкой допустимых символов HTML, и наоборот; |
UrlEncode() и UrlDecode() | заменяет обычную строку строкой допустимых символов URL, и наоборот; |
MapPath() | преобразует относительный путь к файлу в рамках веб-приложения в абсолютный путь к файлу на диске (к примеру из "~/images/pic1.png" получается физический путь, например "C:\inetpub\wwwroot\images\pic1.png"); |
Transfer() | передает исполнение другой веб-странице в текущем приложении. |
Наконец объект Trace является универсальным объектом трассировки. Он позволяет записывать отладочную информацию в отладочный журнал на уровне страниц. Для отображения отладочной информации на уровне страницы необходимо задать значение атрибута Trace в директиве страницы равным значению True. Для этого необходимо открыть шаблон страницы (.aspx) и сделать необходимые изменения.
После выполнения этой операции при выполнении каждого запроса к этой странице после содержимого самой страницы будет отображаться отладочная информация. Пример отображения отладочной информации представлен ниже.
В составе этой отладочной информации содержится детальная информация о запросе, информация о трассировке, дерево элементов управления на странице, состояние сеанса (Session), состояние приложения (Application), содержание коллекции Cookie, HTTP-заголовки и другая полезная информация.
Также видно, что в рамках этой информации содержится раздел о выполняющихся событиях. Он позволяет отследить последовательность выполнения событий в рамках обработки запроса. Если нужно добавить свое событие в этот список, то можно воспользоваться объектом Trace. Для этих целей этот объект содержит два метода – Write и Warn. Оба этих метода добавят запись о своем выполнении. Отличие их состоит в том, что метод Write сделать обычную запись о выполнении события, а метод Warn также выделит эту запись красным шрифтом.
Например, можно написать следующий фрагмент кода, который добавляет информацию в список трассировки в момент создания объекта страницы и в момент обработки события Page Load.
Запустив страницу на исполнение при включенной трассировке можно увидеть следующий набор сообщений.
Таким образом, служебные объекты ASP.NET необходимы для получения и изменения служебной информации о текущем контексте исполнения.
Краткие итоги
В рамках среды исполнения ASP.NET существует ряд служебных объектов, которые позволяют получить доступ к различной служебной информации. К такой информации относятся данные об HTTP-запросе и HTTP-ответе, информация о сервере, трассировке и др. Доступ ко всем объектам можно получить либо через одноименные свойства страницы, либо через служебный объект HttpContext.
Зарезервированные папки
При разработке веб-приложения иногда требуется разместить специальные служебные файлы, которые не должны быть доступны для скачивания. Например, к таким файлам относятся файлы данных СУБД, файлы тем, файлы с программным кодом, файлы ресурсов и др. Если разместить подобные файлы за пределами папки с веб-приложением, то потребуется произвести ряд настроек для обеспечения прав доступа к этим папкам. Более того, такой подход не очень удобен с точки зрения администрирования такого приложения. Гораздо удобнее – размещать все необходимые файлы в папке с самим приложением. Однако, если пользователь будет иметь возможность скачать эти файлы по протоколу HTTP – это несомненная уязвимость в безопасности веб-приложения.
Для таких случаев можно создать специальные служебные папки в составе веб-приложения и запретить к ним доступ по протоколу HTTP. Это можно сделать, используя стандартные средства безопасности ASP.NET. Однако по неосторожности некоторые разработчики могут забыть это сделать, и это сделает приложение уязвимым (например, если пользователи скачают файл данных, потенциально они могут получить доступ к паролям всех пользователей веб-приложения). Поэтому в структуре проекта приложения ASP.NET существует ряд стандартных зарезервированных папок.
Зарезервированными папками являются обычные папки в составе проекта ASP.NET, которые, однако, имеют заранее предопределенные имена и содержат строго специфичную информацию. Основным отличием зарезервированных папок от остальных является невозможность загрузить их содержимое напрямую по протоколу HTTP.
К зарезервированным папкам относятся следующие папки:
Bin | содержит все предварительно скомпилированные сборки .NET, используемые web-приложением ASP.NET; |
App_Code | содержит файлы исходного кода, которые не соотносятся с конкретными страницами; |
App_GlobalResources | содержит файлы глобальных ресурсов, которые доступны всем страницам web-приложения; |
App_LocalResources | содержит файлы локальных ресурсов, которые специфичны для каждой страницы web-приложения; |
App_Data | содержит файлы данных. Например, файлы SQL Server, текстовые файлы, XML и проч.; |
App_Browsers | содержит определения браузеров, которые определяет разработчик конкретного web-приложения; |
App_Themes | содержит файлы тем для оформления сайта |
Для того, чтобы создать зарезервированную папку в составе проекта ASP.NET следует выбрать пункт меню "Add ASP.NET Folder" во всплывающем меню приложения.
После создания зарезервированной папки в структуре проекта ASP.NET, не требуется выполнять никаких дополнительных действий по ограничению доступа к этим папкам.
Краткие итоги
В структуре проекта ASP.NET можно создать ряд служебных папок, в которых будет содержаться информация служебного характера. К такой информации относятся файлы данных, программного кода, ресурсы, темы и др. Основным отличием зарезервированных папок является то, что их содержимое не доступно напрямую по протоколу HTTP.