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


Проектирование Native-Code http-модулей

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

Требования к Native-Code модулям HTTP

Добавление экспортируемой функции регистрации

Для экспорта функции RegisterModule требуются http-модули. Эту функцию можно экспортировать, создав файл определения модуля (DEF) для проекта, или скомпилировать модуль с помощью параметра /EXPORT:RegisterModule .

Указание уведомлений и приоритета модуля

При создании RegisterModule функции вы указываете битовую маску, содержащую список уведомлений, которые будет обрабатывать модуль уровня запроса (дополнительные сведения см. в разделе Константы обработки запросов). Например, модуль уровня запроса может указать, что он будет предоставлять методы обработки уведомления RQ_BEGIN_REQUEST и RQ_MAP_PATH после уведомления. Аналогичным образом модуль глобального уровня может указать, что он будет предоставлять методы для обработки GL_APPLICATION_START и уведомлений GL_APPLICATION_STOP .

Функция RegisterModule также позволяет указать приоритет для модуля. Доступные приоритеты: PRIORITY_ALIAS_FIRST, PRIORITY_ALIAS_HIGH, PRIORITY_ALIAS_MEDIUM, PRIORITY_ALIAS_LOWи PRIORITY_ALIAS_LAST. При регистрации модули обрабатываются в порядке приоритета и параметров конфигурации. Например, если вы создаете модуль HTTP, который регистрируется как модуль со средним приоритетом, модуль не будет обработан до тех пор, пока не будут обработаны все высокоприоритетные модули. Вы можете настроить модуль для обработки перед другими модулями со средним приоритетом, а модуль будет обрабатываться перед модулями с низким приоритетом.

Примечание

Порядок уровней приоритета инвертируется для RQ_SEND_RESPONSE уведомлений.

Создание модулей Request-Level

Создание фабрики модулей

Модули уровня запросов машинного кода должны предоставлять фабрику модулей, которая создает экземпляр класса CHttpModule . Фабрика модулей наследуется от интерфейса IHttpModuleFactory .

Дополнительные сведения о создании фабрики модулей см. в примере кода статьи Пошаговое руководство. Создание Request-Level HTTP-модуля с помощью машинного кода.

Создание класса, производного от CHttpModule

Функциональность обработки main для http-модулей уровня запроса предоставляется через модуль, производный от базового CHttpModule класса. Этот класс должен содержать метод обратного вызова для каждого уведомления или последующего уведомления, указанного RegisterModule в функции. Например, если модуль зарегистрирован для уведомления RQ_AUTHENTICATE_REQUEST и RQ_AUTHORIZE_REQUEST после уведомления, класс должен содержать методы OnAuthenticateRequest и OnPostAuthorizeRequest .

Возврат из методов CHttpModule

После завершения обработки методов в CHttpModule классе каждый метод должен возвращать значение перечисления REQUEST_NOTIFICATION_STATUS . Это значение определяет, как СЛУЖБЫ IIS будут обрабатывать условие выхода методов класса. Например, возвращаемое значение RQ_NOTIFICATION_CONTINUE сообщает IIS о необходимости продолжить обработку запроса. В отличие от этого, возвращаемое значение RQ_NOTIFICATION_FINISH_REQUEST указывает службам IIS прекратить обработку текущего запроса.

Очистка CHttpModule

После завершения обработки модуля IIS вызовет метод CHttpModule::D ispose модуля, чтобы удалить CHttpModule класс из памяти.

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

Создание класса, производного от CGlobalModule

Функциональность обработки main для модулей HTTP глобального уровня предоставляется через модуль, производный от базового класса CGlobalModule. Этот класс должен содержать метод обратного вызова для каждого уведомления, указанного RegisterModule в функции. Например, если модуль зарегистрирован для GL_APPLICATION_START и уведомлений GL_APPLICATION_STOP , класс должен содержать методы OnGlobalApplicationStart и OnGlobalApplicationStop .

Возврат из методов CGlobalModule

После завершения обработки методов в CGlobalModule классе каждый метод должен возвращать значение перечисления GLOBAL_NOTIFICATION_STATUS . Это значение определяет, как СЛУЖБЫ IIS будут обрабатывать условие выхода методов класса. Например, возвращаемое значение GL_NOTIFICATION_CONTINUE сообщает СЛУЖБАм IIS о необходимости продолжить обработку уведомления. В отличие от этого, возвращаемое значение GL_NOTIFICATION_HANDLED указывает службам IIS прекратить обработку текущего уведомления.

Очистка CGlobalModule

После завершения обработки модуля IIS вызовет метод CGlobalModule::Terminate модуля. Модуль должен использовать этот метод для удаления CGlobalModule класса из памяти.

См. также:

Пошаговое руководство. Создание модуля HTTP Request-Level с помощью машинного кода
Пошаговое руководство. Создание модуля HTTP Global-Level с помощью машинного кода
Создание Native-Code http-модулей