Delphi , Інтернет та Мережі , ASP
Новий продукт Boorland - Delphi5, який почав поширюватися восени 1999 містить ряд нових можливостей. Зокрема, до експертів проектів було додано можливість створення ASP додатків. Експерт викликається за допомогою команди File/New/ActiveX і далі вибирається ікона Active Server Object. На жаль, у поточній документації, що розповсюджується з Delphi 5 (Build 5.62), дуже скупо сказано про призначення, послідовність створення та тестування ASP сервера. Приклади працюючого сервера ASP також відсутні в дистрибутиві Delphi5. Ця публікація частково заповнює ці проблеми.
Типовий приклад звернення до ASP сервера з HTML документа виглядає так:
Цей запис є Visual Basic (VB) скрипт. Незважаючи на наявність VB-скрипта, сторінка ASP може бути доступна клієнтам, що працюють на інших операційних системах, наприклад UNIX. На перший погляд це може бути дивним: адже UNIX комп'ютери не має мови Basic, і тим більше VB. Але річ у тому, що скрипти в ASP документах виконуються на сервері і клієнтові надходить HTML документ.
ASP сервер може бути встановлений на Windows NT (Windows 98) операційній системі з запущеним IIS чи Microsoft Personal Web Server (PWS) і це знижує можливості широкого використання ASP сервера. Фактично, ASP сервер є внутрішню розробку компанії Microsoft, яка була (та й могла бути) узгоджена з фактичними законодавцями подальшого розвитку Internet-технологій (Sun, Netscape). У майбутньому не слід очікувати просування цієї технології на інші платформи, оскільки при реалізації ASP – серверів використовувалася COM-технологія, записи до системного реєстру – а це ексклюзивні розробкиMicrosoft. Більш того, інші WEB-сервери, що працюють на платформі Windows (Netscape, Apache), швидше за все не підтримуватимуть ASP технологію, оскільки досі виробники цих серверів успішно ігноювали нові розробки Microsoft в цій галузі.
Фактично, ASP сервер є сервер OLE автомації, у якому зумовлено кілька інтерфейсів, у тому числі - IRequest і IResponse. IRequest містить методи, виклик яких дозволяють встановити параметри, заповнені на клієнті – про це буде розказано нижче. IResponse містить методи, виклик яких призводить до формування HTML документа та, як фінал, передача даного документа клієнту. За цими ознаками ASP сервер нагадує CGI програми та ISAPI/NSAPI dll (далі - WEB сервер програми). Ідеологія виконання методів в ASP сервері та WEB серверних додатках також аналогічна: аналізується (якщо потрібно) запит клієнта та динамічно формується відгук. Відмінність полягає в тому, що WEB серверні програми формують повністю HTML документ, в той час як відгук ASP сервера вставляється у вихідну HTML сторінку. Наприклад, якщо документ ASP представлений у вигляді:
ASP сервер реалізується як у *.exe, так і в *.dll додатках - це дозволяється при створенні сервера OLE автомації. ASP сервер, реалізований в файлі *.exe, запускається один раз у відповідь на запит клієнта. При використанні внутрішніх (in-process) ASP серверів один екземпляр DLL, завантажений в оперативну пам'ять, здатний обслуговувати одночасно кількох клієнтів. При цьому для кожного клієнта може створюватися як окремий екземпляр об'єкта COM, так і єдиний екземпляр об'єкта COM може обслуговувати декількох клієнтів. Це залежить від обраної моделі роботи в потоках (Threading Model) під час заповнення діалогу при виборікоманди File/New/ActiveX/Active Server Object.
Розглянемо тепер, як працює ASP сервер на конкретному прикладі створення внутрішнього (in-process) ASP сервера. Обмежимося сервером, який виконує один запит. Виберемо команду File/New/ActiveX/ActiveX Library та натисніть кнопку OK. Буде створено новий проект, який збережемо, наприклад, під назвою ASP01. Далі, викличемо з меню команду File/New/ActiveX/Active Server Object. У діалозі, що з'являється, визначимо ім'я класу, наприклад, Test. Оскільки створюється in-process сервер, параметр Instancing не відіграє ролі, зате має значення параметр Threading Model. Вибір параметра Single призводить до неефективної роботі сервера - при одночасному щодо нього зверненні кількох клієнтів, сервер виконує запити послідовно і якщо з клієнтів звертається з тривалим запитом, інші змушені чекати його закінчення, навіть якщо запити вони короткі за часом. У них складається враження про зависання експлорера і часто це призводить до спроб перервати завдання різними методами. Вибір параметра Apartment призводить до поділу запитів клієнтів по потоках, при цьому для кожного клієнта буде створено свій екземпляр COM об'єкта - у цьому прикладі класу TTest. При цьому при написанні методів класу не потрібно захисту змінних класу по потоках - клієнт може вільно модифікувати їх і це спрощує розробку коду програми. Недолік цієї моделі - проект ресурсомісткий та змінні класу ініціалізуються на кожне звернення, що подовжує час відгуку. Цих недоліків позбавлена модель Free, у яких єдиний екземпляр COM об'єкта обслуговує кількох клієнтів. Однак, якщо клієнти можуть змінювати дані, то це вимагає захисту загальних змінних потоків, що суттєво ускладнює процедуру реалізації коду.додатки і є потенційним джерелом помилок, що важко вловити. Як правило, цю модель використовують у серверах, які лише надають дані, але клієнт не може їх модифікувати.
Група контролю Active Server Type дозволяє вибрати призначення ASP сервера. Якщо сервер планується інсталювати на комп'ютері, яким керує IIS версії 3 або 4, слід вибрати Page Level Events Methods. З IIS5 ця опція теж працює, але ефективніше працюватиме опція Object Context. Цю ж опцію необхідно вибирати, якщо ASP керує Microsoft Transaction Server (MTS). Фактично IIS5 також керує цим сервером за допомогою MTS - обидва ці продукти тісно інтегровані.
Опцію Generate a Template Test Script для цього об'єкта слід залишати завжди включеною - Delphi в цьому випадку створить невеликий HTML документ, який з невеликими змінами можна використовувати для тестування ASP сервера.
Якщо заглянути у файл реалізації (U1_01.pas), то клас ТТest є нащадком класу TASPObject. При виборі опції Object Context бібліотека типів не містить визначених методів, а сам клас TTest був нащадком TASPMTSObject. Обидва класи-предка TTest містять абсолютно однакові методи і свійста, але клас TASPObject додатково містить пару методів інтерфейсу IASPObject - OnStartPage та OnEndPage.
Назвемо новостворений метод ScriptContent набивши цей текст у назві методу з миготливою кареткою. Цей метод не повинен мати параметрів. Далі викличемо команду Refresh натисканням кнопки 2. Після цього в модулі реалізації (U1_01.pas) з'явиться заготовка, де слід описати реалізацію. Метод реалізуємо наступним чином: