Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Разработка серверных Web-приложений на Delphi

Приходит девушка к программисту в гости, а тот:
- Чай, кофе, Интернет?

Практически ежегодно появляется очередная переработанная или серьезно дополненная версия Delphi — в прошлом году была выпущена уже пятая. Количество книг по программированию в среде Delphi, вышедших у нас за последние три-четыре года, свидетельствует о том, что этот продукт наиболее популярен среди аналогичных средств разработки ПО. Его можно использовать для создания различных программ, в том числе и Web-приложений, процесс разработки которых благодаря применению Web-компонентов и Web-классов значительно упростился.

Кстати, для тех программистов, которые работают на Си и не хотят переходить на Паскаль, но желали бы пользоваться всеми возможностями и преимуществами Delphi, фирма Inprise выпустила инструментальный аналог этого пакета — C++ Builder. Он обладает всеми достоинствами Delphi и обновляется одновременно с ним. Однако пока пакет не вызывает столь же большого интереса, поскольку выбор соответствующего инструментария при работе на Си шире, чем при использовании Паскаля.

Delphi пятой версии существенно отличается от предыдущей. Так, в палитре VCL этого инструментального пакета появилась страница InternetExpress, на которой представлены TWebConnection и TmidasPageProducer. Они подходят для разработки динамических Internet-клиентов с помощью сценариев, написанных на JavaScript, HTML 4 и XML.

Delphi 5.0 поставляется в трех вариантах: Standard, Professional и Enterprise, различающихся назначением и составом дополнительных инструментальных средств. В Standard наличествует лишь базовый набор средств разработки, Professional можно дополнительно оснащать Internet-компонентами из специального пакета WebBroker, а Enterprise включает весь доступный Internet-инструментарий и поддерживает новую технологию Microsoft — ASP (Active Server Pages). Для этого в Enterprise также включен специализированный эксперт, с помощью которого можно создавать активные серверные страницы. Такие решения, поддерживаемые Web-сервером MS IIS (Microsoft Internet Information Server), позволяют создавать динамические Web-узлы. Кроме того, для разработки Web-приложений используются элементы, находящиеся на Internet-странице палитры компонентов. Эта страница в Delphi 5.0 существенно отличается от соответствующей в версии 4.0 и внешне (другие значки), и по наполнению.

На ней остались лишь те компоненты, которые нужны непосредственно для проектирования Web-приложений. Наряду с пятью невизуальными там имеются ClientSocket и ServerSocket (два первых), а также WebBrowser (последний).

Информацию, касающуюся комплектации и обновления Delphi, можно получить на узлах Inprise.ru (соm), interface.ru, demo.ru и др.

Web-приложения

В качестве клиентских Web-приложений могут быть использованы современные браузеры, среди которых лидируют MS Internet Explorer и Netscape Navigator. Альтернативой является разработка собственной программы с помощью Delphi. Этот путь может показаться более трудоемким и затратным, но в результате зачастую получается такой продукт, который максимально соответствует решаемой задаче.

Если в качестве клиентского приложения все же используется универсальный Web-браузер, то при создании интересных динамических Web-страниц на профессиональном уровне уже не обойтись без программирования хотя бы на элементарном уровне. Тогда придется разрабатывать продукты на уровне CGI- или API-приложений, и инструментарий Delphi 5.0 окажется как раз к месту

Технология WebBroker

Для проектирования серверных Web-приложений в Delphi разработана специальная технология — WebBroker. С ее помощью можно создавать сложные программы, в том числе и работающие с базами данных как локальными, так и хранящимися на наиболее популярных серверах — InterBase, Oracle, Informix, Sybase, MS SQL. В последнем случае связь серверного приложения с источником данных обеспечивается с помощью одного из двух механизмов — BDE (Borland Data Engine) или ODBC.

Технология WebBroker реализована на основе Web-компонента — TWebModule. Для обеспечения комфортности работы и ускорения процесса проектирования предусмотрены два мастера — Web Server Application и Database Web Application Wizard. Использование TWebModule позволяет создавать программы, которые будут работать под управлением серверов, поддерживающих интерфейсы расширения — ISAPI (Internet Server API, разработанный корпорацией Microsoft), NSAPI (Netscape API, предложенный компанией Netscape), а также CGI и WinCGI.

Особенности каждого из указанных стандартов учитываются в технологии WebBroker. При этом предусматривается выполнение программы непосредственно на сервере. Но Delphi также позволяет создавать приложения типа ActiveX, запускаемых на компьютере клиента. Следует отметить, что каждое Web-приложение может иметь лишь один компонент TWebModule.

ISAPI- и NSAPI-приложения — это библиотеки DLL, которые Web-сервер загружает по запросу клиента, поступающему от браузера через Internet по протоколу TCP/IP. Клиентская информация передается из запроса в dll-файл в структурированном виде и обрабатывается компонентом TISAPIApplication. Каждый поток управляется отдельным запросом. Как только dll-файл загрузится, сервер может отвечать на клиентские запросы внутри основного процесса.

Поскольку обмен информацией между клиентом и Web-приложением происходит в оперативной памяти сервера, то программы на базе ISAPI/NSAPI работают гораздо быстрее, чем приложения на основе CGI/WinCGI. CGI-приложения являются консольными и не отличаются эффективностью, так как каждый раз при поступлении соответствующего запроса от клиента сначала происходит их запуск, а по окончании работы — полное завершение. Поэтому количество клиентов, подключающихся к Web-серверу с CGI-приложениями, ограничено объемом его оперативной памяти и быстродействием.

Однако подобные приложения обладают универсальностью, обусловленной совместимостью с различными платформами, поскольку стандарт CGI был разработан и широко использовался на Unix, а затем был реализован и для других ОС, в том числе для Windows. Данные от клиента, поступающие в командной строке запроса, который организован в этом стандарте, передаются на сервер после обработки компонентом TCGIApplication.

WinCGI — модификация стандарта CGI, рассчитанная на работу под управлением ОС Windows. Программы, разработанные на базе этих двух стандартов, будут работать и на Web-серверах — MS IIS 4.0 или Netscape, поддерживающих стандарты ISAPI и NSAPI соответственно. Несомненное достоинство технологии WebBroker — возможность представления конечного программного продукта в любом из указанных стандартов простой перекомпиляцией исходных текстов, что существенно облегчает работу.

Для разработки серверных Web-приложений в палитре компонентов Delphi 5 программисту предлагается Internet-страница, на которой расположено пять невизуальных Web-компонентов: TWebDispatcher, TPageProducer, TDataSetPageProducer, TDataSetTableProducer и TQueryTableProducer. Шестой невизуальный компонент — TwebModule — автоматически включается в проект при создании Web-приложения с помощью мастера Web Server Application. Он — основа любого серверного Web-приложения, а также служит репозитaрием (своеобразным «контейнером») для остальных невизуальных компонентов, чем напоминает Data-модуль, применяемый для работы с БД при обычном проектировании клиентских приложений.

Чтобы выбрать Web Server Application, следует обратиться к меню File•New•New. После подключения этого мастера открывается подменю, где нужно указать стандарт (ISAPI, NSAPI, CGI или WinCGI), с которым будет работать создаваемое Web-приложение.

Это позволит разработать новый проект на основе автоматически определенного Web-модуля. В его единственном окне и будут размещаться Internet-компоненты. Они, как и сам модуль, имеют статус невизуальных, т. е. доступных лишь в режиме проектирования (design-time). Все видимые элементы и компоненты серверного Web-приложения станут отображаться в окне браузера клиента, обращающегося к серверу, а во время разработки, отладки и тестирования Web-программы сам Web-сервер и браузер могут находиться на одном компьютере, выполняющем одновременно функции как клиента, так и сервера

Когда разрабатывается ISAPI/ NSAPI-приложение, в заголовок файла проекта добавляется директива library, а в список под директивой uses заносятся необходимые записи. Затем создается сам файл проекта (листинг 1).

Листинг 1

Файл проекта ISAPI/NSAPI-приложения


library IServer;

uses
  WebBroker, HTTPApp, ISAPIApp,
  main in ‘main.pas’ {CustomerInfoModule: TDataModule};

{$R *.RES}

exports
  GetExtensionVersion,
  HttpExtensionProc,
  TerminateExtension;

begin
  Application.Initialize;
  Application.CreateForm(TCustomerInfoModule, CustomerInfoModule);
  Application.Run;
end.

Кстати, в Delphi 5.0 при формировании Web-проекта появился новый модуль WebBroker. Поэтому при переходе на нее в готовом (или разрабатываемом) проекте серверного Web-приложения нужно перед его перекомпилированием приписать в ‘library’ название этого нового модуля в разделе ‘uses’. И наоборот, при возврате к версии 4.0 следует (с помощью комментария) убрать это имя.

Классы TWebRequest и TWebResponse

TWebModule предоставляет серверному Web-приложению возможность сформировать ответы на клиентские HTTP-запросы. Обмен между серверным и клиентским приложениями происходит в объектной форме. Запросы представляются в виде объектов в соответствии с выбранными условиями в списке свойств action items.

В модуле HTTPAPP.pas как абстрактные базовые классы объявлены TWebRequest и TWebResponse. Они инкапсулируют протокол HTTP, по которому происходит обмен информацией между Web-сервером и клиентскими браузерами. Класс TWebRequest предоставляет доступ ко всей информации, поступающей от клиентов на Web-сервер через свои свойства и методы. Класс же TWebResponse, наоборот, с помощью своих свойств и методов позволяет переслать клиенту данные в форме ответа на отправленный ранее запрос по протоколу HTTP. Причем данные от Web-сервера можно переслать любым из возможных для протокола HTTP способов.

В действительности взаимодействие между Web-сервером и клиентами обеспечивают классы TISAPIResponse и TISAPIRequest, объявляемые в модуле ISAPIAPP.pas и учитывающие специфику интерфейсов ISAPI и NSAPI. Они являются прямыми потомками абстрактных классов TWebRequest и TWebResponse. Полиморфизм, свойственный Delphi, позволяет организовать их передачу в виде параметров TWebRequest и TWebResponse через обработчик события OnAction в компонент TwebModule (листинг 2).

Листинг 2

Обработчик события OnAction


procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse;
var
  Handled: Boolean);
begin
  //обработчик события
end;

Свойства класса TISAPIRequest, содержащего информацию запроса от клиентского браузера, позволяют получить разнообразную и достаточно полную информацию о самом клиенте, хотя ряд параметров в передаваемом запросе может быть не определен. Этот класс имеет около 30 ненаследуемых свойств. Так, свойства RemoteHost и RemoteAddr включают Internet-адрес клиентского компьютера. Данные о браузере, установленном на клиентском месте, заключены в свойстве UserAgent. Из свойства Accept можно извлечь список типов графических файлов, с которыми может работать браузер клиента. Свойство Refere содержит URL Web-страницы, где можно получить ссылку на этот Web-сервер, а данные Cookie содержатся только в свойстве Cookie в виде строк. С помощью свойства CookieFields через массивы полей можно сразу же получить доступ к значениям нескольких клиентских рабочих мест.

Подробные данные клиентского URL-запроса можно извлечь из свойства Query. Например, если в URL-запросе ‘http://www.TSite.com/art/gallery.dll/ mammals?animal=dog&color=black’ часть ‘/gallery.dll’ представляет собой имя Web-приложения, то свойство Query будет включать animal=dog&color=black. В этом свойстве информация неотделима от URL. Причем Query может включать множественные поля, разделенные знаками логического «И» (&). При передаче параметров через URL они обычно следуют за знаком вопроса (?). Пробелы заменяются плюсом (+), а последний наряду с некоторыми другими передается в кодированном виде: %хх, где хх — шестнадцатеричное представление символа.

Чтобы ознакомиться с функциями, свойствами и методами класса TISAPIRequest, целесообразно провести тестирование. Для этого нужно сформировать HTML-страницу в обработчике события OnAction и отобразить на ней значения всех многообразных свойств класса или хотя бы некоторых наиболее важных (листинг 3).

Листинг 3

Вывод информации о сервере и клиенте


procedure TWebModule1.WebModule1WebActionItem2Action(Sender:
TObject; Request: TWebRequest; Response: TWebResponse;
var Handled: Boolean);
begin
  Pg:= TstringList.Create;
  Pg.Add('<HTML>');
  Pg.Add('<HEAD>');
  Pg.Add('<charset=1251>');
  Pg.Add('<TITLE>Информация о сервере и клиенте'</TITLE>');
  Pg.Add('</HEAD>');
  Pg.Add('<BODY>');
  Pg.Add('<HR>');
  Pg.Add('<B>Динамическая страница, созданная в Delphi<B><P>');
  Pg.Add('<B>как Web-расширение <B><P>');
  Pg.Add('Method = ' + Request.Method + '<BR>');
  with Pg do
  begin
    Add('ProtocolVersion = ' + Request.ProtocolVersion + '<BR>');
    Add('URL = ' + Request.URL + '<BR>');
    Add('Query = ' + Request.Query + '<BR>');
    Add('PathInfo = ' + Request.PathInfo + '<BR>');
    Add('PathTranslated = ' + Request.PathTranslated + '<BR>');
    Add('Authorization = ' + Request.Authorization + '<BR>');
    Add('CacheControl = ' + Request.CacheControl + '<BR>');
    Add('Cookie = ' + Request.Cookie + '<BR>');
    Add('Accept = ' + Request.Accept + '<BR>');
    Add('From = ' + Request.From + '<BR>');
    Add('Host = ' + Request.Host + '<BR>');
    Add('Referer = ' + Request.Referer + '<BR>');
    Add('UserAgent = ' + Request.UserAgent + '<BR>');
    Add('ContentEncoding = ' + Request.ContentEncoding + '<BR>');
    Add('ContentType = ' + Request.ContentType + '<BR>');
    Add('ContentLength = ' + IntToStr(Request.ContentLength) + '<BR>');
    Add('ContentVersion = ' + Request.ContentVersion + '<BR>');
    Add('Content = ' + Request.Content + '<BR>');
    Add('Connection = ' + Request.Connection + '<BR>');
    Add('DerivedFrom = ' + Request.DerivedFrom + '<BR>');
    Add('Title = ' + Request.Title + '<BR>');
    Add('RemoteAddr = ' + Request.RemoteAddr + '<BR>');
    Add('RemoteHost = ' + Request.RemoteHost + '<BR>');
    Add('ScriptName = ' + Request.ScriptName + '<BR>');
    Add('ServerPort = ' + IntToStr(Request.ServerPort) + '<BR>');
  end;
  Pg.Add('<HR>');
  Pg.Add('</BODY>');
  Pg.Add('</HTML>');
  Response.Content := Pg.Text;
  Pg.Free;
end;

Эта страница отсылается через Response.Content на клиентский браузер для тестирования системы.

Конечно, не нужно отправлять подобную информацию клиенту, пользующемуся услугами Web-сервера, ее целесообразно использовать для подготовки эффективного и даже «интеллектуального» ответа клиенту. В частности, информация о версии и функциональных возможностях браузера позволит выдать клиенту Web-страницу в требующемся виде, например без графических файлов, в том формате, который его браузер не воспринимает. А анализ запросов (например, по свойству Query) позволяет выявить «полезного» и даже «нужного» клиента. Если запомнить его URL-адрес, то при следующем обращении на Web-сервер можно персонально его поприветствовать, сразу открыть ему нужную страницу либо раздел, предоставить доступ к дополнительной информации. Этот же способ помогает регистрировать данные о посетителях на Web-сервере и, если необходимо, избавляться от нежелательных «визитов» и т. п.

Данные пересылаются клиенту с Web-сервера в форме ответа через свойство Content класса TISAPIResponse. Этот класс имеет 23 свойства, из них 19 — ненаследуемые. В Content должен содержаться HTML-код, отображаемый клиентским браузером в виде Web-страницы. В другом важном свойстве — Version — указывается версия HTTP-протокола. Значение Version берется из ProtocolVersion свойства HTTPRequest. Для получения дополнительной информации по спецификации HTTP-протокола необходимо ознакомиться с соответствующей документацией, имеющейся, например, по адресу http://www.w3.org.

Большое влияние на работу с классом TISAPIResponse оказывают методы. Например, вызвав после установки свойств объекта HTTP-ответа метод SendResponse, можно послать клиенту сообщение еще до окончания действия обработчика OnAction. Метод SendRedirect поможет перенаправить клиента на другой Web-сервер с соответствующим URL. Метод SendStream обеспечивает передачу данных любого типа. Однако перед его вызовом нужно затребовать SendResponse, который формирует заголовок сообщения HTTP-ответа, базирующийся на свойствах объекта TISAPIResponse. Вместо метода SendResponse перед вызовом SendStream нужно установить свойство ContentStream в значении AStream.

Наибольший интерес, пожалуй, представляет использование технологии WebBroker при построении динамических Web-страниц для работы с базами данных. Однако здесь не обойтись без языка HTML, ранее не применявшегося в Delphi. Специальные компоненты TPageProducer, TDataSetPageProducer, TDataSetTableProducer и TQueryTableProducer помогают программисту эффективно решать подобные задачи, которые далеко не всегда тривиальны, что существенно экономит его время и силы.

TPageProducer

Компонент TPageProducer позволяет создавать динамические Web-страницы и манипулировать ими с помощью шаблонов, т. е. клиенту предоставляется нужная HTML-страница в соответствии с определенными условиями, которые анализируются в обработчике события OnHTMLTag. Само это событие будет инициироваться в момент прочтения специального дескриптора, начинающегося со знака #, который включает имя и параметры с соответствующими значениями, например <#TagName Param1=Value1 Param2=Value2 ...>. Имя должно быть допустимым идентификатором языка Паскаль, а параметры с пробелами заключаются в двойные кавычки. В Delphi имеется семь предопределенных дескрипторов.

В TPageProducer предусмотрены свойства — HTMLDoc и HTMLFile. С помощью первого можно определить шаблон, который в дальнейшем будет использоваться для формирования страницы, возвращаемой клиенту при обращении к методу Content (в ответ на запрос). Установив TPageProducer в окне TWebModule и открыв редактор списка строк HTMLDoc, можно построчно набрать там шаблон HTML-страницы. Такой шаблон не будет отличаться от обычной страницы, написанной на стандартном HTML-языке. Метод Content преобразует код, находящийся в свойстве HTMLDoc (где могут присутствовать и ссылки в виде дескрипторов), в окончательную строку в формате HTML. При входе в каждый дескриптор вызывается событие OnHTMLTag, обработчиком которого и выполняется это преобразование (листинг 4).

Листинг 4

Замена дескрипторов в обработчике события OnHTMLTag


procedure TMyModule.ImageHTMLTag(Sender: TObject; Tag: TTag;
const TagString: string; TagParams: TStrings; var ReplaceText: string);
var
  ImageID: integer;
begin
  case Tag of
    tgImage:
    begin
      ImageID := StrToInt(TagParams.Values[‘ImageID’])
      if ImageTable.FindKey([ImageID]) then
        ReplaceText := '<IMG SRC=' +
        ImageTable.FieldByName('Filename').AsString +
        ' ALT=' + ImageTable.FieldByName(
        'Description').AsString + ' >'
      else
        ReplaceText:= '(Изображение отсутствует)'
    end;
    tgTable:
    begin
      ReplaceText := DataSetTableProducer1.Content;
    end;
  end;
end;

Предопределенный дескриптор tgImage предназначен для описания изображения, а tgTable — для установки HTML-таблицы. Кроме того, в Delphi 5.0 есть предопределенные теги tgCustom, tgLink, tgImageMap, tgObject и tgEmbed. С помощью tgLink описывается гипертекстовая ссылка, tgObject используется для встраивания ActiveX в HTML-страницу, tgImageMap заменяется картой изображения (контекстно-сенсорными зонами), tgEmbed содержит ссылку на DLL-расширение, совместимое с Netscape, tgCustom присваивается свойству Tag тогда, когда в HTML-тексте встречается неопределенный дескриптор, заменяемый любым значением, которое задает пользователь. Например, если в свойстве HTMLDoc HTML-текста имеется также непредопределенный тег <#DATE>, то Tag будет присвоено значение tgCustom. В обработчике OnHTMLTag этот дескриптор может быть заменен командой, выводящей текущую дату на HTML-страницу.

Установка HTMLDoc не допускает использования альтернативного HTMLFile, которое предусматривает применение внешнего файла для хранения аналогичного шаблона на языке HTML. А такой способ позволяет еще более расширить функциональные возможности Web-приложения путем замены и манипулирования HTML-страницами в нескольких шаблонах без изменения текста основной программы.

TDataSetTableProducer и TQueryTableProducer

Компоненты, находящиеся на странице DataControl и предназначенные для управления данными и для их вывода, в том числе и в табличной форме, не могут быть использованы в Web-приложении. Вместо них можно применить TDataSetTableProducer и TQueryTableProducer, информация для которых берется из TTable и TQuery соответственно, включенные в компонент TWebModule. Причем источники данных и компоненты управления непосредственно связаны между собой, потому и не требуется промежуточного компонента типа TDataSource. Компонент TDataSetTableProducer, аналогичный TDBGrid, позволяет переслать на клиентский браузер отчет в табличной форме в формате HTML. Его можно настроить на отображение любых столбцов выбранного набора данных.

Свойства Header и Footer позволяют вставить текст на HTML и до таблицы, и после нее. С помощью свойств Columns, RowAttributes и TableAttributes можно форматировать строки, столбцы и отдельные ячейки таблицы. В свойстве Dispatcher должен быть указан компонент-диспетчер, предоставляющий доступ к объектам TWebRequest и TWebResponse для получения запросов и передачи ответов.

Аналогично функционирует и TQueryTableProducer, за исключением режима доступа к данным. Этот компонент помогает сформировать HTML-таблицу на основе параметров, указанных в HTTP-запросе. Если последний основан на методе GET, то параметры определяются свойством QueryFields объекта запроса TWebRequest, а если на методе POST — свойством ContentFields того же объекта. В приведенной демонстрационной программе Iserver.dpr представлен пример использования TPageProducer,

Отладка серверных Web-приложений

Если разработано достаточно сложное Web-приложение в стандарте ISAPI(NSAPI), его необходимо отладить. Этот процесс существенно отличается от общепринятой отладки обычных Windows-приложений в среде Delphi, так как созданное Web-приложение запускается лишь в ответ на запросы, получаемые от браузера клиента через Web-сервер. Запуск даже самого простого Web-приложения непосредственно из среды Delphi 5.0 невозможен, поскольку теряется его связь с Web-сервером. Тогда и приложение не может получать запросы от клиента и, следовательно, реагировать на них. Методы отладки определяются также типом Web-сервера.

На платформе NT в качестве Web-сервера наиболее целесообразно с точки зрения доступности использовать MS IIS версий 2—4, а в качестве браузера MS IE —версии не ниже четвертой. Операционная система Windows NT 4.0 поставляется в комплекте с MS IIS 2.0 (дистрибутив — в I386\InetSrv). Можно также установить бесплатно распространяемый пакет NTOptPak, в который входит MS IIS 4.0, более распространенная, чем версии 2.0 и 3.0, и лишенная их недостатков.

Настройка отладки Web-приложения вместе с MS IIS 4.0 в интегрированной среде Delphi достаточно сложна и трудоемка, главным образом, из-за внесения множества изменений в реестр. Поэтому имеет смысл сначала отладить такое приложение с MS IIS версии 2 или 3.

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

При отладке Web-приложений с MS IIS в меню Run/Parameters вводится следующее: Host Application: c:\winnt\system32\inetsrv\inetinfo.exe (маршрут к файлу должен соответствовать фактическому) и Run/Parameters: -e w3svc. Это позволит запускать MS IIS 2.0 и 3.0 и производить отладку ISAPI DLL под управлением Web-сервера.

Если на сервере установлен MS IIS версии 4.0 или более поздней, то в конфигурацию Windows NT 4.0 придется внести целый ряд изменений.

С помощью утилиты-конфигуратора DCOMCnfg нужно изменить учетную запись (user account) в разделе identify сервиса MS IIS Admin Service на имя того пользователя, который будет выполнять отладку.

С использованием редактора реестра (REGEDIT) или аналогичной утилиты следует удалить имена LocalService из всех подключей, связанных с аналогичными структурами IISADMIN, которые входят в ветвь реестра HKEY_CLASSES_ROOT/AppID и HKEY_ CLASSES_ROOT/CLSID. Раздел LocalService присутствует в составе следующих подключей:

  • {61738644-F196-11D0-9953-00C04FD919C1} // IIS WAMREG admin Service;
  • {9F0BD3A0-EC01-11D0-A6A0-00A0C922E752} // IIS Admin Crypto Extension;
  • {A9E69610-B80D-11D0-B9B9-00A0C922E750} // IISADMIN Service.

Кроме того, из двух первых подключей узлов AppID нужно удалить имя RunAs, а последний дополнить значением Interactive User.

Далее с применением REGEDIT необходимо добавить подключи LocalService32 ко всем структурам, связанным с IISADMIN и относящимся к узлу CLSID. Иными словами, каждый подключ узла CLSID, указанный в предыдущем пункте, или любой другой, под которым найдено имя LocalService keyword, следует дополнить подключом LocalService32. После чего нужно установить по умолчанию для этих новых подключей значение: c:\winnt\system32\inetsrv\inetinfo.exe -e w3svc (с учетом фактического расположения файла inetinfo.exe).

Следует установить в dword:3 значение Start для подключей:

  • HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\IISADMIN,
  • HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\MSDTC,
  • HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\W3SVC.

Чтобы вернуть реестр в исходное положение по окончании процесса отладки, необходимо проделать обратные операции. Они достаточно трудоемки и требуют повышенного внимания. Но можно автоматизировать процесс перенастройки реестра, разработав собственную программу, что поможет быстро определить его состояние без поиска, с помощью стандартных средств просмотра и коррекции, и перейти от отладки к работе ОС в штатном режиме. Такая программа предназначена для многократного использования. В качестве основного класса при разработке можно выбрать Tregistry, а для анализа, чтения и записи значений, а также удаления подключей подойдут многочисленные методы этого компонента: ReadKey, WriteFloat, WriteString, CloseKey, DeleteKey и т. п.

Такая программа поможет также контролировать фактическое состояние реестра в нужных подключах. Работа на этом уровне весьма ответственна, поскольку любая ошибка может вызвать недопустимые изменения в важнейшем для ОС механизме и привести к переустановке всей системы. Поэтому целесообразно освоить основные методы чтения фрагментов реестра, а удаление, создание и запись выполнять сначала только на тестовой ветви системы. Если приводимый ниже текст (листинг 5) вставить, например, в подпрограмму, реагирующую на событие открытия формы OnActivate, то в окне Label1 при настройке реестра на режим отладки появится имя подключа LocalServer32, а в окне Edit1 — соответствующее значение по умолчанию: c:\winnt\system32\inetsrv\ inetinfo.exe -e w3svc.

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

При отладке Web-приложений с Personal Web Server под управлением Windows 95/98 в меню Run/Parameters вводятся следующие параметры: Host Application: c:\Program Files\websvc\system\inetsw95.exe; Run Parameters: -w3svc. Они позволят запускать Personal Web Server и отлаживать ISAPI DLL. Для настройки на отладку Web-приложений с сервером Netscape Server версии 2.0 в соответствии с рекомендациями фирмы Borland требуется дополнительно изменить конфигурацию. Сначала следует скопировать файл ISAPITER.DLL (из каталога Bin) в каталог C:\Netscape\Server\Nsapi\Examples (с учетом фактического размещения файлов). Затем необходимо произвести преобразования в серверных конфигурационных файлах, расположенных в каталоге C:\Netscape\Server\Httpd-\Config.

  • В файле OBJ.CONF file после строки Init fn=load-types mime-types=mime.types требуется добавить строку Init funcs="handle-isapi,check-isapi,log-isapi" fn="load-modules" shlib="c:/netscape/server/nsapi/examples/ ISAPIter.dll".
  • В секции <Object name=default> файла OBJ.CONF перед строкой NameTrans fn=document-root root="C:/ Netscape/Server/docs" нужно вставить строку NameTrans from="/scripts" fn="pfx2dir" dir="C:/Netscape/Server/ docs/scripts" name="isapi".
  • В конце файла OBJ.CONF необходимо добавить секцию <Object name="isapi"> PathCheck fn="check-isapi" ObjectType fn="force-type" type="magnus-internal/isapi" Service fn="handle-isapi" </Object>.
  • В конце файла MIME.TYPES следует добавить строку type=magnus-internal/isapi exts=dll.

Дополнения в первом и втором действиях вносятся одной непрерывной строкой. Затем для отладки Web-приложений под управлением сервера Netscape Fast Track требуется установить параметры Host Application: c:\Netscape\server\bin\httpd\httpd.exe и Run Parameters: c:\Netscape\server\httpd-<servername>\config. Они позволяют запустить сервер, а также указывают путь к конфигурационным файлам.

Создание DLL-приложений для работы под управлением Windows NT также имеет свою специфику. Необходимо расширить права пользователя так, чтобы стало возможным отладить DLL-программы. Делает это администратор Windows NT через программу User Manager, назначив Act As Part Of The Operating System (работа в режиме операционной системы) в меню Policies/User Rights (обязательно указав Show Advanced User Rights) тому пользователю-программисту, который будет осуществлять операцию. Подобная процедура неудобна потому, что по окончании отладки нужно восстановить исходные права пользователя.

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

После отладки DLL-приложения в формате ISAPI или NSAPI можно быстро перекомпилировать исходные тексты в exe-файл формата CGI/WinCGI, добавив отлаженный Web-модуль в репозитарий. При этом нужно присвоить название Web-модулю, дать описание, выбрать страницу репозитария (например, Data Modules) и иконку, указать фамилию автора. Созданный Web-модуль сохраняется в качестве шаблона. Затем через меню File/New следует вызвать мастер Web Server Application. В диалоге New Web Server Application выбрать CGI или WinCGI. Стереть автоматически сгенерированный Web-модуль и через меню File/New установить шаблон отлаженного приложения, который был ранее сохранен на соответствующей странице.

С помощью Delphi 5.0 можно создавать CGI/WinCGI-приложения, которые в виде exe-файлов должны напрямую запускаться Web-сервером. Однако методика их отладки несколько сложнее, чем DLL-приложений, поскольку нужно моделировать сервер путем создания конфигурационного файла с параметрами, включающими информацию из запроса. Затем нужно запустить WinCGI-приложение, указав полные адреса файла, содержащего информацию от клиента, и файла, в котором должен быть записан ответ. После этого можно, как обычно, отлаживать Web-приложение.

Механизм работы CGI/WinCGI-приложений проще, чем у ISAPI/NSAPI-приложений. При каждом обращении они запускаются в отдельном потоке, поэтому пересечения с многопотоковым механизмом не происходит. Кроме того, в CGI/WinCGI-приложениях не возникает проблем, имеющих место при кэшировании Web-модулей ISAPI/NSAPI-приложений.

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

Рассмотрим процесс отладки Web-серверного приложения iserver.dll, предлагаемого разработчиками Delphi 5.0. Его исходные тексты (iserver.dpr, main.pas, main.dfm) находятся в каталоге ...\Program Files\Borland\Delphi5\ Demos\Webserv\, а файловая база данных — в каталоге ...\Program Files\Common Files\Borland Shared\Data\. На этот же каталог должен указывать и DBDemos, настраиваемый с помощью программы-администратора bdeAdmin.exe, имеющейся в ...\Program Files\Common Files\Borland Shared\BDE\.

Само DLL-приложение должно быть скомпилировано в каталог, из которого Web-сервер может производить запуск exe-программ. Таковым может быть, например, создаваемый по умолчанию (при установке Web-сервера) виртуальный каталог Web-сервера SCRIPTS или аналогичный, созданный заново. После внесения рекомендованных изменений в реестр NT при отладке программы под управлением MS IIS 4.0 Web-сервер может запускаться только из среды Delphi 5.0. А в случае использования MS IIS 2.0 или 3.0 за работой Web-сервера приходится следить программисту, запуская и останавливая соответствующий сервис World Wide Web Publishing Service из окна Services панели управления.

Перед отладкой MS IIS должен быть остановлен, а начинать работу он будет запуском Web-приложения (DLL-программы) из среды Delphi 5.0. Сначала разумно проверить, работает ли уже отлаженное приложение, такое как демонстрационный пример Iserver.dll. Для этого нужно поместить исходный файл в раздел SCRIPTS. В окне Services следует проверить, подключен ли сервис Wide Web Publishing Service, если же нет — нужно нажать кнопку Start. Затем в окне браузера требуется набрать имя ПК или IP-адрес

Иногда программа полностью не запускается, хотя все вроде бы выполнено правильно, т. е. MS IIS работает и есть доступ к запуску DLL-приложения. В этом случае могут появиться сообщения о «внутренней» ошибке сервера, например о неудачной инициализации BDE, невозможности работать с закрытой таблицей и т. п. Подобная информация свидетельствует об отсутствии права пользователя на доступ к каталогу ...\BDE\ и/или ...\DATA\, который, если необходимо, открывается или закрывается нажатием правой кнопки мыши на свойствах (properties/Security/permissions) соответствующего компонента (диска, каталога или файла).

Перед запуском MS IIS нужно установить протокол TCP/IP и выбрать какой-нибудь (фиктивный) IP-адрес, например 222.10.1.220, поскольку при разработке и отладке серверных приложений ПК следует отключить от Internet. Работу TCP/IP можно протестировать, набрав сначала консольную команду ping 127.0.0.1, а затем ping 222.10.1.220. В случае успешной установки протокола будет получен ответ типа ‘Reply from 127.0.0.1: bytes=32 time<10ms TTL=32’, а при неверной конфигурации — Pinging 222.10.1.220 with 32 bytes of data: Request timed out’.

Включившись в работу, завершите функционирование MS IIS из окна Services панели управления. Затем, запустив Delphi 5.0 и открыв указанный проект, расставьте точки останова в тексте модуля main, а после установки параметров загрузите отлаживаемый модуль через меню Run/Add Breakpoint/Module Load Breakpoint. Откройте окно Modules, нажав комбинацию клавиш <Alt>+<Ctrl>+m, и убедитесь, что там есть строка: iserver.dll not loaded. Потом, набрав комбинацию клавиш <Ctrl>+<F9> (или нажав кнопку Run), запустите Web-сервер. В окне Modules появится список модулей, запущенных под управлением MS IIS, но отлаживаемый модуль еще не будет загружен.

Функционирование модуля начнется после запуска браузера и набора строки типа http:// 222.10.1.220/scripts/iserver.dll/. При этом в окне Modules можно увидеть все входные точки и модули, связанные с отлаживаемым приложением. Затем начнется непосредственная отладка, и в iserver.dpr на строке Application.Initialize курсор остановится. Теперь нужно снова запустить приложение, нажав кнопку Run. Следующий останов будет в точке прерывания. Время соединения браузера с сервером ограничено определенными параметрами настройки браузера, а потому не следует медлить, иначе связь клиент—сервер прервется и процесс отладки прекратится. Тогда можно увеличить время соединения и продолжить отладку.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay