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

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

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

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

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

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

При создании функции RegisterModule, вы указываете битовую маску, содержащую список уведомлений, которые будет обрабатывать модуль на уровне запроса (для получения дополнительных сведений см. в разделе Request-Processing Константы). Например, модуль уровня запроса может указать, что он предоставит методы обработки уведомления 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 уведомлений.

Создание модулей уровня запроса

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

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

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

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

Основная функция обработки для модулей 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::Dispose, чтобы освободить CHttpModule класс из памяти.

Создание модуля на глобальном уровне

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

Основная функция обработки для модулей 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 с помощью машинного кода
Создание модулей HTTP Native-Code