Что такое код hello isapi


Что такое код hello isapi

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

ыыыы. ну почему никто не знает.

А у тебя WEB-сервер есть для для использования ISAPI-приложения?

мне IISа хватит!


> poganka © (20.11.06 12:27) [3]
> мне IISа хватит!

Хватит, конечно.
Тогда создавай страничку с формой, на которой будет кнопка с любым из методов GET или POST, CGI, которы будет срабатывать при посылке данных этой формы. И все.

я написала хтмл с кнопками. написала хтмл с табличками, которые по идее нужно передать по запросу радиокнопки. запустила шаблон исапи в Delphi. а как писать сам анализ радиокнопок, не знаю.

Между begin и end там писать ничего не нужно. А вот если два раза щелкнуть на дизайнере модуля web-приложения, откроется редактор Action»ов. Вот там нужно добавить хотя бы один экшн, и в его обработчике смотреть объект WebRequest, который будет содержать значения полей на HTML-форме. Ну и, само собой, этот самый
> хтмл с табличками

должен содержать правильно написанную HTML-форму, ссылающуюся на твой экшн


> Между begin и end там писать ничего не нужно. А вот если
> два раза щелкнуть на дизайнере модуля web-приложения, откроется
> редактор Action»ов. Вот там нужно добавить хотя бы один
> экшн, и в его обработчике смотреть объект WebRequest, который
> будет содержать значения полей на HTML-форме. Ну и, само
> собой, этот самый
> > хтмл с табличками
>
> должен содержать правильно написанную HTML-форму, ссылающуюся
> на твой экшн

по-моему, вы для меня слишком умные :)))
привожу полную постановку задачи (без личной интерпретации):
_____________________________________________
Вывод данных по запросу пользователя. На сервере имеется три текстовых файла, первый содержит список товаров, второй – список услуг, третий – список партнеров некой абстрактной компании. Имеется HTML-страница, содержащая три радиокнопки и кнопки типа submit и reset. По нажатию кнопки типа submit запускается ISAPI-приложение, которое, анализируя выбранную клиентом радиокнопку, передает ему в формате HTML один из трех файлов.
_____________________________________________
неужели нужно еще заботиться о полях этих самых хтмл с табличками? разве нельзя туда любую текстовую байду черкануть?


> разве нельзя туда любую текстовую байду черкануть?

хтмл, собственно, и есть «текстовая байда»


> разве нельзя туда любую текстовую байду черкануть?

Совсем любую — нельзя. Обязательно должно присутствовать что-либо такого вида

А в экшене ты и будешь определять состояние радиокнопок по указанному тобой name. С помощью объекта WebRequest

Да, и еще :)
Если предполагается работа с БД, ну что-то типа SQL-сервера, не забыть аккуратно вляпать
CoInitializeEx (nil, COINIT_MULTITHREADED);
в предположении, что DLL, все таки многопоточная.

если сначала, то вот мой вариант хтмл:
___________________________________________________

8 Приложения ISAPI

В этой главе мы расскажем о приложениях ISAPI, дополняющих возможности сервера Microsoft Information Server. Все эти приложения можно разделить на две группы: расширения ISAPI и фильтры ISAPI.

Расширения ISAPI по своему назначению напоминают уже изученные вами программы CGI. Однако в отличие от последних эти расширения выполнены в виде библиотек динамической компоновки DLL, что имеет ряд преимуществ. Так же как и программы CGI, расширения ISAPI получают данные от навигатора (например, из заполненной удаленным пользователем формы), обрабатывают их и посылают навигатору ответ. Однако вместо чтения содержимого переменных среды и стандартного потока ввода STDIN расширение ISAPI получает данные при помощи специально предназначенных для этого функций. Аналогично, вместо записи выходных данных в стандартный поток вывода расширение ISAPI вызывает специальную функцию.

Фильтры ISAPI также реализуются в виде библиотек динамической компоновки DLL, однако их назначение другое. Фильтры ISAPI способны контролировать весь поток данных, проходящий через сервер, на уровне протокола HTTP. Поэтому их можно применять для решения таких задач, как шифрование или перекодирование данных, компрессия информации, создания собственных процедур подключения пользователей к системе и аутентификации (проверки идентификации пользователей), а также для сбора статистической информации использования ресурсов сервера удаленными пользователями.

Принципы работы и структура расширения ISAPI

Как мы только что сказали, расширение ISAPI создается в виде библиотеки динамической компоновки DLL. Обращение к такой библиотеки выполняется в документах HTML аналогично обращению к программам CGI — из форм или ссылок, созданных, соответственно, при помощи операторов

Расширение вызывается в параметре ACTION оператора

Вызов расширения ISAPI выполняется в форме с помощью параметра ACTION оператора

Быстрейшая CMS на Delphi для IIS как ISAPI Extension

Почему вы пишите сайты на скриптах, вроде PHP? Я лично не понимаю. Я использую другой способ — ISAPI Extensions for IIS. Сейчас расскажу, почему.

ISAPI Extensions (расширения Web сервера) — простая DLL библиотека с парой функций, которые обрабатывают запрос пользователя к Web серверу и возвращают ответ. Точнее — одна функция, остальные служат для регистрации/разрегистрации DLL в рабочем процессе IIS.

Из этого следует, что, по сравнению с другими способами, такими, как скрипты, ISAPI Extensions выигрывают по:
1. Скорость работы. DLL загружается в рабочий процесс IIS и находится в памяти всегда, а не читается с диска при каждом обращении. Не требуется интерпретатор языка — код нативный и исполняется непосредственно процессором;
2. Функционал. Вы можете использовать любую другую DLL или любой вызов WinAPI. Теоретически возможно специально сформированным http запросом отформатировать флэшку;
3. Защищенность. Ваш код очень сложно проанализировать и понять, как взломать сайт — нативный код человеком плохо читается;
4. У вас есть нормальный отладчик во время разработки! Самый вкусный момент. Можете делать step-by-step trace, стэк и память доступны для анализа.

Есть и ложка дегтя, как и везде, хотя это сложно назвать недостатками:
1. Требуется IDE для разработки;
2. Невозможно просто взять и поправить 2 строчки в скрипте на сервере — требуется пересобрать проект, как любое Windows приложение;
3. Вероятность завалить рабочий процесс IIS с ошибкой Acceess violation at address (не бояться, он просто перезапустится);
4. Различные security violations, связанные с возможностью делать, что хочешь. Хотя, это уже точно вопрос к админам, как они раздадут права на сервере.
5. Ваши друзья — php кодеры вас не поймут и назовут дураком, если вы передадите им такую CMS. Еще они не смогут ее установить :D

Итак, приступим к работе. На Delphi. Я буду использовать Delphi 2010 и IIS 6 под Windows Server 2003 R2 EnUS. Почему Делфи? В последнее время на хабре много пишут о том, что с этим языком что-то не так, а CMS подразумевает работу с базой данных, почтой и множеством текстовых строк (привет, TStringList). Вот и посмотрим, кто дурак.

Добрые Борландны, еще много лет тому назад, упростили процесс работы с ISAPI до предела. Чтобы начать выберем File -> New -> Other и выберите WebBooker -> Web Server Application. Далее кликаете ISAPI/NSAPI Dynamic Link Library и нажмите OK.

Вот и все, готова ваша ISAPI Extension. Пока она ничего не возвратит Web серверу конечно, но если ее откомпилировать она готова к работе.

Переключитесь на Unit1 и выберите Action Editor для объекта WebModule1. Об экшенах поговорим в другой раз, пока нужно просто создать default action, который будет обрабатывать все наши запросы.

Сделайте все, как на картинке и давайте уже двигаться дальше!

У этого экшена есть события, как вы уже догадались. А точнее — одно. Думаю, без картинки не заблудитесь и поймете, что надо сделать (если что, в конце поста есть ссылка на исходники).

Создадим новый класс — TWebEngine в файле WebEngineClass. Он будет у нас отвечать за все манипуляции с данными. Окружение — классы TOptions и TTempVariables. TOptions будут хранить данные о базе (с которой мы будем соединяться в следующий раз), а временные вариаблы — информацию о расположении DLL библиотеки на диске и ее имени.

Сервер Microsoft IIS передает нашей библиотеке множество параметров и хочет, чтобы мы ему что-то вернули после работы. Эти объекты представляются как Request: TWebRequest и Response: TWebResponse, которые прописаны как property класса TWebEngine. Просто передадим их в класс в коде экшена:

try
try
WebEngine.Request:= Request;
WebEngine.Response:= Response;

WebEngine.Process;
finally
WebEngine.Free;
end;
except
on E: Exception do
Response.Content:= ‘Internal error. Low lavel problem! ‘ + E.Message + ‘
Contact us noone@nowhere.com’;
end;

Логика кода, надеюсь, ясна — создать класс, передать параметры, запустить обработку (process) и удалить (free) класс. Если что — выдать ошибку.

Разъясняя код метода (да да, именно метода. Функции и процедуры одним словом называются метод) Process хочу в первую очередь указать на то, как разбирается для нас строка параметров http запроса вида

все параметры попадают в Request и могут быть оттуда легко получены вот так:

LocalOptions.Language:= Request.QueryFields.Values[ ‘language’ ];
LocalOptions.TypeOfPage:= Request.QueryFields.Values[ ‘pagename’ ];

То есть никаких шаманств не требуется, хотя возможны при желании!

Код метода Process устанавливает страницей по умолчанию страницу main с языком EnUS (код 1033) и запускает дальнейшую обработку:

// language
// default language is EnUS
LocalOptions.Language:= 1033; // EnUS

// other languagues
if AnsiSameText( Request.QueryFields.Values[ ‘language’ ], ‘En’ ) then
LocalOptions.Language:= 1033; // EnUS

if AnsiSameText( Request.QueryFields.Values[ ‘language’ ], ‘Ru’ ) then
LocalOptions.Language:= 1049; // RuRu

// type of page
// dafault is help page
if Length( Request.QueryFields.Values[ ‘pagename’ ]) UTF8
BufferUTF8String:= UTF8Encode( s );
// setting BOM
BOM[ 0 ]:= 239;
BOM[ 1 ]:= 187;
BOM[ 2 ]:= 191;

try
Stream:= TMemoryStream.Create;
except
on E: Exception do
Begin
LocalOptions.Response.Content:= ‘Error 0x1, TMemoryStream.Create @ TWebEngine.Send ‘ + E.Message;
Exit;
End;
end;

try
try
// writing BOM
Stream.Write( BOM, SizeOf( BOM ));
// writing content
Stream.Write( BufferUTF8String[ 1 ], Length( BufferUTF8String ));
Stream.Position:= 0;

// setting content type
LocalOptions.Response.ContentType:= ‘text/html; charset=UTF-8’;
LocalOptions.response.ContentEncoding:= ‘UTF-8’;

// sending
LocalOptions.Response.ContentStream:= Stream;
LocalOptions.Response.SendResponse;
finally
// DO NOT Stream.Free here!
end;
except
on E: Exception do
Begin
LocalOptions.Response.Content:= ‘Error 0x2 @ TWebEngine.Send ‘ + E.Message;
Exit;
End;
end;

Здесь происходит очень простая вещь — текст перекодируется, записывается в поток и отсылается, как массив байт. Пользователь видит страничку в UTF-8. Магия.

Еще, о чем можно поговорить это TPageProducer. Это замечательный класс, который преобразует тэги вида в шаблонах страницы на любой текст. Происходит это в PageProducerOnHTMLTag — вызывается каждый раз при нахождении такого тэга. Для примера я создал тэг #HeaderCopyright, код которого располагается в файле, и тэг #CopyrightYearsRange, который генерируется в самом ISAPI Extension. Посмотрите исходник, не буду останавливаться на этом моменте, он того не стоит.

Все, с кодом закончили. Самые важные аспекты я осветил, теперь как же запустить это все на отладку? Не как обычное приложение, зеленая кнопка тут бессильна (сперва). Для DLL нужен хост-процесс.

Сперва остановите все службы IIS: net stop IISAdmin в command prompt и Y что вы останавливаете дочерние службы.

Запустите IISAdmin, без дочерних служб: net start IISAdmin.

В Delphi, в свойствах проекта поставьте папку бинарников — папкой публикации IIS узла, включите debug symbols и вообще сделайте, как на картинках:

В самом IIS, если еще не сделали — страница по умолчанию index.dll, ISAPI Extension разрешить в Web Server Extensions и свойствах конкретного узла.

Теперь, по нажатию зеленой кнопки в Delphi запуститься хост-процесс IIS и заработает отладка. Вот, например, нет файла:

А вот что видет пользователь:

Самое вкусное — отладка работает, как в обычном Windows приложении! Всем php разработчикам — завидовать.

Удачи вам, это все, на первый раз. Далее поговорим о соединении с базой данных из ISAPI Extensions.

Код проекта (Delphi 2010): ISPI habr DEMO v1

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Илон Маск рекомендует:  3d ландшафт, directx, исходник

ISAPI

Delphi , Интернет и Сети , CGI и Cookies

На этой страничке вы узнаете как создать и запустить простейшее ISAPI приложение сервера.

1. Запустите Delphi, нажмите на меню File | New

2. В диалоговом окне New Items выберите Web Server Application и нажмите OK

3. Появится диалоговое окно New Web Server Application. Пункт ISAPI/NSAPI Dynamic Link Library выбран по умолчанию, поэтому просто нажмите OK.

4. Вы попали в интерактивную среду разработки ISAPI расширения сервера.

В вашем проекте содержится специальный модуль WebModule, он позволяет помещать в него различные компоненты и обеспечивает работу с ними.

5. Дважды щелкните мышкой на WebModule, появится окно Action Editor, предназначенное для создания и редактирования обработчиков событий ActionItem.

6. В диалоговом окне Action Editor нажмите кнопку Add New, при этом в окне Object Inspector отобразятся свойства и события созданного ActionItem.

7. Установите свойство Default созданного ActionItem равным true.

8. Создайте обработчик события OnAction для созданного ActionItem и напишите в него код:

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


9. Нажмите на меню File | Save All, выберите имена main.pas и helloisapi.dpr для файлов проекта и сохраните их на диск.

10. Нажмите на меню Project | Build helloisapi. Будет скомпилирован файл helloisapi.dll.

11. Поместите полученный файл в каталог для ISAPI DLL вашего веб сервера. Для IIS 4.0 это каталог /cgi-bin/. Проверьте установлено ли право execute на этот каталог в веб сервере и установите доступ на чтение и запуск для соответствующих пользователей в NTFS.

12.Запустите на выполнение ваше приложение, набрав в браузере полный URL. Например, если ваш сервер имеет URL http://localhost, вы положили DLL в каталог /cgi-bin/, то полный URL будет http://localhost/cgi-bin/helloisapi.dll.

Статья ISAPI раздела Интернет и Сети CGI и Cookies может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

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

Расширения ISAPI

Интерфейс Internet Server Application Program Interface ( ISAPI ) предназначен для программирования приложения ( API ) информационных служб интернета ( IIS ). ISAPI состоит из классов поддержки и структур, участвующих в программной эксплуатации IIS . Веб-приложения, использующие ISAPI для взаимодействия с IIS , реализуют это взаимодействие на веб-сервере Windows наиболее эффективным образом. При работе с ISAPI уровень программного обеспечения поддержки или интерфейсов между IIS и веб-приложением сильно снижается. Все программное обеспечение веб-приложений Microsoft прямо или косвенно использует технологию ISAPI . Технологии Microsoft Application Server Pages ( ASP ) и . NET Framework построены как приложения ISAPI .

Изначально ISAPI распространялся среди разработчиков CGI как альтернатива программам CGI или как обновление исполняемого файла CGI . Многие исполняемые файлы CGI написаны на C++ или C, поэтому интеграция существующего веб-приложения CGI не очень сложна. Преобразование веб-приложения CGI для использования ISAPI увеличивает производительность веб-приложения. CGI при каждом HTTP -запросе создает новый процесс, что занимает много ресурсов несущего сервера. Расширения ISAPI загружаются в пространство процесса IIS , поэтому узлу не нужно создавать новый процесс при каждом HTTP -запросе. Поскольку Windows загружает динамически подключаемую библиотеку в пространство памяти один раз при первом вызове функции в DLL и хранит ее там неопределенный промежуток времени, расширение ISAPI остается загруженным и не удаляется, до тех пор пока сервер IIS не будет выключен или не будет выгружен экземпляр или виртуальная память . Таким образом, компания Microsoft дает программистам основание использовать ISAPI вместо CGI и легко обновлять ПО , созданное при помощи CGI .

ISAPI рекомендуется для программистов, создающих (или уже создавших) приложение на языке C++, предназначенное для продажи на рынке ПО . Если важным фактором является производительность , и на разработку выделяется больше времени, чем на создание обычного сценария для интернета, рассмотрите вариант использования ISAPI . Кроме всего прочего, ISAPI выполняет на несущем узле некоторые задачи, которые нельзя выполнить при помощи других технологий. Программное обеспечение ISAPI создано таким образом, что при его выполнении другие веб-приложения, написанные на языках сценариев с использованием других расширений ISAPI (например, . NET Framework или ASP . DLL ), не рассматривают задачи, выполняемые расширением ISAPI .

К недостаткам рассматриваемой технологии относится сложность ISAPI в работе и в отладке. Отладка кода в интегрированной среде разработки (Integrated Design Environment , IDE ) Visual Studio . NET довольно сложна, и, поскольку IIS представляет собой процесс с несколькими нитями, результаты отладки могут быть непредсказуемыми. Малейшая ошибка в приложении ISAPI катастрофически сказывается на производительности IIS . По сравнению со другими средами разработки ISAPI весьма чувствительна к ошибкам при построении веб-приложения.

Кроме всего прочего, код ISAPI создается с помощью неконтролируемого кода C++. Новые возможности, предлагаемые Visual Studio . NET для управляемого кода C++ в технологии . NET Framework, нельзя использовать в проекте ISAPI .

Примечание. Если программа создается с помощью контролируемого кода, то в этом случае реализуется технология.NET Framework. Эта технология используется языками C# и Visual Basic. Термин «контролируемый» означает, что технология .NET Framework контролирует очистку памяти, отведение памяти и другие процессы управления ресурсами низкого уровня. Программа на C++ не сможет работать с технологией .NET Framework, если не применяются Managed Extensions (Контролируемые расширения) для C++. Контролируемый C++ означает использование технологии .NET Framework и контролируемых расширений C++. Код C++, созданный без использования контролируемых расширений C++, является неконтролируемым кодом C++.

Обзор архитектуры ISAPI

Приложения ISAPI представляют собой библиотеки DLL , напрямую взаимодействующие с IIS API . Программное обеспечение ISAPI – это расширение или фильтр. Расширения ISAPI являются библиотеками DLL , вызываемыми посредством квалифицированного запроса в IIS . Фильтры ISAPI вызываются независимо от других запросов IIS . Запросы HTTP передаются напрямую расширению ISAPI с помощью ссылки URL или данных, отправляемых из формы HTML . Расширение ISAPI может вызываться косвенно посредством связывания файла с определенным расширением ISAPI в IIS . При установке связей файлов выполняются действия, аналогичные ассоциированию файлов ответа сервера (SRF) с конкретным расширением ISAPI в ATL Server (см. «Сервер ATL» ). Можно настроить реагирование фильтров ISAPI на запросы согласно приоритету; это отличает их от других фильтров, загружаемых в IIS . Фильтры используются в специализированных приложениях, связанных с IIS , и обычно выполняют следующие задачи:

  • шифрование;
  • ведение журналов;
  • аутентификация;
  • сжатие данных.

Расширения ISAPI – наиболее частый способ применения ISAPI . Фильтры ISAPI довольно сложны в создании, и сфера их использования ограничена. Данная тема выходит за рамки книги и рассматриваться не будет.

Анатомия URL

URL представляет собой строку, указывающую конкретный ресурс на сервере в интернете. URL формируется согласно следующему синтаксису:

Ниже приведен URL, реализующий запрос файла ISAPI DLL с именем SEUX.dll . В URL указаны параметры parm1 и parm2 . В таблице 5.1 данный URL разбит на части, чтобы показать, как определяется обычный URL, осуществляющий запрос библиотеки ISAPI DLL.

Многие компоненты URL используются для описания значений серверных переменных, о которых мы поговорим позже. Обратите внимание, что поля, отсутствующие в примере, редко встречаются в URL. В качестве примера приведен наиболее распространенный общий URL.

Если ISAPI DLL запрашивается напрямую через ссылку URL, в секции url-путь определяется имя файла библиотеки DLL расширения ISAPI. В секции URL располагаются пары параметр = значение, передаваемые расширению ISAPI с помощью этой секции или посредством отправки данных HTTP из формы HTML.

Расширения ISAPI во взаимодействии с IIS

Если IIS получает запрос и считает, что необходимо использовать расширение ISAPI (запрошен файл, связанный с расширением ISAPI или само расширение ISAPI), то IIS передает запрос HTTP вместе с расширением ISAPI. Чтобы расширение ISAPI получило запрос HTTP, используется определенный программный интерфейс. Как известно, приложение ISAPI содержит файлы заголовков ISAPI, определяющих структуры и классы. Расширение ISAPI примет запрос посредством используемого интерфейса API, и данные запроса HTTP будут загружены в структуры и классы, являющиеся компонентами ISAPI.

Таблица 5.1. Компоненты URL
Компонент URL Значение из примера
схема http
пользователь Отсутствует в демонстрационном URL
пароль Отсутствует в демонстрационном URL
узел amd1700v2
порт Отсутствует в демонстрационном URL (подразумевается значение 80)
url-путь simpleisapi/folder1/folder2/SEUX.dll/PATH_INFO
дополнительная информация ?parm1=value1&parm2=value

Расширение ISAPI анализирует данные HTTP-запроса и направляет вызовы другому программному обеспечению, например, программе бизнес-уровня (см. рис. 5.1). Ответы этой программы формируются в виде HTTP-ответов и возвращаются в IIS. IIS возвращает ответ расширения ISAPI веб-пользователю, направившему изначальный запрос.

Архитектура, показанная на рисунке 5.1, позволяет использовать расширения ISAPI двумя возможными способами, но не является единственным вариантом технологии. Единственным ограничением является вызов расширения ISAPI при HTTP-запросе и наличие структур и классов, содержащих HTTP-запрос и поддерживающих программное взаимодействие с ответом HTTP и запросом HTTP. Построение абстракции логики – задача разработчика. Направление вызовов библиотеке бизнес-логики необязательно, если бизнес-логика заключена в самом расширении ISAPI. Так как ISAPI напрямую записывает данные в HTTP-запрос, следует создавать архитектуру, абстрагирующую логику представления для исключения повторной компиляции ISAPI DLL при изменении логики представления.

Сравнение ISAPI с сервером ATL

При сравнении ATL Server и ISAPI основным различием является то, что ISAPI в меньшей степени поддерживает инфраструктуру и наличие архитектуры. ISAPI для расширений (в отличие от фильтров) состоит из функций API и структур и классов, являющихся параметрами функций API. ATL Server представляет много новых вспомогательных классов, макросов и функций и выполняет по отношению к ISAPI задачи, аналогичные классам Microsoft Foundation >ATL Server является дополнительным уровнем программирования, позволяющим оптимально использовать технологии. ATL Server поддерживает разработчика, который создает взаимодействующий с ISAPI программный продукт, предоставляя ему соответствующие методы и вспомогательное программное обеспечение. Разработчик может выбирать используемое ПО (иногда это является сложной задачей). В подобных обстоятельствах ISAPI послужит удобной альтернативой. В отличие от ATL Server ISAPI не предлагает никакой абстракции типа логики, и, кроме этого, имеется не очень много информации об ISAPI. Можно использовать классы ATL Server в приложении ISAPI без применения шаблона проекта ATL Server. В качестве альтернативы шаблон проекта ATL Server настраивается на использование одной библиотеки DLL без каких-либо опций, что создает структуру проекта, похожую на проект ISAPI.

Windows 7 x64, IIS, ISAPI и DataSnap XE2 в картинках.

Сегодня решил немного побаловаться с DataSnap XE2, разработать небольшую ISAPI-dll и посмотреть как всё это будет работать под управлением моей Windows 7 x64. Надо сказать, что простейший примерчик такого приложения собрался и заработал почти без проблем. Как Вы наверняка знаете, наиболее часто для выполнения операций на сервере используется интерфейс CGI, CGI-скрипты и т.д. Однако компания Microsoft в свое время предложила свой вариант исполнения серверных программ, который называется ISAPI (Internet Server API). В первую очередь ISAPI предназначался для подключения к web-серверу Microsoft под названием Internet Information Server (IIS). Программы ISAPI представляют собой давно известные нам динамически загружаемые библиотеки DLL, которые вызываются Web-сервером, загружаются в память и становятся как бы частью этого Web-сервера, расширяя или изменяя его функциональность. Сейчас для сервера Apache (самого популярного web-сервера) имеется модуль mod_isapi.dll, который позволяет запускать ISAPI-dll. Вообще, если рассуждать о популярности того или иного веб-сервера, то лучше всего начать с посещения вот этого сайта, но мы сегодня не об этом и даже не о том кто круче/быстрее/удобнее IIS или Apache, а о том как написать программку, которая заработает под управлением IIS 7.5 в Windows 7 x64.

Содержание статьи:

Начнем с того, что настроим наш web-сервер IIS.

Установка и настройка IIS в Windows 7

проходит следующим образом: 1. Заходим в «Панель управления -> Программы и компоненты» и выбираем «Включение или отключение компонентов Windows»: 2. В открывшемся окне ищем «Службы IIS» и выбираем следующие необходимые компоненты для установки. Т.к. мне сегодня пришлось достаточно много экспериментировать с IIS, то мой список установленных компонентов оказался таким: 3. Жмем «Ok» и терпеливо ожидаем окончания установки. На этом шаге установка IIS завершена и можно приступать к настройке web-сервера, созданию и тестированию сайта. И здесь может проявиться то самое «почти» без которого я бы мог в начале поста сказать, что «примерчик такого приложения собрался и заработал почти без проблем«. Итак: 4. Заходим в «Панель управления -> Администрирование» и находим там «Диспетчер служб IIS«: Вот здесь и настраивается будущий сайт. По умолчанию, после установки компонентов у Вас на диске C:\\ появится дирректория c:\inetpub\ в которой будут храниться служебные файлы сервера и файлы сайта(-ов), с которыми вы будите работать. При установке в диспетчере уже будет находится один дефолтный сайт, но мы, для порядка создадим свой. 5. В дереве «Подключения» выбираем узел «Сайты», вызываем контекстное меню и выбираем «Добавить веб-сайт…»: 6. В открывшемся окне задаем настройки нашего сайта. На рисунке ниже показаны, которые практически не отличаются от дефолтных (различается только название сайта и его физическое расположение): Теперь в дереве подключений у Вас появился новый сайт «DataSnapSite» который по-идее должен бы запускаться с URL ‘http://localhost’, но, как оказалось, происходит это не всегда: Покопался по Сети в поисках ответа. Оказалось, что у кого-то сайт с такими настройками, как показано выше, работал без проблем, у других — через раз возникали проблемы с ASP.NET у кого-то, как и у меня, сайт вообще не открывался. Может причина в версии IIS, а может и нет, но для себя я нашел два возможных варианта решения этой проблемы: вариант 1: смотрим приложения, которые «слушают» 80-й порт — это могут быть Skype, TeamViewer и другие программки, работающие с сетью. Отключаем эти программы, перезагружаем IIS и снова пробуем зайти на сайт в браузере. вариант 2: если первый вариант не помог, то идем в IIS диспетчере в «Подключения», выбираем наш сайт и меняем ему привязку, на, например, вот такую: можете также, если необходимо, сменить и порт. После этого сайт должен заработать — можете бросить в корневую директорию сайта файлик index.html и посмотреть на него в браузере: Сайт заработал и на текущем этапе работы нам этого будет достаточно. Мы ещё вернемся к работе с диспетчером IIS и посмотрим, какие ещё возможные проблемы могут возникнуть, а пока идем в Delphi и создаем наше первое приложение ISAPI с DataSnap XE2.

Илон Маск рекомендует:  Получить параметры переданные в url

Создаем заготовку ISAPI DLL

Запускаем Delphi и выбираем «File -> New -> Other -> DataSnap Server -> DataSnap WebBroker Application«: В первом шаге помощника выбираем третий пункт — «ISAPI dynamic link library» и жмем Next: На втором и третьем шаге можно оставить все установки по умолчанию. В итоге в менеджере проектов появится новый проект с таким содержанием: ServerMethodsUnit1, как уже понятно из названия будет содержать серверные методы, а модуль WebModule1 содержать компоненты, которые с помощью которых наша ISAPI-dll станет сервером DataSnap и модуль будет выглядеть вот так: Можно сказать, что уже то, что было сделано с использованием помощника — это уже готовая к использованию DLL. Но, пока не будем сильно спешить, а посмотрим на содержимое нашей DLL. Открываем исходный код библиотеки и видим, что наша DLL экспортирует три метода:

Что такое код hello isapi

ISAPI — est l acronyme de Internet Server Application Programming Interface. Il s agit de l interface de programmation (ou API) de l application IIS de Microsoft. Elle a été conçue par Process Software Corporation, Microsoft Corporation et un petit… … Wikipédia en Français

ISAPI — [Abk. für Internet Server Application Programming Interface, dt. »Programmierschnittstelle für Anwendungen, die auf einem Internet Server laufen«], eine Schnittstelle, mit der Anwendungen auf einem Server programmiert werden können. Damit… … Universal-Lexikon

ISAPI — Internet Server API (ISAPI) ist eine Programmierschnittstelle (Application Programming Interface) von Microsoft, die im Microsoft Internet Information Services (Webserver), dem Microsoft Exchange Server und im Microsoft Internet Security and… … Deutsch Wikipedia

ISAPI — Internet Services API Es una interfaz, de programación de aplicaciones (API) para el serv >Wikipedia Español

ISAPI — Internet Server Application Programming Interface (Computing » Software) … Abbreviations dictionary

ISAPI — Internet server application program interface … Medical dictionary

ISAPI — Internet Shopping/Service Application Programming Interface … Acronyms

ISAPI — ● ►en sg. f. ►INTERNET Internet Server Application Programming Interface. spécification des DLL pouvant être utilisées par les serveurs web de Microsoft … Dictionnaire d’informatique francophone

ISAPI — Internet Shopping/Service Application Programming Interface … Acronyms von A bis Z

ISAPI — • Internet server application program interface … Dictionary of medical acronyms & abbreviations

ISAPI Extensions for IIS or How to write CMS on Delphi

Introduction

Почему большое количество Web разработчиков пишут сайты на скриптах, вроде PHP? Я, лично, не понимаю и использую другой способ — ISAPI Extensions for IIS.

ISAPI Extensions (расширения Web сервера) — простая DLL библиотека с парой функций, которые обрабатывают запрос пользователя к Web серверу и возвращают ответ. Точнее — одна функция, остальные служат для регистрации/разрегистрации DLL в рабочем процессе IIS.

Из этого следует, что, по сравнению с другими способами, такими, как скрипты, ISAPI Extensions выигрывают по:

  1. Скорость работы. DLL загружается в рабочий процесс IIS и находится в памяти всегда, а не читается с диска при каждом обращении. Не требуется интерпретатор языка — код нативный и исполняется непосредственно процессором;
  2. Функционал. Вы можете использовать любую другую DLL или любой вызов WinAPI. Теоретически возможно специально сформированным http запросом отформатировать диск
  3. Защищенность. Ваш код очень сложно проанализировать и понять, как взломать сайт — нативный код человеком плохо читается
  4. У вас есть нормальный отладчик во время разработки! Самый вкусный момент. Можете делать step-by-step trace, стэк и память доступны для анализа.

Есть и некоторые ограничения, как и везде, но их сложно назвать недостатками:

  1. Требуется IDE для разработки;
  2. Невозможно просто взять и поправить 2 строчки в скрипте на сервере — требуется пересобрать проект, как любое Windows приложение;
  3. Вероятность завалить рабочий процесс IIS с ошибкой Acceess violation at address (не бояться, он просто перезапустится);
  4. Различные security violations, связанные с возможностью делать, что хочешь. Хотя, это уже точно вопрос к админам, как они раздадут права на сервере.
  5. Ваши друзья — php кодеры вас не поймут и назовут дураком, если вы передадите им такую CMS. Еще они не смогут ее установить :D

Your first ISAPI Entension

Итак, приступим к работе. Я буду использовать Delphi 2010 и IIS 6 под Windows Server 2003 R2 EnUS.

Добрые Борландны, еще много лет назад, упростили процесс работы с ISAPI до предела. Чтобы начать выберем File -> New -> Other и выберите WebBooker -> Web Server Application. Далее кликаете ISAPI/NSAPI Dynamic Link Library и нажмите OK.

Вот и все, ваша первая ISAPI Extension готова. Пока она ничего не возвратит Web серверу конечно, но если ее откомпилировать, то она готова к работе. Компилировать нужно, нажимая не зеленую стрелочку, а Ctrl+F9.

Переключитесь на Unit1 и выберите Action Editor для объекта WebModule1. Об экшенах поговорим в другой раз, пока нужно просто создать default action, который будет обрабатывать все наши запросы.

Приведите внешний вид свойств объекта, как на картинке :

У этого экшена есть события, как вы уже догадались. А точнее — одно. Думаю, без картинки не заблудитесь и поймете, что надо сделать (если что, в конце поста есть ссылка на исходники).

Web Engine Class

Создадим новый класс — TWebEngine в файле WebEngineClass.pas. Он будет у нас отвечать за все манипуляции с данными. Окружение — классы TOptions и TTempVariables. TOptions будет хранить данные о базе (с которой мы будем соединяться в следующий раз), а временные вариаблы — информацию о расположении DLL библиотеки на диске и ее имени.

Сервер Microsoft IIS передает нашей библиотеке множество параметров и хочет, чтобы мы ему что-то вернули после работы. Эти объекты представляются как Request: TWebRequest и Response: TWebResponse, которые прописаны как property класса TWebEngine. Просто передадим их в класс в коде экшена:

try
try
WebEngine.Request:= Request;
WebEngine.Response:= Response;
WebEngine.Process;
finally
WebEngine.Free;
end;
except
on E: Exception do
Response.Content:= ‘Internal e rror. Low lavel problem! ‘ + E.Message + ‘ Contact us noone@nowhere.com’;
end;

Логика кода, надеюсь, ясна — создать класс, передать параметры, запустить обработку (process) и удалить (free) класс. Если что — выдать ошибку.

Разъясняя код метода (да да, именно метода. Функции и процедуры одним словом называются метод) Process хочу в первую очередь указать на то, как разбирается для нас строка параметров http запроса вида

все параметры попадают в Request и могут быть оттуда легко получены вот так:

LocalOptions.Language:= Request.QueryFields.Values[ ‘language’ ];
LocalOptions.TypeOfPage:= Request.QueryFields.Values[ ‘pagename’ ];

То есть никаких шаманств не требуется, хотя возможны при желании!

Код метода Process устанавливает страницей по умолчанию страницу main с языком EnUS (код 1033) и запускает дальнейшую обработку:


// language
// default language is EnUS
LocalOptions.Language:= 1033; // E nUS

// other languagues
if AnsiSameText( Request.QueryFields.V alues[ ‘language’ ], ‘En’ ) then
LocalOptions.Language:= 1033; // EnU S
if AnsiSameText( Request.QueryFields.V alues[ ‘language’ ], ‘Ru’ ) then
LocalOptions.Language:= 1049; // RuR u
// type of page
// dafault is help page
if Length( Request.QueryFields.Values[ ‘pagename’ ])
else
LocalOptions.TypeOfPage:= Request.Qu eryFields.Values[ ‘pagename’ ];

try
try
if LocalOptions.TypeOfPage = ‘i nfo’ then
Begin
PageInfoShow;
Exit;
End;

if LocalOptions.TypeOfPage = ‘m ain’ then
Begin
PageMainShow;
Exit;
End;

// common page
PageCommonShow;
except
on E: Exception do
Begin
PageResponse.Clear;
PageResponse.Text:= ‘Inter nal error ‘ + E.Message;
End;
end;
finally
Send( PageResponse.Text );
end;

Код, в силу красоты языка Delphi, не требует комментариев вообще, если вы конечно знаете хоть немного этот самый EnUS.

Страница info — чудесная страница отладки, если на нее зайти можно посмотреть все переменные, что бзаузер посылает серверу.

Страница help — просто какае-то страница на сервере. Обрабатывается PageCommonShow (остальные страницы привилегированные, у них у каждой свой собственный метод).

Non-ANSI Encoding Problem

Ах, да. Что такое PageResponse? Это не объект сервера IIS, это собственный объект класса ВебДвигателя. Тут я создал лишнюю работу, потому что, вы не поверите, но TWebResponse не умеет возвращать странички в UTF-8 или любой кодировке, кроме ANSI. По этому, пока идет обработка, весь код странички копится в объекте PageResponse типа TStringList (в кодировке UCS2LE) и перекодируется во время вызова Send( PageResponse.Text ). Это — самый главный секрет написания ISAPI Extension на Delphi, теперь и вы его знаете.

Давайте посмотрим код метода Send поближе:

// encoding the string USC2LE -> UT F8
BufferUTF8String:= UTF8Encode( s ) ;
// setting BOM
BOM[ 0 ]:= 239;
BOM[ 1 ]:= 187;
BOM[ 2 ]:= 191;

try
Stream:= TMemoryStream.Create;
except
on E: Exception do
Begin
LocalOptions.Response.Content:= ‘Error 0x1, TMemoryStream.Create @ TWebE ngine.Send ‘ + E.Message;
Exit;
End;
end;

try
try
// writing BOM
Stream.Write( BOM, SizeOf( BOM ));
// writing content
Stream.Write( BufferUTF8String[ 1 ], Length( BufferUTF8String ));
Stream.Position:= 0;

// setting content type
LocalOptions.Response.ContentType: = ‘text/html; charset=UTF-8’;
LocalOptions.response.ContentEncod ing:= ‘UTF-8’;

// sending
LocalOptions.Response.ContentStrea m:= Stream;
LocalOptions.Response.SendResp onse;
finally
// DO NOT Stream.Free here!
end;
except
on E: Exception do
Begin
LocalOptions.Response.Content:= ‘Error 0x2 @ TWebEngine.Send ‘ + E.Messa ge;
Exit;
End;
end;

Здесь происходит очень простая вещь — текст перекодируется, записывается в поток и отсылается, как массив байт. Пользователь видит страничку в UTF-8. Магия.

Page Producer

Еще, о чем можно поговорить это TPageProducer. Это замечательный класс, который преобразует тэги вида в шаблонах страницы на любой текст. Происходит это в PageProducerOnHTMLTag — вызывается каждый раз при нахождении такого тэга. Для примера я создал тэг #HeaderCopyright, код которого располагается в файле, и тэг #CopyrightYearsRange, который генерируется в самом ISAPI Extension. Посмотрите исходник, не буду останавливаться на этом моменте, он того не стоит.

How To Debug?

Все, с кодом закончили. Самые важные аспекты я осветил, теперь как же запустить это все на отладку? Не как обычное приложение, зеленая кнопка тут бессильна (сперва). Для DLL нужен хост-процесс.

Сперва остановите все службы IIS: net stop IISAdmin в command prompt и Y что вы останавливаете дочерние службы.

Запустите IISAdmin, без дочерних служб: net start IISAdmin.

В Delphi, в свойствах проекта поставьте папку бинарников — папкой публикации IIS узла, включите debug symbols и вообще сделайте, как на картинках:

В самом IIS, если еще не сделали — страница по умолчанию index.dll, ISAPI Extension разрешить в Web Server Extensions и свойствах конкретного узла.

Теперь, по нажатию зеленой кнопки в Delphi запуститься хост-процесс IIS и заработает отладка. Вот, например, нет файла:

А вот что видет пользователь:

Самое вкусное — отладка работает, как в обычном Windows приложении! Всем php разработчикам — завидовать.

Удачи вам, это все, на первый раз. Далее поговорим о соединении с базой данных из ISAPI Extensions.

Пишем ISAPI-расширение

Автор: Алексей Остапенко
NetInvest

Опубликовано: 01.04.2003
Исправлено: 13.03.2005
Версия текста: 1.2

А что это собственно такое?

ISAPI или Internet Server Application Programming Interface — это набор интерфейсов, предоставляемых веб-сервером для написания приложений, взаимодействующих с IIS и расширяющих его возможности. Такие приложения могут принадлежать к двум типам — ISAPI-расширение и ISAPI-фильтр.

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

Расширение, наоборот, является адресатом запроса и не может влиять на его параметры и путь обработки. ISAPI-расширения IIS — это альтернатива CGI-приложениям. Расширения (и фильтры) реализуются в виде dll. IIS загружает dll при первом запросе к расширению и выгружает ее либо при выгрузке веб-приложения (если включено кэширование ISAPI), либо после окончания обработки запроса (если кэширование выключено). ISAPI-расширение может быть вызвано как явно (путем запроса вида http://. /myisapi.dll?params), так и неявно (через карту расширений или при отображении на него запроса с помощью фильтра).

Илон Маск рекомендует:  Что такое код dbplus_lockrel

А зачем это нужно?

Зачем нужны ISAPI-расширения, если есть CGI, ASP и т.д.? Ответ — они быстрее и требуют меньших ресурсов. В отличии от CGI, ISAPI-раширения многопоточны, т.е. для обработки еще одного запроса не требуется загрузки еще одной копии приложения. По сравнению с ASP, они имеют гораздо больше возможностей (использование множества функций Win32 API без необходимости писать для этого COM-объекты) и существенно выигрывают по скорости, т.к. код уже откомпилирован и оптимизирован. Правда, наряду с преимуществами имеются и недостатки, такие как большая сложность программирования и отсутствие поддержки сессий. Тем не менее, ISAPI-расширения наиболее хорошо подходят для написания критичных по времени приложений для IIS.

Устройство типичного ISAPI-расширения.

Любое ISAPI-расширение должно экспортировать три обязательные функции:

  • BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO* pVer) ;
  • BOOL WINAPI TerminateExtension(DWORD dwFlags) ;
  • DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpECB) .

Прототипы этих трех функций и все используемые в ISAPI структуры описаны в файле httpext.h , который мы будем подключать к своему проекту. Чтобы экспортировать эти функции, мы используем файл myisapi.def , добавив его в ресурсы проекта.

Реализация GetExtensionVersion.

Эта функция должна установить версию и описание ISAPI-расширения и вернуть TRUE . Если функция возвратит FALSE , расширение не будет загружено. Внутри GetExtensionVersion может быть проделана необходимая инициализация. Т.к. мы пишем прототип «серьезного» расширения, в нашем случае здесь будет происходить считывание параметров из реестра, подключение к логу сообщений Windows NT, инициализация семафора, создание порта завершения ввода/вывода (I/O completion port) и порождение нитей для пула.

В первом варианте (версии 1.0), я совершил тактическую промашку, создавая рабочие нити непосредственно перед началом обработки и завершая их в конце. Поскольку на создание нити тоже тратится какое-то время, при большом количестве запросов и коротком цикле обработки скорость работы приложения существенно снижается. В частности, новый вариант по моим тестам получился примерно на 25 процентов быстрее исходного (420 запросов в секунду против 340 в исходном варианте).

На этом проблемы, увы, не закончились. Ярослав Говорунов, в процессе нашей совместной работы над ISAPI_Rewrite 2.0, обнаружил грубое несоответствие реального процесса инициализации ISAPI-расширения процессу описанному в MSDN при отключенном кешировании ISAPI-расширений. MSDN утверждает, что функции GetExtensionVersion и TerminateExtension вызываются IIS’ом по одному разу (первая в самом начале, вторая — перед выгрузкой). На деле же оказалось, что в вышеупомянутых условиях вызов GetExtensionVersion и TerminateExtension выполняется для каждого потока IIS. Поэтому в версии 1.2 была добавлена синхронизация вызовов GetExtensionVersion и TerminateExtension с помощью глобальной критической секции.

Итак, из реестра будут считываться три параметра — количество нитей в пуле dwMaxThreads , время ожидания освобождения очереди dwQueueTimeout и максимальное количество запросов в очереди dwQueueSize . Семафор понадобится для отслеживания ограничения на количество запросов в очереди (в принципе, если не ожидается большого наплыва запросов, то от него можно спокойно избавиться). Здесь же будет создаваться основа пула нитей — порт завершения ввода/вывода, и сами нити, обслуживающие запросы. Вот как будет выглядеть код GetExtensionVersion :

Обратите внимание, что создание новой нити осуществляется с помощью функции CRT _beginthread . Это необходимо, если внутри ExtensionThreadProc вы собираетесь использовать функции CRT. Если же функции CRT вам не нужны, вы можете заменить вызов _beginthread на CreateThread , только не забудьте затем освободить дескриптор нити (функция _endthread делает это автоматически, поэтому в этом примере не нужно беспокоиться об освобождении дескриптора).

Реализация TerminateExtension.

Функция TerminateExtension вызывается перед выгрузкой ISAPI-расширения из памяти. Этот вызов позволяет расширению освободить все используемые ресурсы. В нашем примере эта функция будет иметь следующий вид:

Реализация HTTPExtensionProc.

Итак, мы подошли к одной из основных частей ISAPI-расширения. Именно эту функцию вызывает IIS для обработки запроса, передавая ей в качестве параметра указатель на структуру EXTENSION_CONTROL_BLOCK , описывающую контекст запроса. Если ваше расширение не занимается длительной обработкой запроса, то вы можете реализовать всю логику непосредственно внутри этой функции. Однако, если расширение производит длительные вычисления, работает с базой данных и т.п., то рекомендуется производить обработку запроса в отдельной нити. Это связано с тем, что пул нитей IIS, принимающих запросы, ограничен (по умолчанию 20 нитей). И если вы исчерпаете этот пул, ваш сервер будет неспособен начать обслуживание вновь поступающих запросов. Чтобы этого избежать, «большое» ISAPI-расширение создает свой собственный пул нитей, в которых обрабатываются запросы. В такой схеме, HTTPExtensionProc возвращает управление сразу после начала обработки запроса, сообщая IIS, что запрос продолжает обрабатываться, с помощью кода возврата HSE_STATUS_PENDING . Вот как выглядит возможная реализация HTTPExtensionProc с пулом ниток:

Пул нитей работает следующим образом: в GetExtensionVersion создается порт завершения ввода/вывода, управляющий потоками обработки. Каждый новый запрос ставится в очередь обработки (если не достигнут лимит размера очереди, отслеживаемый с помощью семафора) с помощью вызова PostQueuedCompletionStatus , при этом указатель на EXTENSION_CONTROL_BLOCK передается вместо указателя на структуру OVERLAPPED . Нити обработки ждут на порте завершения ввода/вывода посредством вызова GetQueuedCompletionStatus . I/O completion port регулирует выполнение рабочих потоков следующим образом: он позволяет параллельно выполняться не более чем заданному числу потоков (это число определяется последним параметром вызова CreateIoCompletionPort. В данном примере это число равно чилу процессоров в системе). Если в очереди порта есть сообщения, и число работающих (не ожидающих в GetQueuedCompletionStatus ) потоков меньше максимального, то один из ждущих потоков освобождается для обработки сообщения.

ПРИМЕЧАНИЕ
Можно подумать, что в таком случае нет смысла создавать пул с количеством нитей большим, чем ограничение порта завершения ввода/вывода. Однако это не совсем так. Если связанная с портом нитка будет блокирована на каком-либо другом объекте (семафоре, мьютексе и т.п.), то вместо нее может быть освобождена другая нитка. Таким образом реальное число выполняющихся потоков может временно превышать установленное ограничение.

Реализовав пул нитей, мы переложили всю обработку запроса на функцию ExtensionThreadProc , которой мы и займемся далее.

Реализация ExtensionThreadProc.

Ну вот, в прошлом разделе мне удалось отвертеться от реализации функциональной части расширения. Теперь придется наконец за нее взяться. В качестве примера мы будем либо вычислять произведение параметров a и b запроса (если они присутствуют), либо возвращать все заголовки HTTP-запроса в том виде, в котором они дошли до расширения.

Сначала мы проанализируем строку запроса, которая содержится в поле lpszQueryString структуры EXTENSION_CONTROL_BLOCK на предмет наличия в ней параметров a и b . Если оба параметра присутствуют, то мы используем их произведение для формирования ответа. Если же хотя бы один параметр отсутствует, то мы используем функцию GetServerVariable , указатель на которую содержится в структуре EXTENSION_CONTROL_BLOCK для получения заголовков HTTP.

Затем мы сформируем свой заголовок ответа и отправим его, используя функцию ServerSupportFunction . После чего, использую функцию WriteClient , отправим тело ответа. В любом случае, в конце мы сообщим IIS об окончании обработки с помощью еще одного вызова ServerSupportFunction . Вот как будет выглядеть наша реализации ExtensionThreadProc :

Как вы можете убедиться, ничего сильно сложного в написании ISAPI-расширений нет. Однако, если эта задача все же показалось вам сложной, вы можете писать свои ISAPI-расширения, используя MFC. Мастер проектов VC включает возможность создания каркаса ISAPI-расширений, использующих MFC-классы CHTTPServer и CHTTPServerContext , которые позволяют существенно упростить такие операции, как получение параметров из строки запроса. Однако, при этом сильно увеличивается объем кода и частично снижается производительность. Я сам начинал писать ISAPI-приложения, иcпользуя классы MFC. Написав один фильтр и три расширения, я решил для себя, что от MFC лучше отказаться.

Запись сообщений в Event Log NT.

В рассматриваемом примере используется лог сообщений NT. Данный раздел содержит описание того, как с ним работать. Если вас это не интересует, вы можете спокойно пропустить этот раздел и перейти к отладке.

Перед началом записи в лог приложение должно зарегистрировать источник событий. Это делается при помощи функции RegisterEventSource . В качестве первого параметра ей передается UNC-имя машины, к логу которой мы желаем обращаться (в нашем случае это локальный лог). Второй параметр — имя источника, которое предварительно должно быть зарегистрировано в реестре NT. Для регистрации источника событий в реестре нужно будет один раз запустить прилагаемый к проекту файл MyISAPI.reg . Реализация саморегистрации в данном случае нежелательна, т.к. у вашего расширения скорее всего не будет прав на запись в ключ HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog\Application\ реестра.

После успешной регистрации источника событий наше расширение может начать записывать в лог сообщения. Сообщения могут быть как простыми строками текста, так и заранее подготовленными сообщениями с параметрами. В данном примере используются сообщения, хранящиеся в отдельном модуле MyISAPIMsg.dll (именно он регистрируется в реестре). Для создания этого модуля нам потребуется написать файл, определяющий сообщения, и придется воспользоваться компилятором сообщений mc.exe . Файл сообщений MyISAPIMsg.mc будет иметь следующую вид:

Как вы можете видеть, в начале файла идет описание языков сообщений. Затем идут собственно описания сообщений, причем каждое сообщение может содержать текст на нескольких языках.

ПРИМЕЧАНИЕ
Обратите внимание на точки после текстов сообщений — это не ошибка, это признак конца текста.
В этом примере все сообщения не имеют параметров, однако никто не мешает вам их добавить. Текст сообщения с параметрами имеет вид Part1 %1 part2 %2. . Если вам требуется более подробное описание формата файлов сообщений, обратитесь к документации по компилятору сообщений mc.exe .
ПРИМЕЧАНИЕ
Интересной особенностью компилятора сообщений mc.exe является то, что текстовые строки должны задаваться не в ANSI-кодировке, а в OEM-кодировке (например, cp866, а не cp1251 для русского языка).

Помимо файла сообщений нам потребуется файл-болванка для создания библиотеки MyISAPIMsg.c с таким содержимым:

Далее, удалите debug-конфигурацию из подпроекта MyISAPIMsg и добавьте следующие команды в Pre-link step:

Затем, добавьте следующую строку к командной строке компоновщика:

(флаг /noenty нужен для уменьшения размеров модуля, поскольку мы собираемся создать чисто ресурсную библиотеку).

Теперь соберите проект. Вы получите файл MyISAPIMsg.dll , содержащий нужные ресурсы. Перепишите этот файл в системный каталог NT (либо подправьте путь в reg-файле). Вместе с ресурсной библиотекой будет сгенерирован заголовочный файл MyISAPIMsg.h , который мы подключим к основному проекту.

Сейчас у нас есть все необходимое для записи сообщений в лог. Мы также можем собрать основной проект. И приступить к его отладке.

Отладка ISAPI.

Отладка ISAPI — процесс несколько более сложный, чем отладка обычного Win32-приложения. Это связано с тем, что у нас нет возможности запустить ISAPI-расширение отдельно от сервиса IIS, поэтому нам придется отлаживать сам сервис. В зависимости от того, как сконфигурировано ваше веб-приложение (In-process, pooled, isolated), может быть несколько вариантов подключения к нужному процессу. Я считаю, что самым простым являетcя следующий:

  1. вы переводите ваше веб-приложение в режим in-process;
  2. вы подключаетесь к процессу inetinfo;
  3. на закладке Project\Settings\Debug выбираете категорию Additional DLLs и добавляете туда ваш модуль MyISAPI.dll ;
  4. теперь нужно открыть исходный текст модуля — файл MyISAPI.cpp и поставить точки останова;
  5. наконец, нужно сформировать запрос к модулю (например, из веб-браузера). По достижению первой точки останова, управление попадет в отладчик.

Существуют также и другие мощные средства отладки, которые можно применить для отлаживания ISAPI-приложений. Мне наиболее симпатичны два из них — Numega Bounds Checker, позволяющий в автоматическом режиме отлавливать большинство различного рода утечек, и Numega SoftIce -мощнейший низкоуровневый отладчик, в первую очередь предназначенный для отладки драйверов устройств, который, однако, позволяет с успехом отлаживать и высокоуровневые приложения, написанные на C. Тем не менее, рассмотрение этих средств не входит в рамки этой статьи.

Заключение.

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

Что такое код hello isapi

Ну чего знаю, то расскажу. Итак, что же такое ISAPI ? Это переводится как интерфейс прикладного программирования Интернет. ISAPI дает возможность наделить дополнительными возможностями сервера в интернет. Вообщем-то не все, а конкретно ISS -Internet Information Server, который делает Microsoft. Работают эти расширения намного лучше ASP, но и получение их тяжелее :-) Есть два класса использования ISAPI:

  • Фильтры
  • Расширения

Мы с Вами поговорим пока о ISAPI фильтрах. Это обычные DLL, которые подключаются к ISS и могут изменить обработку серверных запросов. То есть, если Вы хотите поменять поведение сервера по запросу HTTP, то это как раз для Вас. Что, например, можно делать с помощью этого фильтра .

А можно очень много :

  • Скрывать физическое местоположение URL
  • Изменять загрузку страни в зависимости от типа броузера
  • Запрещать доступ или перенаправлять его в зависимости от запроса
  • и многое многое другое .

Подлючаются ISAPI фильтры в ISS через вкладку ISAPI Filter.

Итак, ISAPI Filter — это динамические библиотеки сформированные по определенным правилам позволяющие изменить поведение сервера ISS.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL