- •А.А. Волосевич
- •5.2. Веб-Приложение
- •5.3. Структура aspx-файла
- •1. Директивы страницы.
- •2. Серверные элементы управления и серверная форма.
- •5.4. Директивы страницы
- •5.5. Класс system.Web.Ui.Page
- •5.6. ЖИзненный цикл страницы
- •1. Подготовка страницы к выполнению
- •1.1. Событие PreInit
- •1.2. Событие Init
- •1.3. Событие InitComplete
- •1.4. Восстановление состояния представления
- •1.5. Обработка данных, принятых в результате возврата формы
- •1.6. Событие PreLoad
- •1.7. Событие Load
- •1.8. Обработка динамически созданных элементов управления
- •2. Обработка возврата формы
- •2.1. Обнаружение изменений в состоянии элементов управления
- •2.2. Обработка серверного события возврата формы
- •2.3. Событие LoadComplete
- •3.4. Генерирование разметки
- •3.5. Событие Unload
- •5.7. Общий обзор серверных элементов управления
- •5.8. Элементы управления html
- •5.9. Элементы управления web
- •5.10. Проверочные элементы управления
- •5.11. Эталонные страницы и темы
- •5.12. Некоторые приёмы работы со страницами
- •5.13. Связывание с данными
- •5.14. Списковые элементы управления
- •5.15. Элементы управления для Источников данных
- •5.16. Таблицы, связанные с данными
- •5.17. ОтоБражение отдельных записей
- •5.18. Конфигурирование веб-приложений
- •5.19. Инфраструктура обработки зАпроса
- •5.20. Веб-приложение и файл global.Asax
- •5.21. Модель поставщиков
- •5.22. Поддержка Сохранения Состояния
- •5.23. Кэширование в aSp.Net
- •5.24. Обеспечение безопасносТи в веб-приложениях
- •5.25. Управление членством и роЛями
- •5.26. Профили пользователя
- •5.27. Локализация и ресурсы
- •5.28. Пользовательские элементы управления
5.19. Инфраструктура обработки зАпроса
Рассмотрим стадии обработки клиентских запросов компонентами ASP.NET. Итак, пусть клиент направил запрос, URI которого определяет его как относящийся к ASP.NET. На сервере выполнятся следующие шаги.
Веб-сервер IIS на основании расширения URI принимает решение о вызове библиотеки aspnet_isapi.dll, написанной на обычном (не на управляемом) коде, и передаёт этой библиотеке данные запроса для обработки.
aspnet_isapi.dll запускает (при необходимости) рабочий процесс aspnet_wp.exe, написанный на управляемом коде.
В рамках aspnet_wp.exe вызывается статический метод HttpRuntime.ProcessRequest(), который становится ответственным за обработку запроса. В качестве параметра данный метод принимает объект класса HttpWorkerRequest, совмещающий как данные запроса, так и последующие данные ответа.
Порождается объект класса HttpContext, содержащий отдельные объекты для представления запроса, ответа, сессии и прочие. Подробнее класс HttpContext будет рассмотрен ниже.
Метод HttpApplication.GetApplicationInstance() порождает или возвращает существующий домен для веб-приложения. Дальнейшая работа происходит в рамках этого домена.
Срабатывает цепочка HTTP-модулей, являющихся перехватчиками отдельных событий запроса и (при сформированном ответе) ответа.
Порождается фабрикой классов или выбирается из списка зарегистрированный HTTP-обработчик. Его задача – обработать запрос в зависимости от конкретного расширения URI.
Данные, сформированные обработчиком, передаются в качестве ответа на сервер, отправляющий их клиенту.
Важную роль в процессе обработки HTTP-запроса играет объект класса HttpContext. Он выступает в роли своеобразного «клея», объединяющего все стадии запроса. Табл. 33 содержит описание свойств класса HttpContext.
Таблица 33
Свойства класса HttpContext
|
Свойство |
Описание |
|
AllErrors |
Массив объектов Exception, каждый из которых представляет ошибку, происходящую при выполнении запроса |
|
Application |
Экземпляр класса HttpApplicationState, содержащий глобальное совместно используемое состояние приложения |
|
ApplicationInstance |
Объект HttpApplicationдля текущего запроса, точнее, объект класса, определенного в файлеglobal.asax |
|
Cache |
Связанный с текущим запросом объект Cache |
|
Current |
Статическое свойство ‑ текущий объект HttpContext |
|
CurrentHandler |
Возвращает обработчик текущего запроса |
|
Error |
Возвращает первое исключение, сгенерированное при обработке текущего запроса |
|
Handler |
Возвращает и позволяет задать для текущего запроса обработчик HTTP |
|
IsCustomErrorEnabled |
Указывает, включена ли для текущего запроса пользовательская обработка ошибок |
|
IsDebuggingEnabled |
Указывает, выполняется ли запрос в режиме отладки |
|
Items |
Хэш-таблица, которая для модулей и обработчиков HTTP может служить средством совместного доступа к данным |
|
PreviousHandler |
Возвращает объект IHttpHandlerродительского обработчика |
|
Profile |
Объект, представляющий профиль текущего пользователя |
|
Request |
Экземпляр класса HttpRequest, представляющий текущий запрос HTTP |
|
Response |
Экземпляр класса HttpResponse, отправляющий клиенту данные ответа HTTP |
|
Server |
Экземпляр класса HttpServerUtility, предоставляющего вспомогательные методы для обработки запросов |
|
Session |
Экземпляр класса HttpSessionState, управляющий данными, связанными с конкретным сеансом |
|
SkipAuthorization |
Позволяет указать, должен ли модуль, осуществляющий авторизацию на основе URL, пропустить для текущего запроса этап авторизационной проверки. Свойство используется главным образом модулями аутентификации, которым нужно перенаправлять пользователя на страницу, с разрешённым анонимным доступом |
|
Timestamp |
Возвращает объект DateTime, представляющий начальный штамп времени текущего запроса |
|
Trace |
Объект TraceContextтекущего запроса |
|
User |
Объект IPrincipal, представляющий пользователя, от которого поступил запрос |
В ASP.NET программист может создавать собственные HTTP-обработчики, производящие непосредственную обработку запрашиваемых ресурсов с определенным расширением. Технически, HTTP-обработчик – это класс, реализующий интерфейс System.Web.IHttpHandler и зарегистрированный в инфраструктуре ASP.NET при помощи конфигурационных файлов.
В качестве примера рассмотрим создание обработчика, который будет перехватывать все запросы к страницам с расширением *.calc и выводить сумму двух чисел, переданных как параметры GET-запроса. Первое, что необходимо выполнить – написать класс с реализацией IHttpHandler. Интерфейс IHttpHandler содержит следующие элементы:
void ProcessRequest(HttpContext context) – в этом методе происходит обработка запроса и формирование ответа с использованием данных объекта context;
bool IsReusable { get; } – это свойство возвращает true, если один объект-обработчик можно использовать для нескольких запросов.
Наш обработчик будет реализован как класс CalcHandler, размещенный в сборке UserHandlers.dll.
// CalcUserHandler.cs file
using System;
using System.Web;
namespace UserHandlers
{
public class CalcHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
var objRequest = context.Request;
var result = Int32.Parse(objRequest.Params["p1"]) +
Int32.Parse(objRequest.Params["p2"]);
var objResponse = context.Response;
objResponse.Write("<html><body><h1>");
objResponse.Write(result.ToString());
objResponse.Write("</h1></body></html>");
}
public bool IsReusable
{
get { return true; }
}
}
}
Скомпилированную сборку UserHandlers.dll разместим в каталоге Bin некоего веб-приложения (в случае создания глобальных обработчиков следует использовать GAC).
Теперь зарегистрируем обработчик. Для этого используется секция <httpHandlers> в конфигурационных файлах. Секция может содержать элементы <add>, <remove> и <clear>. Атрибутами <add> являются:
verb – специфицирует глагол протокола HTTP. Можно указать несколько глаголов через запятую (GET, POST) либо использовать символ *;
path – отдельный файл или шаблон файлов (расширение), к которым применяется обработчик;
type – имя класса обработчика и имя сборки, в которой он находится.
Для регистрации нашего обработчика используется такой файл web.config:
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.calc"
type="UserHandlers.CalcHandler, UserHandlers"/>
</httpHandlers>
</system.web>
</configuration>
Кроме регистрации в конфигурационном файле, расширение .calc должно быть зарегистрировано в IIS, чтобы вызывалась aspnet_isapi.dll.
Альтернативный способ определения обработчика HTTP предполагает использование файла .ashx. Такой обработчик активизируется при получении запроса ресурса .ashx. Связь между обработчиком и ресурсом .ashx устанавливается в самом файле ресурса с помощью специальной директивы @WebHandler:
<%@ WebHandler Language="C#" Class="Handler" %>
При получении HTTP-запроса с указанием URL, соответствующего ресурсу .ashx, автоматически вызывается класс Handler. Ниже приведен пример содержимого файла .ashx. Как видите, это просто файл класса, в который добавлена директива @WebHandler.
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.Web;
public class Handler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
}
public bool IsReusable
{
get { return false; }
}
}
Когда для реализации обработчика HTTP используется ресурс .ashx, никакой дополнительной настройки для его инсталляции не требуется.
