ПРИЛОЖЕНИЕ 2


Использование интерфейса ISAPI/NSAPI

Кроме описанной технологии создания CGI-модулей, существует другой стандарт взаимодействия Web-сервера с исполняемым серверным модулем. Это интерфейс ISAPI/NSAPI. Его отличие от уже знакомого CGI заключается в формате предоставления данных запроса, а также типе обслуживаемого модуля. Если в CGI-программировании создавался обычный ЕХЕ-файл, то ISAPI/NSAPI предусматривает работу с программами, выполненными в виде динамически подключаемых библиотек. В ряде случаев, если программирование ведется под конкретный сервер, то может сложиться ситуация, когда необходимо создавать именно такой тип серверного приложения. Сразу следует отметить, что Web-сервер Apache не предусматривался для поддержки этого интерфейса, поскольку является кроссплатформенной программой, а интерфейс ISAPI/NSAPI рассчитан в первую очередь для работы на платформе Windows.

Для отладки и запуска новых типов серверных моделей рекомендуем использовать комплекс программ Microsoft Internet Information Services (US). Он обеспечивает работу обоих типов серверных приложений.

 

Замечания о структуре I IS

Некоторое обзорное описание этого сервера вы можете найти в гл. 2. Здесь мы сосредоточимся лишь на тех аспектах, которые касаются непосредственно Web-программирования.

Поскольку создание любой программы предполагает ее отладку, то начинать этот процесс следует с настройки рабочего места. Устанавливать Web-сервер MS IIS нужно на компьютере, работающим под управлением операционной системы MS Windows NT, причем, не имеет значения, какой реализации — серверной или клиентской. В поставку новых версий этой операционной системы Web-службы входят стандартным компонентом, и, если у вас их нет, значит следует просто воспользоваться Мастером установки/удаления программ, в котором необходимо пометить эти серверные расширения галочкой и нажать кнопку Установить.

 

Структура каталогов и настройка сервера

После копирования файлов нужно определить некоторые параметры работы сервера.

Как обычно, это IP-адреса, имена в DNS и т. д. Если компьютер подключен к локальной сети, то делать это нужно по согласованию с системным администратором, дабы исключить возможные сбои в ее работе. В ходе изложения материала, мы будем предполагать, что компьютер является локальной рабочей станцией, с именем localhost и IP-адресом 127.0.0.1, как и в случае работы с Apache.

По умолчанию, Web-сервер имеет структуру каталогов, приведенную на рис. П2.1, что необходимо учитывать при создании серверных модулей.

Рис. П2.1.Структура каталогов Web-сервера MS US

HTML-документы основного Web-сайта данного сервера находятся в папке wwwroot. Это значит, что при обращении к адресу http://localhost/default.htmфайл default.htm ищется именно там. Серверные модули находятся в каталоге Scripts. Специально для разграничения доступа для создателей нескольких сайтов, размещенных на данном сервере, существует папка webpub, которую, как правило, используют для хранения содержимого виртуальных хостов.

Нужно отметить, что система настроек безопасности и ограничения доступа в IIS интегрирована с ней самой операционной системой, что позволяет легко устанавливать права доступа и ограничивать нежелательные действия серверных модулей, что очень удобно.

Определив права и запустив соответствующие серверные службы, можно начинать создавать программы. Как и ранее, для удобства рекомендуем установить каталог с модулями Web-сервера (Scripts), в качестве выходного каталога (в который помещается ЕХЕ- или DLL-файл) компилятора Delphi.

 

Интерфейс ISAPI/NSAPI

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

Взаимодействие между сервером и ISAPI-модулем

Для передачи данных, используемых серверым модулем, применяется вызов специальной функции HttpExtensionProc, которую должна содержать каждая dll-библиотека. В качестве параметра ее вызова выступает адрес в памяти, содержащий структуру, в которой помешены эти данные, а также адреса функций передачи содержимого ответа клиенту и, наоборот, чтение данных, посланных им в теле POST-запроса. Кроме того, библиотека должна экспортировать функцию GetExtensionVersion, заполняющую запись, адрес которой передается ей в качестве параметра, информацией, содержащей версию используемой спецификации IIS и ее описание.

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

В Delphi существует уже готовый набор классов, реализующий задачи взаимодействия серверного модуля с IIS-сервером. Чуть позже, мы воспользуемся им для создания примера.

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

 

Пример реализации модуля, работающего под управлением IIS-сервера

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

Для начала следует запустить Delphi, зайти в меню Fileи выбрать команду New. В появившемся диалоговом окне следует выбрать Web Server Application.

Далее, при выборе серверной платформы нужно указать тип ISAPI/NSAPI Dynamic Link Library. По нажатии кнопки ОК появится стандартный Web Module, работа с которым ничем не отличается от предыдущих примеров. Добавим новое действие, которое следует назвать Time, и указать такой же путь (параметр Path). В качестве обработчика этого действия (событие onAction) впишем процедуру, приведенную в листинге П2.1.

 Листинг П2.1. Обрабочик события OnAction для действия Time 

procedureTWebModulel.WebModulelTimeAction(Sender: TObject;

Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); beginResponse.Content:=('<HTML>'+

TimeTostr(Now)+ '</HTML>'); 

end;

После компиляции библиотеки в каталог Script Web-сервера можно запустить браузер, и набрав в его адресной строке конструкцию вида

http://localhost/scripts/projectl.dll/time,

где project1 должно быть заменено на название проекта, на экране можно увидеть текущее время.

Совершенно аналогично происходит получение параметров с использованием объекта Request.

 

Преобразование модулей из платформы CGI в ISAPI и наоборот

Порою требуется выполнять одно и тоже серверное приложение на различных серверах. Чтобы преобразовать серверное приложение, рассчитанное для работы в среде Internet Information Sevices и выполненное в виде dll, в формат CGI, следует выполнить ряд несложных действий, заключающихся в замене используемых классов, реализующих взаимодействие с сервером. К счастью, эти классы для обоих вариантов реализации серверных модулей имеют одинаковые названия, но располагаются в различных библиотеках. Приложения, выполненные на базе CGI, должны использовать бибилиотеку CGIApp, a ISAPI-модули — ISASIApp. Кроме того, нужно поменять формат выходного файла с библиотеки в обычный ЕХЕ-файл. Обратное преобразование выполняется аналогично.