Практически ежегодно появляется очередная переработанная или серьезно
дополненная версия 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.
Следующий останов будет в точке прерывания. Время соединения браузера с сервером
ограничено определенными параметрами настройки браузера, а потому не следует
медлить, иначе связь клиент—сервер прервется и процесс отладки прекратится.
Тогда можно увеличить время соединения и продолжить отладку.
|