Россия, Брянск |
Сервер ATL
DLL-библиотека обработки запросов
DLL-библиотека обработки запросов, создаваемая мастером проекта сервера ATL, реализуется таким образом, что разработчик изменяет код в файле заголовка, имя которого отражает имя проекта. Прототип класса с именем C<имя_проекта>Handler находится в файле заголовка. В проекте NewSimpleATLServer классу присвоено имя CNewSimpleATLServerHandler. В следующем листинге файла NewSimpleATLServer.h этот класс выполняет роль шлюза между классами, представляющими создаваемое программное обеспечение для интернета, и файлами SRF. Весь код можно разместить в классе обработки, однако это сделает его сложным для чтения и работы. Наилучшей стратегией в данном случае является использование данного класса для поддержки атрибутов тегов замещения файла SRF и для построения классов системы согласно структуре программы.
// NewSimpleATLServer.h : Defines the ATL Server request handler class // #pragma once [ request_handler("Default") ] class CNewSimpleATLServerHandler { private: //locals for holding the state of the class CString FName; //first name CString LName; //last name CString FavoriteColor; //name of color //flag to identify if color and name are known bool HaveNameandColor; public: //initialization function HTTP_CODE ValidateAndExchange() { //for debug purposes ATLTRACE("ValidateAndExchange started \n"); //used to validate data passed in CValidateContext c; //assume that we have everything HaveNameandColor = true; //get the form fields const CHttpRequestParams& Formdata = m_HttpRequest.GetFormVars(); //Check validation failures if (VALIDATION_S_OK != Formdata.Validate("firstname", &FName, 1, 10000, &c)) HaveNameandColor = false; if (VALIDATION_S_OK != Formdata.Validate("lastname", &LName, 1, 10000, &c)) HaveNameandColor = false; if (VALIDATION_S_OK != Formdata.Validate("color", &FavoriteColor, 1, 10000, &c)) HaveNameandColor = false; // Set the content-type m_HttpResponse.SetContentType("text/html"); ATLTRACE("ValidateAndExchange completed \n"); return HTTP_SUCCESS; } protected: [ tag_name(name="Hello") ] HTTP_CODE OnHello(void) { ATLTRACE("OnHello started \n"); m_HttpResponse << "Hello World!"; ATLTRACE("OnHello completed \n"); return HTTP_SUCCESS; } [ tag_name(name = "HaveNameAndColor") ] HTTP_CODE OnHaveNameAndColor(void) { ATLTRACE("OnHaveNameAndColor started \n"); if (HaveNameandColor) return HTTP_SUCCESS; else return HTTP_S_FALSE; } [ tag_name(name = "YourName") ] HTTP_CODE OnYourName(void) { m_HttpResponse << FName + " " + LName; return HTTP_SUCCESS; } [ tag_name(name = "YourFavoriteColor") ] HTTP_CODE OnYourFavoriteColor(void) { m_HttpResponse << FavoriteColor; return HTTP_SUCCESS; } }; // class CNewSimpleATLServerHandlerЛистинг 4.5.
Класс CNewSimpleATLServerHandler выполняет следующие задачи:
- вывод сообщения "Hello World";
- подтверждение введенных пользователем данных;
- вывод отчета пользователю о его имени и любимом цвете
Весь код проекта NewSimpleATLServer расположен в файле заголовка для упрощения примера. Функция ValidateAndExchange является первой функцией, вызываемой при обработке запроса в DLL-библиотеке обработки, поэтому экземпляр класса m_HttpRequest проверяется на отправленные посредством HTTP данные с помощью функции m_HttpRequest.GetFormVars и размещения данных в экземпляре класса ChttpRequestParams с использованием ссылки Formdata. Функция Validate ссылки Formdata определяет отправление указанного значения ввода, его соответствие заданному диапазону, после чего значение записывается в переменную. Например, для подтверждения введенного значения используется следующая строка фрагмента кода, в которой Fname – это переменная типа Cstring, предназначенная для записи имени пользователя с длиной от 1 до 10 000 символов.
Validate("firstname", &FName, 1, 10000, &c)
Макрос ATLTRACE повсюду встречается в листинге обработчика CNewSimpleATLServer наряду с различными выражениями отладки в качестве аргументов. ATLTRACE размещает аргумент в окне WebDbg при выполнении на узле (см. рис. 4.12). WebDbg представляет собой утилиту, поставляемую в комплекте со средствами Visual Studio .NET. В группе программ Visual Studio .NET обычно находится ссылка для запуска данной утилиты и именем ISAPI Web Debug Tool.
После запуска утилиту WebDbg нужно присоединить к имени канала AtlsDbgPipe с помощью команды File\Select Pipe\Pipe Name (Файл\Выбрать канал\Имя канала). Отлаживаемый процесс должен иметь разрешение на запись в указанный канал. Аутентификационные данные, под которыми работает IIS, устанавливаются с помощью команды File\Permissions (Файл\Разрешения). Если WebDbg выполняется на том же компьютере, что и веб-сайт, группе Everyone предоставляются разрешение на запись в канал. Если работа сайта осуществляется удаленно, то следует указать аутентификационные данные для определенного компьютера или домена.
Утилита WebDbg принимает через канал сообщения от программы, осуществляющей запись в этот канал. Сообщения по мере записи отображаются в окне WebDbg. Пошаговая обработка кода с помощью Visual Studio .NET IDE является хорошим способом первоначального тестирования кода, однако для использования в тех средах, где будет находиться программное обеспечение после перемещения из среды сервера разработки, целесообразно применение команды trace.
ATLTRACE работает только в конфигурации debug. Если программное решение скомпилировано в конфигурации release, макросы ATLTRACE игнорируются, и не нужно удалять какие-либо коды отладки. При запуске проекта NewSimpleATLServer пользователю отображается фраза hello world. Затем с помощью тега замещения HaveNameAndColor в файле SRF вызывается функция OnHaveNameAndColor. Она проверяет возвращаемое значение локальной переменной HaveNameandColor ("истина" или "ложь"), после чего возвращает соответствующий ответ, т.е. файл SRF либо отображает информацию, либо запрашивает у пользователя имя и любимый цвет. На рисунке 4.13 показан результат выполнения проекта NewSimpleATLServer после ввода пользователем информации. При получении результата, показанного на рисунке, файл SRF определяет значение, возвращенное переменной HaveNameandColor. Поскольку оно истинно, выполняется вызов функции OnYourFavoriteColor и OnYourName с помощью тегов замещения YourFavorityColor и YourName соответственно.