Поделиться через


Общие сведения об обработчиках HTTP-данных и HTTP-модулях

Обновлен: Ноябрь 2007

Обработчик HTTP-данных ASP.NET — это процесс (часто называемый «конечной точкой»), который выполняется в ответ на запрос, сделанный веб-приложением ASP.NET. Наиболее часто используемым обработчиком является обработчик страниц ASP.NET, который обрабатывает ASPX-файлы. Когда пользователи запрашивают ASPX-файл, запрос обрабатывается на странице с помощью обработчика страниц. Можно создавать собственные обработчики HTTP-данных, с помощью которых в обозревателе отображаются пользовательские выходные данные.

HTTP-модуль — это сборка, вызываемая по каждому запросу к приложению. HTTP-модули вызываются как часть конвейера запросов ASP.NET и имеют доступ ко всем событиям жизненного цикла запроса. HTTP-модули позволяют проверять входящие и исходящие запросы и на их основе выполнять определенные действия.

В этом разделе рассматриваются следующие темы:

  • Сценарии

  • Свойства обработчиков HTTP-данных и HTTP-модулей

  • Базовые сведения

  • Примеры кода

  • Ссылка на классы

Сценарии

К типичным случаям использования обработчиков HTTP-данных относятся следующие:

  • Каналы RSS.   Чтобы создать RSS-канал для веб-узла, необходимо создать обработчик, создающий XML-файл, отформатированный с помощью RSS. Затем можно связать расширение имени файла, такое как RSS, с пользовательским обработчиком. Когда пользователи отправляют на веб-узел запрос, который имеет расширение RSS, для обработки запроса в ASP.NET вызывается обработчик.

  • Сервер изображений.   Если необходимо, чтобы в веб-приложении использовались изображения различных размеров, можно создать пользовательский обработчик для изменения размера изображений и отправки их пользователю в качестве ответа обработчика.

К типичным случаям использования HTTP-модулей относятся следующие:

  • Безопасность.   Поскольку выполняется проверка входящих запросов, HTTP-модуль может выполнить пользовательскую проверку подлинности или безопасности до вызова запрошенной страницы, веб-службы XML или обработчика. При выполнении IIS версии 7.0 в интегрированном режиме можно включить в проверку подлинности на основе форм все типы содержимого, используемые в приложении.

  • Статистика и ведение журнала.   Поскольку HTTP-модули вызываются для каждого запроса, можно собрать сведения о статистике и данные журнала в централизованный модуль вместо использования модулей для отдельных страниц.

  • Пользовательские заголовки и нижние колонтитулы.   Поскольку исходящий ответ может быть изменен, можно включить в каждую страницу или ответ веб-службы XML содержимое, такое как сведения о пользовательском заголовке.

К началу

Функциональные возможности

К функциональным возможностям обработчиков HTTP-данных и HTTP-модулей относятся следующие:

  • Интерфейсы IHttpHandler и IHttpModule являются отправной точкой для разработки обработчиков и модулей.

  • Интерфейс IHttpAsyncHandler является отправной точкой для разработки асинхронных обработчиков.

  • Исходный код для пользовательского обработчика и модуля может находиться в папке App_Code приложения, или его можно скомпилировать и поместить в папку Bin приложения.

  • Обработчики и модули, разработанные для использования в IIS 6.0, могут быть использованы в IIS 7.0 с незначительными изменениями или без таковых. Дополнительные сведения см. в разделе Перемещение приложения ASP.NET из IIS 6.0 в IIS 7.0

  • Модули могут подписываться на различные уведомления конвейера запросов. Они могут получать уведомления о событиях объекта HttpApplication.

  • В IIS 7.0 конвейер запросов встроен в конвейер запросов веб-сервера. Можно использовать HTTP-модули для выполнения любых запросов к веб-серверу, а не только запросов ASP.NET.

К началу

Базовые сведения

Обработчики HTTP-данных

Обработчик HTTP-данных ASP.NET – это процесс, который выполняется в ответ на запрос к веб-приложению ASP.NET. Наиболее часто используемым обработчиком является обработчик страниц ASP.NET, который обрабатывает ASPX-файлы. Когда пользователи запрашивают ASPX-файл, запрос обрабатывается с помощью обработчика страниц.

Обработчик страниц ASP.NET является всего лишь одним из типов обработчиков. В ASP.NET включено несколько других встроенных обработчиков, таких как обработчик веб-служб для ASMX-файлов.

Встроенные обработчики HTTP-данных в ASP.NET

В ASP.NET HTTP-запросы сопоставляются с обработчиками HTTP-данных на основе расширения имени файла. Каждый обработчик HTTP-данных может обрабатывать отдельные URL-адреса HTTP-данных или группы расширений для URL-адресов, используемых в приложении. В ASP.NET включено несколько встроенных обработчиков HTTP-данных, перечисленных в следующей таблице.

Обработчик

Описание

Обработчик страниц ASP.NET (ASPX)

Обработчик HTTP-данных для всех страниц ASP.NET, используемый по умолчанию.

Обработчик веб-служб (ASMX)

Используемый по умолчанию обработчик HTTP-данных для страниц веб-служб, созданных как ASMX-файлы в ASP.NET.

Универсальный обработчик веб-файлов (ASHX)

Используемый по умолчанию обработчик HTTP-данных для всех веб-обработчиков, не имеющих пользовательского интерфейса, содержащий директиву @ WebHandler.

Обработчик трассировки (Trace.axd)

Обработчик, отображающий сведения о трассировке текущей страницы. Дополнительные сведения см. в разделе Практическое руководство. Просмотр сведений о трассировке ASP.NET c помощью средства просмотра трассировки.

Создание пользовательского обработчика HTTP-данных

Чтобы создать пользовательский обработчик HTTP-данных, следует создать класс, реализующий интерфейс IHttpHandler, для создания синхронного обработчика. Также можно реализовать интерфейс IHttpAsyncHandler для создания асинхронного обработчика. Для обоих интерфейсов обработчиков необходимо реализовать свойство IsReusable и метод ProcessRequest. Свойство IsReusable указывает, следует ли объекту IHttpHandlerFactory (который фактически вызывает необходимый обработчик) поместить обработчик в пул и многократно использовать его для повышения производительности. Если обработчик не может быть помещен в пул, фабрика должна создавать новый экземпляр обработчика каждый раз при возникновении необходимости в его использовании.

Метод ProcessRequest отвечает за обработку отдельных HTTP-запросов. В этом методе создается код, создающий выходные данные для обработчика.

Обработчики HTTP-данных имеют доступ к контексту приложения. К нему относится удостоверение пользователя (если известно), состояние приложения и сведения о сеансе. При запросе обработчика HTTP-данных в ASP.NET вызывается метод ProcessRequest соответствующего обработчика. Код, созданный в методе ProcessRequest обработчика, создает ответ, который отправляется создавшему запрос обозревателю.

Сопоставление расширения имени файла

Когда создается файл класса в качестве обработчика HTTP-данных, обработчик может создавать ответы для запросов с любыми расширениями имени файлов, которые еще не сопоставлены в IIS и ASP.NET. Например, если обработчик HTTP-данных создается для создания RSS-канала, можно сопоставить его с расширением имени RSS-файла. Чтобы ASP.NET было известно, какой обработчик использовать для пользовательского расширения имени файла, необходимо в IIS сопоставить расширение ASP.NET. Затем необходимо в приложении сопоставить расширение пользовательскому обработчику.

По умолчанию расширение имени файла ASHX в ASP.NET сопоставляется с обработчиком HTTP-данных. Если добавить директиву @ WebHandler в файл класса, расширение имени ASHX-файла в ASP.NET будет автоматически сопоставлено обработчику HTTP-данных, используемому по умолчанию. Аналогичным образом расширение имени ASPX-файла в ASP.NET сопоставляется с обработчиком страниц ASP.NET при использовании директивы @ Page. Поэтому при создании класса обработчика HTTP-данных, который имеет расширение ASHX, обработчик автоматически регистрируется в IIS и ASP.NET.

Если необходимо создать пользовательское расширение имени файла, необходимо явно зарегистрировать расширение в IIS и ASP.NET. Преимуществом использования расширения имени файла, отличного от ASHX, является то, что впоследствии обработчик с другим расширением может быть многократно использован для различных сопоставлений расширения. Например, в одном приложении пользовательский обработчик может создавать ответы на запросы с расширением RSS. В другом приложении он может отвечать на запросы с расширением FEED. Еще одним примером является возможность сопоставления обработчика обоим расширениям имени файла в одном приложении и создания при этом различных ответов в зависимости от используемого расширения.

Регистрация пользовательского расширения имени файла для обработчика различается в IIS 7.0 и более ранних версиях IIS. Дополнительные сведения см. в разделах Практическое руководство. Регистрация обработчиков HTTP-данных и Практическое руководство. Настройка расширений для обработчиков HTTP-данных в IIS.

Асинхронные и синхронные обработчики HTTP-данных

Обработчик HTTP-данных может быть как синхронным, так и асинхронным. Синхронный обработчик не выполняет возврата до тех пор, пока не завершена обработка того HTTP-запроса, для которого он был вызван. Асинхронный обработчик выполняет процесс независимо от отправки ответа пользователю. Асинхронные обработчики следует использовать, если необходимо запустить процесс приложения, который может выполняться в течение длительного времени, а пользователю необходимо получить ответ с сервера до завершения этого процесса.

Асинхронные обработчики HTTP-данных позволяют запустить внешний процесс, например вызов метода на удаленном сервере. При этом обработчик продолжит обработку, не дожидаясь завершения внешнего процесса. Пока асинхронный обработчик HTTP-данных выполняет обработку, ASP.NET помещает поток, который будет использоваться для внешнего процесса, обратно в пул потоков до тех пор, пока обработчик не получит обратный вызов из внешнего процесса. Это предотвращает блокировку потоков и может повысить производительность, поскольку в одно и то же время может выполняться только ограниченное число потоков. Если сразу много пользователей запросят синхронные HTTP-обработчики, зависящие от внешних процессов, в операционной системе могут быстро закончиться свободные потоки, поскольку многие из них будут находиться в состоянии блокировки или ожидания внешнего процесса.

При создании асинхронного обработчика необходимо реализовать интерфейс IHttpAsyncHandler. Также необходимо реализовать метод BeginProcessRequest, чтобы инициировать асинхронный вызов для обработки отдельных HTTP-запросов. Кроме того, необходимо реализовать метод EndProcessRequest для выполнения кода очистки после завершения процесса.

Пользовательские классы IHttpHandlerFactory

Класс IHttpHandlerFactory получает запросы и отвечает за пересылку запроса соответствующему обработчику HTTP-данных. Можно создать фабрику обработчиков HTTP-данных путем создания класса, реализующего интерфейс IHttpHandlerFactory. Фабрика пользовательских обработчиков предоставляет возможность более точного управления HTTP-запросами путем создания различных обработчиков в зависимости от условий времени выполнения. Например, с помощью фабрики пользовательских обработчиков можно создать один обработчик HTTP-данных для типа файлов, если при HTTP-запросе используется метод PUT, и второй — при использовании метода GET.

Чтобы зарегистрировать пользовательское расширение для фабрики обработчиков, следует выполнить действия для регистрации пользовательского расширения для обработчика. Пример создания и регистрации фабрики обработчиков см. в разделе Пошаговое руководство. Создание и регистрация фабрик обработчиков HTTP-данных.

HTTP-модули

HTTP-модуль — это сборка, вызываемая по каждому запросу к приложению. HTTP-модули вызываются как часть конвейера запросов и имеют доступ ко всем событиям жизненного цикла запроса. Таким образом, HTTP-модули позволяют проверять входящие запросы и на их основе выполнять определенные действия. Они также позволяют выполнять проверку исходящих ответов и изменять их.

В IIS 6.0 конвейер запросов ASP.NET не является частью конвейера запросов веб-сервера. В IIS 7.0 конвейер запросов ASP.NET и конвейер запросов веб-сервера могут быть интегрированы в единый конвейер запросов. В IIS 7.0 это называется интегрированным режимом. Интегрированный конвейер имеет несколько преимуществ для разработчиков ASP.NET. Например, он позволяет модулям управляемого кода получать уведомления конвейера для всех запросов, даже если запрашиваются не ресурсы ASP.NET. При желании можно запустить IIS 7.0 в классическом режиме, эмулирующем запуск ASP.NET в IIS версии 6.0. Дополнительные сведения см. в разделе Общие сведения о жизненном цикле приложения ASP.NET для служб IIS 7.0.

HTTP-модули ASP.NET функционируют аналогично фильтрам ISAPI, поскольку они вызываются для всех запросов. Однако они записываются в управляемый код и полностью интегрируются в жизненный цикл приложения ASP.NET. Можно поместить исходный код пользовательского модуля в папку App_Code приложения или поместить скомпилированные пользовательские модули в качестве сборок в папку Bin приложения.

В ASP.NET модули используются для реализации различных функций приложения, к которым относятся службы проверки подлинности на основе форм, кэширования, состояния сеанса и клиентских сценариев. В каждом из этих случаев, когда эти службы включены, модуль вызывается как часть запроса и выполняет задачи за пределами области действия запроса единичной страницы. Модули могут использовать события приложения и вызывать события, которые могут обрабатываться в файле Global.asax. Дополнительные сведения о событиях приложений см. в разделах Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0 и Общие сведения о жизненном цикле приложения ASP.NET для служб IIS 7.0.

Bb398986.alert_note(ru-ru,VS.90).gifПримечание.

HTTP-модули отличаются от обработчиков HTTP-данных. Обработчик HTTP-данных возвращает ответ на запрос, определяемый с помощью расширения имени файла или семейства расширений имен файлов. Напротив, HTTP-модуль вызывается для всех запросов и ответов. Он подписывается на уведомления событий в конвейере запросов и позволяет выполнять код в зарегистрированных обработчиках событий. Задачи, для выполнения которых используется модуль, являются общими для приложения и для всех запросов ресурсов в приложении.

Функционирование HTTP-модулей

Для получения уведомлений от конвейера запросов модули должны быть зарегистрированы. Чаще всего HTTP-модуль регистрируется в файле конфигурации приложения (Web.config). В IIS 7.0 интегрированный конвейер запросов позволяет регистрировать модуль другими способами, к которым относится регистрация с помощью IIS Manager и инструмента командной строки Appcmd.exe. Дополнительные сведения см. в статье IIS 7.0. Настройка модулей в IIS 7.0 и IIS 7.0. Запуск Appcmd.exe библиотеки Майкрософт.

Когда в ASP.NET создается экземпляр класса HttpApplication, представляющего приложение, также создаются экземпляры зарегистрированных модулей. При создании модуля вызывается его метод Init и выполняется самоинициализация модуля. Дополнительные сведения см. в разделах Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0 и Общие сведения о жизненном цикле приложения ASP.NET для служб IIS 7.0.

В методе Init модуля можно подписаться на различные события приложения, например BeginRequest или EndRequest, путем привязки событий к методам в модуле.

Bb398986.alert_note(ru-ru,VS.90).gifПримечание.

Для модулей, которые используются в интегрированном конвейере IIS 7.0, следует регистрировать обработчики событий в методе Init.

При возникновении событий приложения вызывается соответствующий метод в модуле. Метод может выполнить любой необходимый алгоритм, например проверку сведений в запросах проверки подлинности или выполнения операций с журналом. При обработке событий модулю доступно свойство Context текущего запроса. Оно позволяет перенаправлять запрос на альтернативную страницу, изменять запрос или выполнять другие операции с запросами. Например, если модуль выполняет проверку подлинности, в случае ввода неверных учетных данных он может перенаправить запрос на страницу входа или ошибки. В противном случае, если обработчик событий модуля завершает обработку, ASP.NET вызывает следующий процесс в конвейере. Им может быть другой модуль или соответствующий обработчик HTTP-данных (таких как файлы ASPX) для запроса.

HTTP-модули или файлы Global.asax

Большинство функциональных возможностей модуля можно реализовать с помощью файла Global.asax приложения, который позволяет создавать ответы на события приложения. Однако модули имеют преимущество перед файлом Global.asax, поскольку они инкапсулируются и, будучи однажды созданными, могут использоваться во многих различных приложениях. Добавив модуль в глобальный кэш сборок и зарегистрировав их в файле Machine.config, можно многократно использовать их в различных приложениях. Дополнительные сведения см. в разделе Глобальный кэш сборок.

Bb398986.alert_note(ru-ru,VS.90).gifПримечание.

В IIS 7.0 интегрированный конвейер позволяет управляемым модулям подписываться на уведомления конвейера для всех запросов, а не только запросов ресурсов ASP.NET. Обработчики событий в файле Global.asax вызываются только для уведомлений, возникающих во время запроса ресурсов в приложении. Пользовательские модули в интегрированном режиме получают уведомления только для запросов к приложению. В остальных случаях пользовательские модули могут получать уведомления для всех запросов к приложению. Если атрибут precondition элемента add раздела modules установлен в значение «managedHandler», областью действия модуля будет являться приложение.

Преимущество использования файла Global.asax состоит в том, что можно обрабатывать другие зарегистрированные события, такие как Session_Start и Session_End. Кроме того, файл Global.asax позволяет создавать экземпляры глобальных объектов, доступных всему приложению.

Следует использовать модуль каждый раз, когда необходимо создать код, зависимый от событий приложения, и при выполнении следующих условий:

  • Необходимо использовать модуль многократно в других приложениях.

  • Необходимо избежать помещения сложного кода в файл Global.asax.

  • Модуль применяется ко всем запросам в контейнере (только в интегрированном режиме IIS 7.0).

Следует добавлять код в файл Global.asax каждый раз, когда необходимо создать код, зависимый от событий приложения, и нет необходимости многократно использовать его в различных приложениях. Также можно использовать файл Global.asax, если необходимо подписаться на события, недоступные модулям, например Session_Start.

Создание HTTP-модуля

Общая процедура написания HTTP-модуля выглядит следующим образом:

  • Создайте класс, реализующий интерфейс IHttpModule.

  • Создайте обработчик для метода Init. С помощью метода инициализации можно выполнить инициализацию модуля и подписать его на все необходимые события приложения. Например, чтобы присоединить что-либо к ответу, следует подписаться на событие EndRequest. Чтобы выполнить пользовательский алгоритм проверки подлинности, следует подписаться на событие AuthenticateRequest. Дополнительные сведения о событиях приложений см. в разделе Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0.

  • Создайте код для событий, на которые была выполнена подписка.

  • Дополнительно можно реализовать метод Dispose, если для модуля требуется очистка.

  • Зарегистрируйте модуль в файле конфигурации Web.config. Дополнительные сведения см. в разделе Пошаговое руководство. Создание и регистрация пользовательского HTTP-модуля.

Сведения о перемещении модуля из приложения, выполняющегося в IIS 6.0 или более ранних версий, в приложение, выполняющееся в IIS 7.0, см. в разделе Перемещение приложения ASP.NET из IIS 6.0 в IIS 7.0.

К началу

Примеры кода

Примеры начального уровня

Фабрики и обработчики HTTP-данных

Практические и пошаговые руководства

Практическое руководство. Регистрация обработчиков HTTP-данных

Практическое руководство. Настройка расширений для обработчиков HTTP-данных в IIS

Пошаговое руководство: создание синхронного обработчика HTTP

Пошаговое руководство. Создание асинхронного обработчика HTTP-данных

Пошаговое руководство. Создание и регистрация фабрик обработчиков HTTP-данных

Пошаговое руководство. Создание и регистрация пользовательского HTTP-модуля

К началу

Ссылки на классы

В следующей таблице перечислены ключевые серверные классы для HTTP-модулей и обработчиков HTTP-данных.

Класс

Описание

IHttpModule

Используется для создания пользовательского HTTP-модуля путем реализации интерфейса и регистрации модуля в файле конфигурации Web.config.

IHttpHandler

Используется для создания пользовательского синхронного обработчика HTTP-данных путем создания класса, реализующего интерфейс.

IHttpAsyncHandler

Используется для создания пользовательского асинхронного обработчика HTTP-данных путем создания класса, реализующего интерфейс.

К началу

См. также

Основные понятия

Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0

Общие сведения о жизненном цикле приложения ASP.NET для служб IIS 7.0

Ссылки

К началу