Шаг 14.
Создание Internet-приложений в среде Delphi. Приложение Web-сервера

    На этом шаге мы рассмотрим приложение Web-сервера.

    Когда создается новый проект приложения Web-сервера, в проекте определяется глобальная переменная с именем Application, представляющая собой объект класса TISAPIApplication или TCGIApplication, в зависимости от типа приложения выбранного при создании проекта. При получении соответствующего запроса именно это приложение и будет выполняться.

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


Рис 1. Общая структура приложения Web-сервера

    Когда приложение получает от Web-сервера запрос, оно создает объекты TWebRequest и TWebResponse для размещения в них HTTP-запроса и ответа сервера. Затем эти объекты передаются диспетчеру Web: диспетчеру, встроенному в Web-модуль или компоненту TWebDispatcher.

    Как это следует из самого названия, диспетчер контролирует процесс работы серверного приложения. Диспетчер поддерживает набор объектов-действий, объектов классов TWebActionItem, каждый из которых выполняет обработку различных типов запросов. Задача диспетчера состоит в том, чтобы подобрать к полученному запросу соответствующий объект-действие и передать ему в работу объекты Web-запрос и Web-ответ.

    После того, как обработка запроса заканчивается, диспетчер передает ответ Web-приложению, которое, в свою очередь, передает его серверу Web. Набор объектов-действий первоначально пустой и в задачу разработчика приложения входит определение этих действий. Добавить очередное действие можно из Инспектора Объектов, если щелкнуть на кнопке с многоточием в строке свойства Actions.

    Когда диспетчер получает HTTP-запрос от клиента, он генерирует событие BeforeDispatch, в обработчике которого разработанное приложение имеет последний шанс выполнить предобработку полученного запроса перед тем, как за него "возьмется" соответствующий объект-действие. Затем диспетчер перебирает объекты-действия и ищет среди них тот, который обрабатывает запросы с данным значением пути и использует тот метод, который задан в полях HTTP-запроса. То есть диспетчер сравнивает на предмет совпадения значения свойств PathInfo и MethodType у объекта TwebRequest и объектов TWebActionItem. Если подходящий объект найден, запрос передается ему на обработку, после чего возможны варианты:

  1. Объект-действие заполняет ответ клиенту и отсылает его или передает серверу Web для отправки.
  2. Дописывает свою порцию данных в Web-ответ и оставляет возможность другим объектам сделать то же самое.
  3. Объект просто передает запрос другому объекту-действию.

    Обработка запроса считается законченной, если обработчик события OnAction возвращает значение True для параметра Handled. Если после завершения работы обработчика параметр Handled получает значение False, то обработка считается не законченной и ее может продолжить другой объект-действие.

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

    Если после этого обработка запроса не закончена, диспетчер вызывает действие по умолчанию, если таковое имеется.

    Если по окончании обработки не было вызвано ни одного обработчика, то сообщение серверу для отправки клиенту не посылается и сервер попросту обрывает соединение с клиентом.

    Если ответ сформирован, то перед отправкой его серверу, диспетчер генерирует событие AfterDispatch. Можно воспользоваться этой возможностью для проверки ответа или внесения каких-либо последних изменений в ответ.

    На следующем шаге мы подробнее рассмотрим объекты-действия и методы обработки запросов.




Предыдущий шаг Содержание Следующий шаг