VR
Virtual Reality On-line   Журнал
Новости   |     Журнал    |    Хаkер    |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]

[ Download  ]
[  Конкурс  ]
[ Анекдоты  ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
ActiveX
Программирование ASP-сервера
:
Logo

Мы уже знаем как настроить IIS (Internet Information Server) чтобы отображать свою страничку в сети, немного изучили ActiveX. Теперь пора написать какой-нибудь достойный пример по использованию всех этих знаний. Сегодня я раскажу тебе, как можно писать на Delphi приложения для WEB-сервера, для использования его с ASP.

Итак, для выполнения сегодняшней работы у тебя уже должен быть установлен Web-сервер с поддержкой ASP. Что такое ASP? Active Server Pages (ASP) - это сервер, который может выполнять спец сценарии и возвращать их клиенту. ASP чем-то похож на CGI, но есть несколько отличий.

В CGI клиентская часть написана на спец языке типа Perl. Клиент отправляет серверу CGI запрос и тот гененрирует на его основе HTML страничку. ASP-клиентская часть это простой HTML код с встроенным VB скриптами. ASP сервер выполняет эти скрипты и вставляет результат в ту же страницу.

Прелесть ASP в том, что клиентская часть может находится на компьютере любой платформы. Зато серверная часть может быть только на Windows NT. А почему нельзя реализовать ASP-сервер на другой платформе? Да потому что ASP использует COM технологию, реализация которой на других платформах связана с большими проблемами. Ещё одно приемущество - из одного HTML документа можно обратится сразу к нескольким ASP - серверам. Единственное ограничение - все они должны быть зарегестрированы на одном ISS сервере.

ASP - это тот же ActiveX и в нём реализовано два необходимых интерфейса - IResponse и IRequest. IResponse используется для заполнения содержимого страницы клиента. IRequest - нужен для получения переданных от клиента серверу необходимых данных. С IResponse мы вплотную познакомимся уже сегодня, а вот IRequest придётся оставить на следующий раз.

ASP сервер может быть реализован в в иде .exe или .dll файла. ASP в виде .ехе запускается на каждый запрос клиента и называется out-of-process (внешний сервер), а ASP в виде .dll загружается в память и способен обслуживать громадное количество запросов (называется он in-process, внутренный). Второй способ конечно же имеет свои приемущества, потому что после отправки запроса клиенту не приходится ждать пока загрузится ASP-сервер. Это значительно увеличивает время отклика, а значит и время загрузки клиентской части. Самое главное - .dll вариант ASP - сервера может обслуживать один все запросы, а может для каждого клиента запускать отдельную копию (как .exe вариант).
Logo
Рис 1. Создание новой ActiveX Library

Теперь перейдём к практике. Сегодня мы напишем внутренний для ASP-сервера вариант в виде dll. Щёлкни File->New и на закладке ActiveX выбери ActiveX Library (рис 1). щёлкай "OK".

Delphi приготовит для тебя заготовочку, кторая экспортирует необходимые функции:

library ASPTester;

uses
  ComServ;

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

{$R *.RES}

begin
end.

Теперь создадим сам ASP-объект. Щёлкни File->New и на закладке ActiveX выбери Active Server Object . Перед тобой откроется окно создания нового Active Server объекта (рис 2)
Logo
Рис 2. Создание нового Active Server объекта

В качестве имени напиши "Tester", это не играет большой роли. Instancing тоже не влияет на работу нашего ASP-объекта, поэтому его оставим без изменений. А вот Threading Model очень важен. Он может иметь четыре значения:

  • Single - самая не эфективная, но самая защищённая модель. Сервер выполняет запросы последовательно и при одновременном обращении сразу нескольких клиентов им приходится ожидать в очереди, пока ASP - сервер не освободится. Хотя если запросы маленькие, то эта можель достаточно эффективна. Если запросы большие, то ожидание их выполнения бкдет слишком большим.
  • Apartment - более эффективная модель. Для каждого клиента создаётся свой экземпляр COM объекта. Мы оставим его. Недостаток - каждому объекту свой поток, а значит лишние затраты на инициализацию. При больших запросах это эффективно, но ради маленьких инициализировать новые подключения невыгодно. Слишком большие затраты на инициализацию.
  • Free Единственный экземпляр обслуживает кучу клиентов. При этом достигается максимальная скорость, но если пользователь работает с изменением данных, то они становятся незащищёнными. Приходится вручную изолировать данные от кождого пользователя, чтобы один запрос не испортил данные из другого запроса. Если твой объект только отправляет данные клиенту и не занимается модификацией данных, то эта модель твоя.
  • Both Смешанная модель. Её предпочтительность я не могу назвать. Я даже не знаю, где её эффективней использовать, потому что просто не знаю как точно она работает внутри. Знаю только, что она включает в себя сразу несколько моделей. Но какая из них и когда предпочтителней я не знаю, поэтому и не использую.

Далее идут два переключателя, с помощью которых выбирается тип работы сервера:

  • Page-level event methods - следует выбирать, если объект будет работать под управлением 3 или 4 версии IIS. Под пятой версией тоже работает, но под ней эфективней вторая опция.
  • Object Context - эта опция работает только под IIS 5.

Последний переключатель - Generate a tamplate test script for this object . Этот флажок заставляет Delphi создать HTML шаблон, который ты можешь потом использовать для тестирования сервера. Оставь её включённой, в любом случае тебе шаблон не помешает.

Жмём "ОК" и получаем уже знакомое окно с библиотекой типов:

Logo
Рис 3. Библиотека типов

Здесь мы создадим новый метод Logo. Назовём его PrintTestText . Delphi слздаст процедуру PrintTestText в tlb модуле (уменя это ASPTester_TLB):

procedure TTester.PrintTestText;
begin
  DefaultInterface.PrintTestText;
end;

А в модуле исходника (я его сохранил как TesterUnit) будет такая же функция PrintTestText, только пустая. В ней мы должны реализовать этот интерфейс:

procedure TTester.PrintTestText;
begin
 Response.Write('<center><H2> Привет от ASP сервера </H2></center>');
end;

Здесь мы используем метод Write интерфейса Response для вывода HTML тегов. Если Delphi пролентяйничал и не создал заготовки, то заставь его насильно, нажав кнопку Logo.

Скомпилируй проект. У тебя получится файл ASPTester.dll. Теперь зарегестрируй его в системе как простой ActiveX. Теперь открываем файл с расширением asp, который нам создал Delphi. Найди там строку:

<% Set DelphiASPObj = Server.CreateObject("ASPTester.Tester") 
   DelphiASPObj.{Insert Method name here}
%>

Замени текст {Insert Method name here} на имя нашей функции PrintTestText.

Теперь помести файл Tester.asp в директорию WEB-сервера и попробуй просмотреть его с помощью IE.

Logo
Рис 4. Результат

При тестировании ASP-сервера есть одна проблема. Один раз запученый объект (ASPTester.dll) не выгружается из памяти, поэтому ты не сможешь его удалить или перезаписать новой версией. Поэтому я тебе советую тестировать так:

  1. Поместить ASPTester.dll в отдельную директорию. Желательно, чтобы она состояла из цифр, например "1".
  2. Зарегестрировать его regsvr32.exe ASPTester.dll.
  3. Протестировать.
  4. Удалить объект из системы regsvr32.exe /u regsvr32.exe
  5. Внести изменения и поместить новую версию в другой каталог "2".
  6. Перейти на второй шаг

Вот и всё. На сегодня хватит.

 Исходники примера забирай здесь


Design by FMk group ©
Copyright©: Horrific aka Флёнов Михаил ©