Опубликован: 24.11.2006 | Уровень: специалист | Доступ: платный
Лекция 5:

Расширения ISAPI

Мастер шаблона проекта ISAPI

При создании расширения ISAPI с использованием поддержки MFC воспользуйтесь мастером шаблона проекта ISAPI (ISAPI Project Template Wizard). Мастер настроит проект на необходимую поддержку для библиотек ISAPI и создаст класс, унаследованный из CHttpServer. Для ISAPI предоставляются следующие классы MFC.

  • CHttpArgList. Класс, содержащий функции и структуры для анализа URL.
  • CHtmlStream. Класс, управляющий памятью по отношению к данным, предназначенных для передачи клиенту.
  • CHttpFilter. Класс, расширяющий интерфейс IIS для создания фильтра ISAPI. Фильтры представляют собой тип приложения ISAPI, вызываемый при каждом запросе IIS, поэтому они отвечают на события внутри IIS.
  • CHttpFilterContext. Класс, являющийся параметром в функциях класса CHttpFilter, для обработки содержимого данного события HTTP. Служит для обработки связанных с рассматриваемым событием HTTP данных, проходящих через фильтр.
  • CHttpServer. Класс, расширяющий интерфейс IIS для рассматриваемого события HTTP-запроса.
  • ChttpServerContext. Класс, обеспечиваемый классом CHttpServer, содержащий методы управления данными, связанными с рассматриваемым событием HTTP.

Классы, предоставляемые в MFC, обеспечивают хороший уровень абстракции для первоначального взаимодействия со структурами ISAPI и функциями, приведенными выше. С помощью MFC разработчик осуществляет доступ к "сырому" ISAPI. Некоторые классы облегчают анализ заголовков и данных HTTP, выполняемый вручную в расширении ISAPI SEUX. Мастер создаст класс, которому будет присвоено имя согласно следующей схеме: C<Имя_проекта>Расширение. Функция с именем Default является главной точкой входа для ISAPI DLL:

void Default(CHttpServerContext* pCtxt);

Функция Default заменяет функцию HttpExtensionProc, используемую в расширении ISAPI SEUX в качестве главной точки входа. Указатель на класс CHttpServerContext, передаваемый в функцию Default, обеспечивает функциональность и требования разработчика к управлению данными и HTTP-транзакцией (осуществлялось посредством ECB в расширении ISAPI SEUX ).

Создание расширения ISAPI в Visual Studio .NET

Для создания расширения ISAPI с помощью шаблона проекта Vusal Studio .NET откройте Visual Studio .NET и выберите File\New\Project (Файл\Создать\Проект). Откроется диалоговое окно New Project (Новый проект) (см. рис. 5.13). Выберите шаблон проекта MFC ISAPI Extension DLL, введите имя проекта и нажмите на кнопку OK.

Выбор шаблона проекта MFC ISAPI Extension DLL в Visual Studio .NET

Рис. 5.13. Выбор шаблона проекта MFC ISAPI Extension DLL в Visual Studio .NET

Примечание. Диалоговое окно (см. рис. 5.13) отображает значки, отличающиеся от тех, которые показаны на рис. 5.2. В обоих случаях использованы одинаковые версии Visual Studio .NET. Рисунок 5.2 получен при нажатии на кнопку Large Icons (Большие значки) в правом верхнем углу, рисунок 5.13 – при нажатии на кнопку Small Icons (Мелкие значки). Кнопки Large Icons (Большие значки) и Small Icons (Мелкие значки) являются взаимоисключающими, и они влияют на отображение значков проекта в правой части диалогового окна New Project (Новый проект).

По аналогии с мастером проекта сервера ATL (см. "Сервер ATL" ) работа мастера расширения ISAPI выполняется в одном окне, и его работа завершается после нажатия на кнопку Finish (Готово) (см. рис. 5.14). Мастер приводит обзор параметров проекта в области Overview (Обзор). Типом создаваемого проекта по умолчанию является библиотека DLL расширения ISAPI с MFC в общей DLL. Данные настройки подходят для большинства проектов ISAPI. Эти параметры можно изменить в области Object Settings (Параметры объекта).

Область Overview (Обзор) мастера расширения ISAPI с проектом ISAPI по умолчанию

Рис. 5.14. Область Overview (Обзор) мастера расширения ISAPI с проектом ISAPI по умолчанию

В области Object Settings (Параметры объекта) настраиваются имена классов, сгенерированных мастером, содержатся опции, позволяющие расширению ISAPI подключаться к MFC статически или динамически. Выбор опции Use MFC In A Shared DLL (Использовать MFC в общей DLL) (см. рис. 5.15) определяет динамическое подключение MFC в ISAPI DLL, генерируемой во время компиляции. Подразумевается, что MFC существует в среде разработки, что достигается исключением содержимого из ISAPI DLL.

Область Object Settings (Параметры объекта) мастера расширения ISAPI с проектом ISAPI по умолчанию.

Рис. 5.15. Область Object Settings (Параметры объекта) мастера расширения ISAPI с проектом ISAPI по умолчанию.

При выборе опции Use MFC In A Static Library (Использовать MFC в статической библиотеке) компоненты MFC компилируются в DLL и подключаются статически. В этом случае подразумевается, что MFC не существует в среде разработки. Размер библиотеки при статическом подключении больше, чем при динамическом подключении. В большинстве случаев MFC располагаются в целевой среде, так как речь идет о сервере Windows. Для WS03 используйте динамическое подключение, поскольку MFC находятся на сервере.

Можно сгенерировать объект фильтра, включив опцию Generate A Filter Object (Генерировать объект фильтра). Фильтры загружаются в IIS для обработки каждого запроса, имеющего место в IIS. Они работают по аналогии с расширением ISAPI, как если бы оно было связано с каждым файлом корневого веб-каталога. Фильтр и расширение не являются взаимоисключающими функциями. Одна библиотека DLL может содержать как расширение, так и фильтр, что позволяет каждому из этих объектов использовать состояние посредством глобальных переменных.

Фильтры ISAPI сложны для разработки и тестирования. Они вызываются при каждом запросе в IIS, поэтому необходимо обеспечить их эффективность и правильность построения. Фильтры могут снизить эффективность сервера или вызвать сбой в его работе при возникновении проблем с памятью.

После нажатия на кнопку Finish (Готово) и завершения мастером генерации файлов проект можно скомпилировать и запустить, как только библиотека DLL будет отгружена на сервер. Если все выполнится правильно, вы увидите в браузере сообщение, имя класса в котором соответствует выбранному имени класса:

This default message was produced by the Internet Server DLL
Wizard. Edit your CMFCISAPIExtension::Default() implementation
to change it.
Дмитрий Васюков
Дмитрий Васюков
Россия, Брянск
Maxim Kuzmin
Maxim Kuzmin
Россия