Два перехватчика: HttpModule и HttpHandlers

ОГЛАВЛЕНИЕ

Часто необходимо реализовать логику предварительной обработки прежде, чем запрос достиг ресурсов IIS. Например, надо применить механизм защиты, замену URL, отфильтровать что-то в запросе и т. д. ASP.NET предоставляет два типа перехвата - HttpModule и HttpHandler.  Данная статья описывает их.

•    Скачать исходники и демо - 12.02 Кб

Задача

То и дело необходимо вставить какую-то логику перед запросом страницы. Часто используемой логикой предварительной обработки являются счетчики статистики, замена URL, аутентификация / авторизация и многие другие. Это можно делать в отделенном коде, но это приводит к сложному и запутанному коду. Отделенный код не решит задачу, потому что в ряде реализаций вроде авторизации логика должна выполняться до достижения ею ресурса. ASP.NET предоставляет два способа вставки логики в канал запроса - HttpHandlers и HttpModules.

HttpHandler – препроцессор на базе расширения

HttpHandler помогает вставить логику предварительной обработки на базе расширения запрошенного имени файла. Когда запрашивается страница, HttpHandler выполняется на базе расширения имени файла и на базе глагола. Рисунок ниже показывает, как разные обработчики увязаны с расширением файла. Можно увязать один обработчик с несколькими расширениями файлов. Например, когда любой клиент запрашивает файл с расширением ‘GIF’ и ‘JPEG’, выполняется логика предварительной обработки handler3.

HttpModule – препроцессор на базе события

HttpModule – метод вставки логики предварительной обработки перед запросом любого ресурса на базе события. Когда любой клиент отправляет запрос на ресурс, канал запроса порождает много событий, как показано на рисунке ниже:

Ниже дано подробное объяснение событий.
•    BeginRequest: Запрос был запущен. Если надо сделать что-то в начале запроса (например, отобразить рекламные баннеры вверху каждой страницы), синхронизируйте это событие.
•    AuthenticateRequest: Если надо встроить пользовательскую схему аутентификации (например, найти пользователя в базе данных для проверки пароля), постройте модуль, синхронизирующий это событие и аутентифицирующий пользователя нужным образом.
•    AuthorizeRequest: Это событие используется внутри для реализации механизмов авторизации (например, для хранения списков контроля доступа (ACL) в базе данных, а не в файловой системе). Хотя можно переопределить данное событие, для этого мало веских причин.
•    PreRequestHandlerExecute: Это событие происходит перед выполнением обработчика HTTP.
•    PostRequestHandlerExecute: Это событие происходит после выполнения обработчика HTTP.
•    EndRequest: Запрос завершился. Можно построить модуль отладки, собирающий информацию в течение всего запроса и затем выводящий информацию на страницу.

Можно зарегистрировать эти события в HttpModules. Когда выполняется канал запроса, в зависимости от зарегистрированного события, обрабатывается логика из модулей.

Общая картина обработчика и модулей

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

Ссылка: Информация: Обзор модулей HTTP и обработчиков HTTP ASP.NET

“Модули вызываются до и после выполнения обработчика. Модули позволяют разработчикам перехватить, участвовать в или изменить каждый отдельный запрос. Обработчики применяются для обработки отдельных запросов конечной точки. Обработчики позволяют каркасу ASP.NET обрабатывать отдельные HTTP URL или группы расширений URL внутри приложения. В отличие от модулей, только один обработчик используется для обработки запроса”.