Опубликован: 24.11.2006 | Доступ: свободный | Студентов: 678 / 23 | Оценка: 4.46 / 4.54 | Длительность: 17:18:00
Лекция 4:

Сервер ATL

< Лекция 3 || Лекция 4: 123456 || Лекция 5 >

Параметры приложения в мастере проекта сервера ATL

Параметры приложения обычно базируются на особенностях выбранного шаблона проекта (см. рис. 4.9). При создании веб-службы с помощью ATL Server следует отметить опцию Create As Web Service (Создать как веб-службу). Она исключает использование прочих опций вкладки Application Options (Опции приложения). При создании проекта ATL Serverа доступ к этим опциям открыт. Если опция Stencil Processing Support (Поддержка обработки шаблона) не включена, то недоступны два элемента, подчиненные опциям в секции начального файла ответа сервера.

Вкладка Application Options (Параметры приложения)  в мастере проекта сервера ATL

Рис. 4.9. Вкладка Application Options (Параметры приложения) в мастере проекта сервера ATL

Опция Validation Support (Поддержка подтверждения) обеспечивает функцию ValidateAndExchange в файле заголовка класса обработчика. В других мастерах инициализационный код вставляется в функцию ValidateAndExchange. Эта функция является членом базового класса CRequestHandlerT, предназначенного для замены особым кодом инициализации и подтверждения, связанным с библиотекой DLL веб-приложения. DLL веб-приложения наследуется из класса CRequestHandlerT, и поэтому библиотека DLL веб-приложения также называется DLL-библиотекой обработчика запросов (см. рис. 4.1). CRequestHandlerT осуществляет HTTP-взаимодействия между DLL-библиотекой обработчика запросов и ISAPI, обеспечивая определенный уровень абстракции для ISAPI. Среди прочих возможностей этой библиотеки, наследуемой из класса CRequestHandlerT, можно выделить экземпляры классов m_HttpResponse и m_HttpRequest. Эти классы дают разработчику механизмы чтения и записи запроса или ответа HTTP.

Опция Stencil Processing Support (Поддержка обработки шаблона) добавляет в код демонстрационную функцию hello world и демонстрационный обработчик этой функции. Доступ к области Options For The Initial Server Response File (Опции начального файла ответа сервера) открывается при включении опции Stencil Processing Support (Поддержка обработки шаблона) и позволяет изменять настройки начального файла SRF, сгенерированном мастером.

Если во вкладке Application Options (Параметры приложения) не отмечено ни одной опции, то будет сгенерирована программная структура, аналогичная простому проекту расширения ISAPI. Для многих программистов, работающих с ISAPI и не нуждающихся в функциональности SRF, этот вариант более предпочтителен. ATL Server не нужен файл SRF для функционирования, так как в любой момент можно осуществить прямые вызовы DLL-библиотеки обработчика запросов. Действительно, при выборе опции Generate Combined DLL (Генерировать комбинированную DLL) во вкладке Project Settings (Параметры проекта), если не включены опции вкладки Application Settings (Параметры приложения), будет создана структура, аналогичная проекту расширения ISAPI, в котором отсутствуют многие функции поддержки ATL.

Ниже приведен код класса для DLL-библиотеки обработчика запросов, при создании которого во вкладке Application Options (Параметры приложения) не были включены опции:

// singleDLLNoOptions.h : 
//Defines the ATL Server request handler class
//
#pragma once

[ request_handler("Default") ]
class CsingleDLLNoOptionsHandler
{
private:
      // Put private members here

protected:
      // Put protected members here

public:
      // Put public members here

public:
      HTTP_CODE HandleRequest(AtlServerRequest *pRequest, 
                              IServiceProvider *pProvider)
      {
         // Initialize the CHttpResponse
         CHttpResponse Response;
         BOOL bRet = Response.Initialize(
                                 pRequest->pServerContext);
         if (!bRet)
               return HTTP_FAIL;

         // Set the content-type
         Response.SetContentType("text/html");

         // TODO: Add your handler code here
         // Write the response
         Response << 
            "<html><body><H1>Hello World!</H1></body></html>";
         return HTTP_SUCCESS;
      }
}; // class CsingleDLLNoOptionsHandler
Листинг 4.3.

Опции поддержки разработчика в мастере проекта сервера ATL

Вкладка Developer Support Options (Опции поддержки разработчика) мастера проекта сервера ATL содержит три опции (см. рис.4.10).

Параметры поддержки разработчика в мастере проекта сервера ATL

Рис. 4.10. Параметры поддержки разработчика в мастере проекта сервера ATL
  • Generate TODO Comments (Генерировать комментарии TODO). Добавляет в код комментарии, сообщающие разработчику о том, что необходимо сделать в рассматриваемой секции.

    Примечание. Комментарии TODO – это инструкции о назначении рассматриваемого фрагмента кода, размещаемые в программе.

  • Attributed Code (Код с атрибутами). Обеспечивает поддержку тегов атрибутов для указания вызовов функции.
  • Custom Assert And Trace Handling Support (Поддержка особых опций отладки). Обеспечивает наличие глобально доступного экземпляра класса CDebugReportHook для фиксирования информации из макроса отладки ATL.

Опция Attributed Code (Код с атрибутами) размещает в DLL-библиотеке обработчика запросов уже знакомые нам обработчики тегов для связывания тегов, используемых в SRF-файлах, с ее функциями. В качестве примера рассмотрим демонстрационный метод hello world с кодом с атрибутами:

[ tag_name("Hello") ]
HTTP_CODE OnHello(void)
{
      m_HttpResponse << "Hello World!";
      return HTTP_SUCCESS;
}

Код без атрибутов поддерживает имена обработчиков тегов в SRF, связываемые с рассматриваемой функцией. Он используется макрос REPLACEMENT_METHOD_ENTRY для привязки имени тега к имени функции. Отказ от использования атрибутов предпочтителен при решении задачи о присвоении обработчиков тегов функциям в проектах с большим объемом кода. DLL-библиотека обработчика запросов не содержит путаницы тегов, присущей синтаксису тегов в виде скобок; все функции с тегами определяются в одном месте. В следующем листинге приведен фрагмент кода, использующий для функции OnHello обработчики тегов без атрибутов:

// TODO: Add additional tags to the replacement method map
BEGIN_REPLACEMENT_METHOD_MAP(CNonAttributedCodeHandler)
      REPLACEMENT_METHOD_ENTRY("Hello", OnHello)
END_REPLACEMENT_METHOD_MAP()

HTTP_CODE ValidateAndExchange()
{
      // TODO: Put all initialization and validation code here

      // Set the content-type
      m_HttpResponse.SetContentType("text/html");

      return HTTP_SUCCESS;
}

protected:
// Here is an example of how to use 
//a replacement tag with the stencil processor
HTTP_CODE OnHello(void)
{
      m_HttpResponse << "Hello World!";
      return HTTP_SUCCESS;
}

Опция Custom Assert And Trace Hendling Support (Поддержка особых опций отладки) объявляет глобально доступный экземпляр класса CDebugReportHook в DLL-библиотеке расширения ISAPI. С помощью ATLTRACE и других макросов разработчик записывает код в DLL-библиотеку обработчика запросов, исполняемый только в процессе отладки, а также осуществляет вывод данных в программу, предназначенную для считывания каналов с именами типа WebDbg.exe. В следующем листинге объявление CDebugReportHook действительно только в том случае, если определен макрос _DEBUG:

// For custom assert and trace handling with WebDbg.exe
#ifdef _DEBUG
CDebugReportHook g_ReportHook;
#endif

Завершение работы мастера проекта сервера ATL

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

  • раздельные библиотеки DLL для расширения ISAPI и для обработчика запросов;
  • во вкладке Server Options (Параметры сервера) не включена ни одна опция;
  • поддержка подтверждения;
  • поддержка обработки шаблона;
  • добавление в код комментариев TODO;
  • код с атрибутами;
  • поддержка особых опций отладки.
< Лекция 3 || Лекция 4: 123456 || Лекция 5 >
Олег Корсак
Олег Корсак
Латвия, Рига
Ренат Файзуллин
Ренат Файзуллин
Россия, Казань