ISAPI / NSAPI
Итак, что такое CGI? Что это такое, документацию, статьи вы можете найти в интернете. Для платформы WIN32 существует три вида CGI интерфейса, поддерживаемых Delphi.
- ISAPI — Стандарт Internet Server API изначально был создан как Microsoft Information Server API, но в дольнейшем был предложен в качестве открытого стандарта.
- NSAPI — Стандарт Netscape Server API используется для взаимодействия с серверами компании Netscape
- CGI — Common Gateway Interface (стандартный интерфейс шлюза) был первой попыткой интеграции WWW-серверов и отдельных программ.
- WinCGI — Windows вариант CGI
Поскольку компании Netscape приняла стандарт ISAPI, в данный момент реально существует единый формат для Internet Information Server (IIS) и серверов компании Netscape. Поэтому воспользуемся предоставляемым Delphi инструментарием для создания ISAPI DLL, которая будет отвечать на запросы клиентов.
Создание ISAPI библиотеки
Создание ISAPI DLL похоже на разработку любой стандартной DLL. Для этого необходимо загрузить Delphi, в меню File выбрать пункт New,
затем в диалоговом окне New Items выбрать пиктограмму Web Server Application и нажать кнопку OK. Появится диалоговое окно New Web Server Application.
Пункт ISAPI/NSAPI Dynamic Link Library выбран по умолчанию, поэтому нажимаем кнопку OK.
Вы попали в интерактивную среду разработки ISAPI расширения сервера. В вашем проекте содержится специальный модуль WebModule, он позволяет помещать в него различные компоненты и обеспечивает работу с ними.
Если дважды щелкнуть мышкой на WebModule, появится Action Editor, предназначенное для создания и редактирования обработчиков событий ActionItem. Для создания ActionItem следует нажать кнопку Add New, при этом в окне Object Inspector отобразятся свойства и события созданного ActionItem.
Специальные компоненты, облегчающие создание динамических страниц расположены , также, на странице Internet палитры компонентов. Это — PageProduсer и ему подобные, предназначенные для генерации динамических HTML страниц.
Познакомимся с основными объектами и классами ISAPI поближе.
WebModule
WebModule — автоматически создаваемый модуль для приложений Web-сервера.
Когда новое Web приложение создано, оно автоматически содержит WebModule . Это дает возможность созданному Web приложению ответить на запрос HTTP, пропуская запрос и ответ к соответствующим обработчикам ActionItems . Приложение может содержать только один WebModule .
WebModule имеет два важных свойства Request и Response с которыми мы познакомимся немного позже, а также события:
OnCreate
Происходит когда приложение создает WebModule . Следует использовать это событие для инициализации переменных и объектов, содержащихся в приложении. Например, если модуль содержит базу данных, приложение может установить подключение базы данных.
OnDestroy
Происходит перед уничтожением WebModule . Используйте это событие для освобождения объектов, созданных динамически в приложении.
BeforeDispatch
Происходит перед тем, как диспетчер устанавливает соответствие запроса HTTP с каким-либо ActionItems . Используйте обработчик события BeforeDispatch для предварительной обработки HTTP запроса.
AfterDispatch
Происходит после того, как HTTP ответ был успешно сформирован ActionItems , но еще не передан клиенту. Используйте обработчик события AfterDispatch , например, для проверки сформированного HTTP ответа.
Request
Request — автоматически создаваемый объект WebModule .
Request представляет текущий HTTP запрос в удобной форме для обработки. Об отдельных свойствах этого компонента следует сказать особо.
ContentFields
Педоставляет содержимое полей POST запроса. Используйте ContentFields , чтобы читать содержимое полей запроса HTTP, при использовании метода POST.
QueryFields
Педоставляет параметры и их значение в случае передачи их запросом в URL документа. Используйте QueryFields , чтобы читать поля запроса HTTP, при использовании метода в котором параметры передаются в URL документа, например метод GET.
ContentFields и QueryFields возвращаю параметры передаваемые клиентом, это обьекты наследованные от класса TStrings , данные в них представлены в виде имя = значение.
Response
Response — также автоматически создаваемый объект WebModule.
Объект Response содержит информацию, которая будет передана клиенту, в результате обработки запроса. Заполнять Response необходимо вам. После того как все свойства будут заполнены, будет сформирован HTTP ответ, который и будет передан клиенту.
Среди свойств объекта Response следует обратить внимание на:
ContentType
Указывает тип содержимого HTTP ответа в соответствии со спецификацией MIME. Используйте ContentType , чтобы установить тип содержимого передаваемого клиенту, например, если вы передаете изображение в формате GIF, вы должны установить ContentType = ‘image/gif’ .
Content
Содержит информацию, передаваемую клиенту в ответ на сообщение запроса HTTP. Используюте Content , чтобы передать требуемую информацию клиенту.
ContentStream
Определяет Stream объект, который будет передан клиенту. Используйте ContentStream для передачи клиенту содержимого отличного от ContentType = ‘text/*’ , например при передаче бинарного файла. Если свойство ContentStream установлено, оно заменяет свойство Content .
Как это работает
В общем случае так. При выполнении HTTP запроса, веб сервер запускает на выполнение ваше ISAPI приложение.
Создается объект Application , порожденный от TISAPIApplication или TCGIApplication . TISAPIApplication и TCGIApplication в свою очеродь имеют общего предка TWebApplication и перекрывают все его виртуальные методы. Объект Application создается автоматически от нужного класса, в зависимости от того, какой тип (ISAPI или CGI) приложения Вы выбрали, об этом заботится визард Delphi.
Следующим автоматически создается объект WebModule , созданный от класса TWebModule , и генирируется событие TWebModule.OnCreate . Затем WebModule создает все обьекты ActionItems и генерирует событие TWebModule.BeforeDispatch . После обработки события BeforeDispatch назначается обьект ActionItem , котрый получает возможность обработать запрос. Обработку запроса и формирование ответа должны производить Вы, анализируя обьект Request и заполняя Response . Все это можно сделать на событии ActionItem.OnAction . В большинстве случаев, для того чтобы сформировать ответ необходимо заполнить свойство Content обьекта Response . После отработки собития OnAction обьекта (или обьектов) ActionItem происходит формирование HTTP ответа и генерируется событие TWebModule.AfterDispatch , затем ответ отсылается клиенту.
Следующим, последним, событием генерируется TWebModule.OnDestroy .
Внимание:В случае ISAPI приложения, объект WebModule может быть создан один раз и не создаваться при каждом запросе, следовательно не будут генерироваться события OnCreate и OnDestroy объекта WebModule.
Интерфейс программирования приложений Интернет-сервера — Internet Server Application Programming Interface
Интерфейс программирования приложений Интернет-сервера ( ISAPI ) — это N-tier API из Internet Information Services (IIS), коллекция Microsoft служб веб-сервера на базе Windows. Наиболее известным приложением IIS и ISAPI является веб-сервер Microsoft .
. ISAPI также был реализован модулем mod_isapi Apache, чтобы можно было использовать серверные веб-приложения, написанные для Microsoft IIS. с Apache и другими сторонними веб-серверами, такими как Zeus Web Server, предлагают интерфейсы ISAPI.
Программное обеспечение веб-сервера Microsoft называется Internet Information Services, которое состоит из ряда «вспомогательных приложений» и легко настраивается. ASP.NET — одна из таких частей IIS, позволяющая программисту писать веб-приложения на языке программирования по своему выбору (VB.NET, C#, F# ), который поддерживается Microsoft.NET CLR. ISAPI — это система программирования гораздо более низкого уровня, обеспечивающая гораздо лучшую производительность за счет простоты.
- 1 Приложения ISAPI
- 1.1 Расширения
- 1.2 Фильтры
- 1.3 Общие приложения ISAPI
Приложения ISAPI
ISAPI состоит из двух компонентов: расширений и фильтров. Это единственные два типа приложений, которые могут быть разработаны с использованием ISAPI. И фильтры, и расширения должны быть скомпилированы в файлы DLL, которые затем регистрируются в IIS для запуска на веб-сервере.
Приложения ISAPI могут быть написаны с использованием любого языка, который позволяет экспортировать стандартные функции C, например C, C ++, Delphi. Есть несколько доступных библиотек, которые помогают упростить разработку приложений ISAPI, а в Delphi Pascal компоненты Intraweb для разработки веб-приложений. MFC включает классы для разработки приложений ISAPI. Кроме того, существует технология ATL Server, которая включает библиотеку C ++, предназначенную для разработки приложений ISAPI.
Расширения
Расширения ISAPI — это настоящие приложения, которые работают в IIS. У них есть доступ ко всем функциям, предоставляемым IIS. Расширения ISAPI реализованы как библиотеки DLL, которые загружаются в процесс, управляемый IIS. Клиенты могут получить доступ к расширениям ISAPI так же, как они получают доступ к статической HTML-странице. Определенные расширения файлов или целая папка или сайт могут быть сопоставлены для обработки с помощью расширения ISAPI.
Фильтры
Фильтры ISAPI используются для изменения или расширения функциональных возможностей, предоставляемых IIS. Они всегда работают на сервере IIS и фильтруют каждый запрос, пока не найдут тот, который им нужен для обработки. Фильтры могут быть запрограммированы для проверки и изменения как входящих, так и исходящих потоков данных. Внутренне запрограммированные и сконфигурированные извне приоритеты определяют порядок вызова фильтров.
Фильтры реализованы как библиотеки DLL и могут быть зарегистрированы на сервере IIS на уровне сайта или на глобальном уровне (т. Е. Они применяются ко всем сайтам на сервере IIS). Фильтры инициализируются при запуске рабочего процесса и прослушивают все запросы к сайту, на котором он установлен.
Общие задачи, выполняемые фильтрами ISAPI, включают:
- Изменение данных запроса (URL-адресов или заголовков), отправленных клиентом
- Контроль того, какой физический файл будет сопоставлен с URL-адресом
- Управление именем пользователя и паролем, используемыми при анонимной или базовой аутентификации
- Изменение или анализ запроса после завершения аутентификации
- Изменение ответа, возвращающегося клиенту
- Запуск пользовательской обработки при ответах «отказано в доступе»
- Запуск обработки после завершения запроса
- Запуск обработки при закрытии соединения с клиентом
- Выполнение специального журнала или анализа трафика.
- Выполнение пользовательской аутентификации.
- Обработка шифрования и сжатия.
Стандартные приложения ISAPI
Это список общих приложений ISAPI, реализованных как расширения ISAPI:
- Active Server Pages (ASP), установлен как стандартный
- ActiveVFP, Active Visual FoxPro установлен на IIS
- ASP.NET, установлен как стандарт на IIS 6.0 и более поздних версий
- ColdFusion, более поздние версии ColdFusion можно установить на IIS
- Perl ISAPI (он же Perliis), доступен для бесплатной установки
- PHP, доступен для бесплатной установки, больше не поддерживается.
Разработка ISAPI
Приложения ISAPI можно разрабатывать с использованием любого инструмента разработки, который может генерировать Windows DLL. Мастера для создания приложений инфраструктуры ISAPI доступны в инструментах разработки Microsoft начиная с Visual C ++ 4.0.
Расширение функций веб-серверов. Модули ISAPI (IIS) и DSO (Apache)
Изначально, единственным средством выполнения программ на стороне веб-сервера было обращение к ним через общий шлюзовый интерфейс (CGI). Практика показала, что в CGI имеется ряд недостатков, в числе основных — высокие требования к аппаратным ресурсам веб-сервера и высокие накладные расходы на этапах загрузки и выгрузки CGI-приложений. Альтернативным решением стало использование модульной архитектуры веб-серверов, позволяющей расширять их возможности за счет внешних библиотек — модулей.
Модули веб-сервера — это статически или динамически подключаемые библиотеки функций, доступных веб-серверу. В отличие от CGI, модульные расширения быстрее и требуют меньших ресурсов, т.к. многопоточны, т.е. для обработки еще одного запроса не требуется загрузки еще одной копии приложения. Рассмотрим модульные расширения наиболее распространенных веб-серверов: DSO для веб-сервера Apache и ISAPI для Internet Information Services
Apache DSO
Как узнать конфигурацию Apache?
Чтобы получить список модулей, включенных в текущую конфигурацию веб-сервера, например, хостинг-провайдера (поставщика услуг хостинга), можно использовать такой простейший скрипт:
Веб-сервер Apache имеет открытую модульную архитектуру и его базовые возможности представлены в основном модуле ядра(apache core). Дополнительные возможности вынесены во внешние модули, которые могут быть подключены к ядру статически или динамически. Это позволяет очень тонко настраивать Apache под конкретные задачи, включая в сборку только те функции, которые действительно нужны. Такой подход позволяет управлять производительностью и функциональностью веб-сервера.
Для статического подключения модулей Apache должен быть скомпилирован вместе с кодом нужных модулей. Динамически подключаемые модули добавляют свою функциональность при их загрузке во время запуска/перезапуска веб-сервера. Для динамического подключения модуль должен быть представлен в виде DSO ( Dynamic Shared Object ). Для поддержки DSO Apache использует опять же модуль, mod_so , который загружает модули в виде разделяемых библиотек или разделяемых файлов. Способ загрузки DSO указывается в конфигурационном файле веб-сервера Apache (httpd.conf) соответствующими директивами:
-
LoadModule — задает связь с указанным модулем и добавляет его в список активных модулей. Синтаксис:
LoadModule module filename
Имя модуля является названием внешней переменной типа module и определено как Module Identifier в документации модуля. Имя файла (filename) задается относительно корня веб-сервера (ServerRoot). Пример:
LoadModule status_module modules/mod_status.so
LoadFile filename [ filename ] .
Где filename — абсолютный путь к файл[у|ам] или относительный путь от корня веб-сервера (ServerRoot). Пример:
LoadFile libexec/libxmlparse.so
Модули взаимодействуют с сервером Apache через единый интерфейс. Они регистрируют свои обработчики в ядре Apache или в других модулях. Ядро Apache обращается к этим обработчикам когда это требуется. С другой стороны, модули могут обращаться к функциям и структурам данных ядра через Apache API. Это может потребоваться, например, при передаче данных или выделении памяти.
Модуль Apache прозрачен для пользователя, т.е. не является конечной точкой клиентского запроса, чем напоминает ISAPI-фильтр. Модуль может представлять функции обработки программных прерываний (handlers for hooks), связывания директив конфигурации, фильтрации запроса и дополнительные функции.
- Программное прерывание (hook) — это любое критичное событие, произошедшее на этапе выполнения кода веб-сервера и которое должно быть обработано. Вызов функций этого типа контролируется ядром сервера, поскольку обработчики модуля могут дополнять код ядра.
- Функции связывания директив конфигурации предназначены для считывания и применения настроек модуля, которые у каждого модуля будут разными, из общего файла конфигурации веб-сервера.
- Фильтрация запросов позволяет выполнять обработку как входящих запросов, так и ответов сервера.
- Дополнительные функции — это некритичные функции и фильтры, результаты которых игнорируются ядром и возвращаются «как есть».
Приведем краткое описание некоторых модулей Apache.
- mod_access — отвечает за доступ к каталогам и файлам веб-сервера и переопределение ряда параметров веб-сервера для заданных каталогов и файлов.
- mod_alias — отвечает за переадресацию и использование псевдонимов, позволяет перенаправлять запросы к физическим каталогам по их псевдонимам (алиасам). Такое перенаправление используется, например, для каталога с CGI-скриптами.
- mod_asis позволяет отдавать клиенту запрошенный ресурс «как есть», без какой-либо обработки сервером.
- Модули из семейства mod_auth отвечают за аутентификацию пользователей. Различные модули из этого семейства реализуют разные способы аутентификации. Подробности — в документации на модули mod_auth , mod_auth_dbm , mod_auth_digest и подобных.
- mod_autoindex предназначен для автоматической генерации индексных файлов. Это может быть очень удобно при работе, например, с файловым архивом, когда нужно просто поместить на индексной странице названия файлов. С помощью директив этого модуля можно сортировать файлы, добавлять разным типам файлов свои иконки, отображать или скрывать файлы с заданными расширениями и так далее.
- mod_deflate позволяет сжимать файлы в формат GZIP перед отправкой пользователю для ускорения загрузки.
- mod_status позволяет администратору контролировать работу веб-сервера. Система будет сама записывать в файл все запросы, время перезагрузок и остановок сервера, загрузку процессора компьютера и другую информацию.
- mod_proxy позволяет использовать Apache в качестве прямого или обратного прокси-сервера. В первом случае он управляет доступом во внешнюю сеть из ЛВС, во втором — напротив, предоставляет доступ к узлам ЛВС, которые не видны «извне».
- mod_rewrite отвечает за перенаправление запросов и позволяет скрывать параметры скриптов. Например, с помощью этого модуля можно настроить преобразование клиентского запроса вида:
http://example.com/news/2009/05/03
к фактическому виду:
http://example.com/news.php?date=20090503
Это далеко не полный перечень модулей Apache, но даже он позволяет дать представление о гибкости этого самого распространенного веб-сервера.
ISAPI
ISAPI (Internet Server Application Programming Interface) — это набор интерфейсов, предоставляемых веб-сервером MS IIS (Internet Information Services) для написания приложений, взаимодействующих с этим сервером и расширяющих его возможности. Приложения ISAPI представляют собой динамически подключаемые библиотеки (Dynamic Link Library, DLL), напрямую взаимодействующие с API IIS. Приложения ISAPI загружаются и выполняются в адресном пространстве IIS, поэтому серверу не нужно создавать новый процесс при каждом HTTP-запросе. Поскольку Windows загружает динамически подключаемую библиотеку один раз при первом вызове функции в DLL, то приложение ISAPI остается загруженным и не удаляется, пока не будет остановлен/выключен веб-сервер (если включено кэширование ISAPI), либо приложение не будет выгружено явным образом (если кэширование выключено).
Рис. 1. Архитектура ISAPI
Приложения ISAPI могут быть оформлены или в виде расширений, или в виде фильтров.
- ISAPI-расширение — это приложение IIS, которое является адресатом запроса, оно выполняет действия, которые веб-сервер не может выполнять сам (например, обращение к базе данных). Расширение не влияет на параметры запроса, а использует их как входные данные. В этом ISAPI-расширение напоминает CGI-приложение. ISAPI-расширение может быть вызвано как явно (через запрос вида http:///isapiext.dll?paramstring ), так и неявно (через карту расширений, в которой указаны обработчики для зарегистрированных типов файлов (mapping), или при вызове через фильтр). Расширения ISAPI — наиболее частый способ применения ISAPI.
- ISAPI-фильтр, в отличие от расширения, является своего рода посредником в обработке пользовательского запроса с момента его получения веб-сервером и до момента отправки ответа. Фильтр может модифицировать запрос или ответ, вызвать специфичный для конкретного запроса обработчик и т.п., при этом сам фильтр не является конечным обработчиком. Фильтры ISAPI довольно сложны в разработке и сфера их использования ограничена, как правило, решением таких задач, как шифрование, журналирование, аутентификация, сжатие данных.
Основное преимущество ISAPI — в скорости выполнения операций. ISAPI-приложение работает быстрее, чем обычная CGI-программа (которая должна всякий раз загружаться и выгружаться) или скрипт (который сначала должен быть загружен, потом обрабатан интерпретатором, которому, в общем случае, тоже нужно время на загрузку).
Среди недостатков — трудности при отладке ISAPI-приложений. Незамеченная ошибка может привести к нарушению работоспособности не только самой библиотеки dll, но и всего веб-сервера. При разработке ISAPI-приложений на универсальных языках программирования, таких как C++ или Object Pascal еще одной проблемой становится неконтролируемый код. Т.е. разработчик должен сам заботиться об управлении памятью, «сборке мусора» и прочих аспектах системного уровня. Еще один недостаток, пожалуй, самый главный — непереносимость. Несмотря на то, что ISAPI — открытая спецификация и поддержка технологии реализована, например, в модуле mod_isapi.dll для Apache for Win32, нет никакой возможности применять ISAPI на платформах, отличающихся от MS Windows.
Isapi что это
Мы с Вами поговорим пока о ISAPI фильтрах. Это обычные DLL, которые подключаются к ISS и могут изменить обработку серверных запросов. То есть, если Вы хотите поменять поведение сервера по запросу HTTP, то это как раз для Вас. Что, например, можно делать с помощью этого фильтра .
- Скрывать физическое местоположение URL
- Изменять загрузку страни в зависимости от типа броузера
- Запрещать доступ или перенаправлять его в зависимости от запроса
- и многое многое другое .
Подлючаются ISAPI фильтры в ISS через вкладку ISAPI Filter.
Итак, ISAPI Filter — это динамические библиотеки сформированные по определенным правилам позволяющие изменить поведение сервера ISS.