Сервер
При отправке запросов в IIS на ресурс, которым является источник
На рисунке 4.1 приведен обзор архитектуры
(рис 4.1) Обзор архитектуры ATL ServerТак как библиотека DLL расширения ISAPI может располагаться на несущем сервере не в корневом веб-каталоге, то IIS нужно знать, какие действия выполнять с файлом расширения ISAPI и файлами, связанными с библиотекой DLL расширения ISAPI (файлами ответа сервера и DLL веб-приложения). Чтобы сравнить программное решение для интернета, требующее текстовых файлов для обработки расширением ISAPI, мы будем использовать технологию ASP и противопоставим ее механизму IIS для связи файлов и расширения ISAPI. IIS известно, как обрабатывать файлы ASP, поскольку имена файлов, оканчивающиеся на .asp обрабатываются с помощью расширения ISAPI с именем ASP.DLL.
Код внутри ASP.DLL открывает связанный ASP-файл и интерпретирует код в
тегах ASP. Веб-формы и веб-службы, работающие с файлами .aspx и .asmx,
используют такой же механизм, только они применяют технологию .NET
вместо ASP.DLL для интерпретации кода и тегов, содержащихся в
соответствующих файлах.
Для использования службами IIS библиотеки расширения ISAPI файлы ответа
сервера и файлы библиотеки DLL приложения необходимо связать с
соответствующей библиотекой расширения ISAPI, аналогично тому, как
файлы с расширениями .asp связаны с библиотекой ASP.DLL или файлы с
расширениями .aspx связаны с интерпретатором технологии .NET aspnet_isapi.dll. Расширение имен файлов ответов сервера .srf и
расширение .dll DLL-библиотек веб-приложения должны быть связаны с
соответствующей DLL-библиотекой расширения ISAPI.
Ниже показано, как можно связать расширения имен файлов с расширениями ISAPI.
(рис 4.2) Окно настройки приложения предназначено для связывания файлов с расширениямиРасположение DLL-библиотеки веб-приложения, используемой файлом ответа сервера, определяется в самом файле ответа сервера. Она должна находиться в корне виртуального каталога. Файл ответа сервера содержит тег обработчика, определяющий относительное расположение этой библиотеки. (Для получения более подробной информации о тегах обработчика обратитесь к разделу "Файлы ответа сервера".) Когда в IIS направляется HTTP-запрос на файлы ответа сервера или библиотеку DLL веб-приложения, IIS с помощью связей файлов определяет, где искать эту библиотеку для обработки и интерпретации запроса.
Ни одна из задействованных библиотек не является DLL-библиотекой модели
компонентных объектов (COM), поэтому IIS и компоненты
Многие из разработчиков знают, что расположение COM-объекта на узле определяется связыванием уникального идентификационного номера (CLSID) с путем к файлу DLL. Эта информация записывается в реестр Windows, и любое программное обеспечение, запрашивающее использование DLL-библиотеки COM- объекта, сможет работать с ней. Доступ к DLL с помощью ее физического нахождения и загрузки выглядит несколько устаревшим по сравнении с архитектурой, появившейся после технологии COM, но такое решение дает некоторые преимущества с точки зрения управления. Связи с файлами в IIS базируются на файловых расширениях. DLL-библиотека веб-приложения указывается посредством относительного пути. Перемещение файлов на другой сервер нарушает связи файлов IIS с DLL-библиотекой расширения ISAPI, но другие файлы перемещаются так, как если бы они являлись статическим содержимым, поскольку их расположение относительно друг друга контролируется.
Создадим проект
Visual Studio .NET предлагает множество шаблонов
Шаблон .asmx веб-служб в C#, являющимся механизмом
управления DLL-библиотекой, веб-служба сервера
(рис 4.4) Окно Overview (Обзор) мастера проекта сервера ATLПосле нажатия на кнопку Finish (Готово) Visual Studio .NET начнет
генерирование файлов согласно параметрам по умолчанию мастера проекта
сервера NewSimpleATLServer (см.
рис. 4.3). В Visual Studio .NET имеется Solution Explorer
(Обозреватель решения) для просмотра проектов и связанных с ними
файлов. В его окне представлено иерархическое дерево проектов и файлов,
связанных с открытым в данный момент программным решением. Solution
Explorer можно открыть с помощью команды View\Solution Explorer
(Вид\Обозреватель решения). В окне Solution Explorer мы видим проекты NewSimpleATLServer и NewSimpleATLServerISAPI. Проект NewSimpleATLServer
содержит код, специфичный для приложения. Его результатом является
DLL-библиотека веб-приложения и файл ответа сервера (SRF). Продуктом
проекта NewSimpleATLServerISAPI является только ISAPI DLL.
В отличие от шаблонов веб-служб для C# и Visual Basic, в локальный
экземпляр IIS не добавляется автоматически виртуальный каталог. Visual
Studio .NET можно настроить на реализацию файлов, устанавливающих
программное решение
(рис 4.5) Окно свойств проекта и окно Solution Explorer (Обозреватель решения)bin папки, на которую
указывает виртуальный каталог IIS. Вы можете указать другое имя
каталога..srf;.dll. В созданном виртуальном каталоге будут присутствовать
эти связи.После установки
Нажмите на клавишу F5, и, независимо от того, какое окно выбрано в Visual Studio .NET, начнется построение, реализация и запуск проекта NewSimpleATLServer. Появится окно, информирующее об истечении срока действия файлов с запросом на разрешение повторной компиляции. После успешной компиляции двоичных файлов обработчика запросов DLL и расширения ISAPI эти файлы будут перемещены вместе с демонстрационным файлом SRF в место расположения в корневом веб-каталоге веб-сайта IIS по умолчанию. Visual Studio .NET попробует присоединить себя к IIS и провести пошаговую отладку кода, в результате чего, скорее всего, появится следующее сообщение об ошибке.

Запомните. Имя проекта StartUp в любом решении Visual Studio .NET
указывается в Solution Explorer жирным шрифтом. Если решение содержит
несколько проектов, то шаблон проекта, как правило, автоматически
устанавливает нужный проект как StartUp. Тем не менее, убедитесь в том,
что в качестве стартового (StartUp) установлен нужный проект, так как
проект StartUp устанавливается случайным образом. Для присвоения
проекту статуса StartUp щелкните правой кнопкой мыши на проекте в окне
Solution Explorer и в контекстном меню выберите Set As StartUp Project
(Сделать
Visual Studio .NET не устанавливается с поддержкой отладки
(рис 4.6) Установка Native Remote Debugging (Обычная удаленная отладка)После установки обычной .dll и .srf
не связаны с ассоциированной DLL-библиотекой расширения ISAPI в
рассматриваемом экземпляре IIS или виртуальном каталоге. В этом случае
откройте связи приложения (см. рис. 4.2) и проверьте правильность
связи файлов .dll и .srf с нужной библиотекой.
Поскольку сложная конфигурация Hello World, разработчик должен хорошо разбираться в процессах,
происходящих внутри IIS и технологии .NET. Использование мощи
Совет. Если при работе с IIS и
Мастер проекта сервера
Во вкладке Project Settings (Параметры проекта) мастера проекта сервера
(рис 4.7) Параметры проекта в мастере проекта сервера ATLОпытный разработчик сможет самостоятельно настроить параметры проекта для смены его типа, но с точки зрения надежности и быстроты операции разумнее изменить параметры мастера для некоторых конфигураций создаваемых двоичных файлов.
Во вкладке Server Options (Параметры сервера) мастера проекта сервера
(рис 4.8) Вкладка Server Options (Параметры сервера) мастера проекта сервера ATLЕсли проект сервера
При генерации мастером кода создается класс с таким же именем, как у
проекта, к началу имени присоединяется символ "C", а к
концу добавляется слово "Handler". Этот класс будет
интерфейсом веб-приложения в IIS за счет включения в себя обработчиков
тегов. Пусть проект называется atlServer4 ((см. рис. 4.7), тогда
мастер для поддержки обработчиков тегов создаст класс CatlServer4Handler.
Включение любой из следующих опций во вкладке Server Options (Параметры сервера) мастера позволит добавить в класс обработчик кода, объявляющий и инициализирующий указатели на соответствующий класс поддержки.
ImemoryCache для
управления случайными участками памяти.IfileCache для
управления именами файлов.IbrowserCapsSvs для управления возможностями браузера.Если в мастере выбраны опции File Cache (Кэш файлов), Blob Cache (Кэш
памяти) и Browser Capabilities Support (Поддержка возможностей
браузера), а проект называется SimpleATLServer, то будет сгенерирован
класс CSimpleATLServerHandler и записан в заголовок SimpleATLServer.h.
В частной секции класса CSimpleATLServerHandler будут сгенерированы
следующие объявления с комментариями перед кодом:
// File cache support
// CComPtr<IFileCache> m_spFileCache;
// Blob cache support
// CComPtr<IMemoryCache> m_spBlobCache;
// Data Source cache support
// CComPtr<IBrowserCapsSvc> m_spBrowserCaps;
Примечание. В приведенном коде указатель Browser Capabilities Support
(Поддержка возможностей браузера) неправильно определен в комментарии
как поддержка кэша источника данных, что привело к незначительной
ошибке в шаблоне мастера проекта сервера
При использовании указателей на File Cache (Кэш файлов), Blob Cache
(Кэш памяти) и Browser Capabilities Support (Поддержка возможностей
браузера) с каждого из них нужно снять статус комментария. Указатели
инициализируются в общей функции ValidateAndExchange. Она включается в
каждый класс обработчика, генерируемый мастером проекта сервера
HTTP_CODE ValidateAndExchange()
{
// TODO: Put all initialization and validation code here
// Set the content-type
m_HttpResponse.SetContentType("text/html");
// uncomment the service initialization(s) if you want to use
// a service that was generated with your ISAPI extension
// Get the IFileCache service from the ISAPI extension
// if (FAILED(m_spServiceProvider->QueryService
// (__uuidof(IFileCache),
// m_spFileCache)))
// return HTTP_FAIL;
// Get the IMemoryCache service from the ISAPI extension
// if (FAILED(m_spServiceProvider->QueryService
// (__uuidof(IMemoryCache),
// m_spBlobCache)))
// return HTTP_FAIL;
// Get the IBrowserCapsSvc service from the ISAPI extension
// if (FAILED (m_spServiceProvider->QueryService
// (__uuidof(IBrowserCapsSvc),
// m_spBrowserCaps)))
// return HTTP_FAIL;
return HTTP_SUCCESS;
}
В ассоциированное расширение ISAPI следует добавить код для поддержки элементов, выбранных во вкладке Server Options (Параметры сервера) мастера. В отличие от кода класса обработчиков код поддержки в расширении ISAPI не является закомментированным, он входит в программное решение независимо от того, используется он или нет. Не включайте поддержку функциональности – это позволит сократить количество ресурсов.
Поддержка файлового кэширования добавляет указатель класса для поддержки функций управления указателями файлов, относящихся к чтению и записи файлов. Непосредственно содержимое файла не хранится в классе кэша; он содержит информацию о расположении файлов, их именах и размерах. При удалении элементов из кэша они удаляются с жесткого диска, поэтому кэширование файлов предназначено только для управления временными файлами.
Кэш памяти необходим для взаимодействия с фрагментами памяти
переменного размера в отличии от других классов кэширования памяти
Кэш источника данных обеспечивает функциональность, присущую и другим классам кэширования, исключая хранение подключений к источникам данных.
При выборе опции
Предопределенными счетчиками производительности являются следующие.
Для поддержки возможностей браузера имеется указатель класса IbrowserCapsSvc и код инициализации, предназначенный для настройки
указателя на IbrowserCapsSvc. Если указатель на указатель класса IbrowserCaps передается функции GetCaps класса IbrowserCapsSvc вместе с
указателем на контекст сервера, то экземпляр IbrowserCaps позволяет
выполнить запрос возможностей браузера. Эта информация определяется
экземпляром класса IbrowserCaps с помощью сравнения значения , отправленного веб-серверу с запросом HTTP, с
соответствующим значением в файле browsercap.ini (он обычно находится в
папке $(windows)\system32\inetsrv\ ). В файле browsercap.ini приведен HTTP User Agent и определены его параметры. Например, для браузера
Internet Explorer (IE) 5 в файле browsercap.ini указано следующее:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 [IE 5.0] browser=IE Version=5.0 majorver=5 minorver=0 frames=True tables=True cookies=True backgroundsounds=True vbscript=True javaapplets=True javascript=True ActiveXControls=True Win16=False beta=True AK=False SK=False AOL=False Update=False [Mozilla/4.0 (compatible; MSIE 5.*; Windows 95*)] parent=IE 5.0 platform=Win95 beta=True [Mozilla/4.0 (compatible; MSIE 5.*; Windows 98*)] parent=IE 5.0 platform=Win98 beta=True [Mozilla/4.0 (compatible; MSIE 5.*; Windows NT*)] parent=IE 5.0 platform=WinNT beta=True [Mozilla/4.0 (compatible; MSIE 5.*; Windows 2000*)] parent=IE 5.0 platform=Win2000 beta=True [Mozilla/4.0 (compatible; MSIE 5.*)] parent=IE 5.0
Опция Resource Language (Язык источника) во вкладке Server Options (Параметры сервера) обеспечивает поддержку использования других языков для генерирования текста копии в файлах источников проекта. Необходимо установить Visual Studio .NET с поддержкой языков для нужного ресурса, чтобы открыть доступ к этой опции.
Параметры приложения обычно базируются на особенностях выбранного
шаблона проекта (см. рис. 4.9). При создании веб-службы с помощью
(рис 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.
Опция hello world и демонстрационный
обработчик этой функции. Доступ к области Options For The Initial
Server Response File (Опции начального файла ответа сервера)
открывается при включении опции SRF,
сгенерированном мастером.
Если во вкладке Application Options (Параметры приложения) не отмечено
ни одной опции, то будет сгенерирована программная структура,
аналогичная простому проекту расширения ISAPI. Для многих
программистов, работающих с ISAPI и не нуждающихся в функциональности
SRF, этот вариант более предпочтителен.
Ниже приведен код класса для 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.10) Параметры поддержки разработчика в мастере проекта сервера ATLПримечание. Комментарии TODO – это инструкции о назначении рассматриваемого фрагмента кода, размещаемые в программе.
CDebugReportHook для фиксирования информации из макроса отладки Опция 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
По окончании генерирования код проекта
Далее нужно выполнить анализ информации, полученной от
веб-пользователя, вынесение решения относительно полученных данных и
возврат ответа пользователю. Посредством добавления определенного кода
в проект NewSimpleATLServer файл SRF веб-приложения Hello World
связывается с другим приложением, которое выполняет либо запрос имени и
любимого цвета веб-пользователя, либо сообщает пользователю его имя и
любимый цвет. После настройки файла SRF можно изменить класс
DLL-библиотеки обработчика запросов в соответствии с требованиями SRF.
Файл SRF является хорошей альтернативой языкам Extensible Styleshet
Language (XSL) или Extensible Stylesheet Language Transformation (XSLT)
и веб-формам ASP.NET за счет предоставления механизма форматирования и
отображения выходных данных
(рис 4.11) Представление Design (Дизайн) файла NewSimpleATLServer.srf
Теги в SRF обозначаются двумя парами фигурных скобок, содержащих внутри
аргумент, обычно соответствующий атрибуту тега внутри DLL-библиотеки
обработчика запросов. Атрибуты тега в DLL-библиотеке обработчика
запросов связаны с функциями, выполняющими определенную задачу и
возвращающими данные, предназначенные для вставки в файл SRF. Один файл
SRF способен вызвать много DLL-библиотек обработки запросов. Файл SRF
может включать в себя другие файлы SRF с помощью тега include и
поддерживает комментарии в коде.
Первым тегом любого файла SRF является тег handler. Тег handler
указывает библиотеку DLL, к которой осуществляется доступ при поиске
функций, указанных тегами замещения в файле SRF. Также можно указать
тег subhandler. В одном файле SRF можно вызвать функции из одной или
нескольких DLL-библиотек обработки запросов. В теге handler или subhandler используются псевдонимы, с помощью которых формируются теги
замещения для вызова функций из рассматриваемой библиотеки DLL
обработчика запросов с применением имени alias.function. Тег handler
имеет следующий синтаксис:
{{handler <handler name>.dll/Default}}
По умолчанию Visual Studio .NET записывает файлы DLL в каталог с
файлами SRF. Размещение двоичных файлов, как правило, представляет
определенный уровень абстракции, отличающийся от кода файлов SRF,
поэтому двоичные файлы предпочтительнее записывать в отдельный каталог
на сервере. Для этого обычно используется подкаталог корневого
веб-каталога или каталог корневого виртуального каталога с именем bin.
При использовании подкаталога bin для хранения библиотек DLL тег handler выглядит следующим образом:
{{handler bin\<handler name>.dll/Default}}
Тег замещения наиболее часто используется в файле SRF. Теги замещения
являются точкой доступа разработчика к функциям DLL-библиотек обработки
запросов. Тег замещения осуществляет запрос ответа от библиотеки,
содержащей нужную функцию, и вставляет ответ в том месте файла SRF, в
котором находится тег замещения. Теги замещения поддерживают инструкции
для вызова функций, выполняют передачу аргументов функции в
DLL-библиотеку обработки запросов. Например, блок if..else..endif можно
реализовать с помощью команды {{if<FunctionName>}}, являющейся
начальной точкой блока if. Блоки Else и endif обозначаются командами {{else}} и {{endif}} соответственно.
В проекте NewSimpleATLServer SRF вызывает функцию по имени атрибута HaveNameAndColor, как показано в следующем коде. Если HaveNameAndColor
возвращает значение "истина", отображаются имя и любимый
цвет, введенные пользователем. Если один из элементов неизвестен, то
функция HaveNameAndColor возвращает значение "ложь", и SRF
запрашивает у пользователя имя, фамилию и любимый цвет. Теги замещения
поддерживают инструкции while..endwhile для реализации циклов.
<html>
<HEAD>
</HEAD>
<BODY>
<P>{{//comments can appear before handler tag}}</P>
<P>{{handler bin\NewSimpleATLServer.dll/Default}}</P>
<P>First let me say : {{Hello}}<br>
</P>
<P>{{if HaveNameAndColor}}
</P>
<P>I can rest easy now because I know your name is:
{{YourName}}</P>
<P>
and your favorite color is: {{YourFavoriteColor}}
<P>
{{else}}
<P>Tell me this:</P>
<FORM id="Form1" action="NewSimpleATLServer.srf" method="post">
<P>First Name <INPUT id="Text1" type="text" name="firstname"></P>
<P>Last Name <INPUT id="Text2" type="text" name="lastname"></P>
<P>Favorite color <INPUT id="Text3" type="text" name="color"></P>
<P>
<INPUT id="Submit1" type="submit" value="Submit" name="Submit1">
</P>
</FORM>
<P>{{endif}}</P>
</BODY>
</html>
Предупреждение. Теги замещения в файлах SRF, ссылающиеся на
несуществующий атрибут в DLL-библиотеке обработки запросов, вызовут
ошибку HTTP 500 Internal
Мы видим, что листинг исходного кода файла NewSimpleATLServer.srf (см.
рис. 4.11) является документом HTML. Единственным различием между
файлом HTML и SRF является присутствие тегов, заключенных в парные
фигурные скобки ("{{ }}"). Элементы управления сервера,
предоставляемых проектами веб-службы или веб-формы, по умолчанию
недоступны в проекте сервера .srf.
Примечание. Возможность добавления комментариев в файл SRF не столь
обширна, как в других типах программных решений (например, в
исполняемой программе или веб-службе). Иногда пробелы, размещаемые
перед или после тегов замещения, вызывают ошибку в работе файла SRF.
Комментарии размещаются перед тегом обработки. Для обозначения тегов
используются стили комментариев HTML ( !-- ) или C++ ( // ). Комментарии
нельзя располагать на одной строке с другими тегами, например, с тегами
замещения. Например, следующая строка вызовет возврат файлом SRF
внутренней ошибки сервера HTTP 500: {{endif // if HaveNameAndColor}}.
DLL-библиотека обработки запросов, создаваемая мастером проекта сервера
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
Класс CNewSimpleATLServerHandler выполняет следующие задачи:
Весь код проекта 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
После запуска утилиту WebDbg нужно присоединить к имени канала AtlsDbgPipe с помощью команды File\Select Pipe\Pipe Name (Файл\Выбрать
канал\Имя канала). Отлаживаемый процесс должен иметь разрешение на
запись в указанный канал. Аутентификационные данные, под которыми
работает IIS, устанавливаются с помощью команды File\Permissions
(Файл\Разрешения). Если WebDbg выполняется на том же компьютере, что и
веб-сайт, группе Everyone предоставляются разрешение на запись в канал.
Если работа сайта осуществляется удаленно, то следует указать
аутентификационные данные для определенного компьютера или домена.
Утилита WebDbg принимает через канал сообщения от программы,
осуществляющей запись в этот канал. Сообщения по мере записи
отображаются в окне WebDbg. Пошаговая обработка кода с помощью Visual
Studio .NET IDE является хорошим способом первоначального тестирования
кода, однако для использования в тех средах, где будет находиться
программное обеспечение после перемещения из среды сервера разработки,
целесообразно применение команды trace.
(рис 4.12) Сообщения ATLTRACE, записанные в WebDbg
ATLTRACE работает только в конфигурации debug. Если программное решение
скомпилировано в конфигурации release, макросы ATLTRACE игнорируются, и
не нужно удалять какие-либо коды отладки. При запуске проекта NewSimpleATLServer пользователю отображается фраза hello world. Затем с
помощью тега замещения HaveNameAndColor в файле SRF вызывается функция OnHaveNameAndColor. Она проверяет возвращаемое значение локальной
переменной HaveNameandColor ("истина" или
"ложь"), после чего возвращает соответствующий ответ, т.е.
файл SRF либо отображает информацию, либо запрашивает у пользователя
имя и любимый цвет. На рисунке 4.13 показан результат выполнения
проекта NewSimpleATLServer после ввода пользователем информации. При
получении результата, показанного на рисунке, файл SRF определяет
значение, возвращенное переменной HaveNameandColor. Поскольку оно
истинно, выполняется вызов функции OnYourFavoriteColor и OnYourName с
помощью тегов замещения YourFavorityColor и YourName соответственно.
(рис 4.13) Результат выполнения проекта NewSompleATLServer после ввода
пользователем информации
Сервер
При отправке запросов в IIS на ресурс, которым является источник
На рисунке 4.1 приведен обзор архитектуры
(рис 4.1) Обзор архитектуры ATL ServerТак как библиотека DLL расширения ISAPI может располагаться на несущем сервере не в корневом веб-каталоге, то IIS нужно знать, какие действия выполнять с файлом расширения ISAPI и файлами, связанными с библиотекой DLL расширения ISAPI (файлами ответа сервера и DLL веб-приложения). Чтобы сравнить программное решение для интернета, требующее текстовых файлов для обработки расширением ISAPI, мы будем использовать технологию ASP и противопоставим ее механизму IIS для связи файлов и расширения ISAPI. IIS известно, как обрабатывать файлы ASP, поскольку имена файлов, оканчивающиеся на .asp обрабатываются с помощью расширения ISAPI с именем ASP.DLL.
Код внутри ASP.DLL открывает связанный ASP-файл и интерпретирует код в
тегах ASP. Веб-формы и веб-службы, работающие с файлами .aspx и .asmx,
используют такой же механизм, только они применяют технологию .NET
вместо ASP.DLL для интерпретации кода и тегов, содержащихся в
соответствующих файлах.
Для использования службами IIS библиотеки расширения ISAPI файлы ответа
сервера и файлы библиотеки DLL приложения необходимо связать с
соответствующей библиотекой расширения ISAPI, аналогично тому, как
файлы с расширениями .asp связаны с библиотекой ASP.DLL или файлы с
расширениями .aspx связаны с интерпретатором технологии .NET aspnet_isapi.dll. Расширение имен файлов ответов сервера .srf и
расширение .dll DLL-библиотек веб-приложения должны быть связаны с
соответствующей DLL-библиотекой расширения ISAPI.
Ниже показано, как можно связать расширения имен файлов с расширениями ISAPI.
(рис 4.2) Окно настройки приложения предназначено для связывания файлов с расширениямиРасположение DLL-библиотеки веб-приложения, используемой файлом ответа сервера, определяется в самом файле ответа сервера. Она должна находиться в корне виртуального каталога. Файл ответа сервера содержит тег обработчика, определяющий относительное расположение этой библиотеки. (Для получения более подробной информации о тегах обработчика обратитесь к разделу "Файлы ответа сервера".) Когда в IIS направляется HTTP-запрос на файлы ответа сервера или библиотеку DLL веб-приложения, IIS с помощью связей файлов определяет, где искать эту библиотеку для обработки и интерпретации запроса.
Ни одна из задействованных библиотек не является DLL-библиотекой модели
компонентных объектов (COM), поэтому IIS и компоненты
Многие из разработчиков знают, что расположение COM-объекта на узле определяется связыванием уникального идентификационного номера (CLSID) с путем к файлу DLL. Эта информация записывается в реестр Windows, и любое программное обеспечение, запрашивающее использование DLL-библиотеки COM- объекта, сможет работать с ней. Доступ к DLL с помощью ее физического нахождения и загрузки выглядит несколько устаревшим по сравнении с архитектурой, появившейся после технологии COM, но такое решение дает некоторые преимущества с точки зрения управления. Связи с файлами в IIS базируются на файловых расширениях. DLL-библиотека веб-приложения указывается посредством относительного пути. Перемещение файлов на другой сервер нарушает связи файлов IIS с DLL-библиотекой расширения ISAPI, но другие файлы перемещаются так, как если бы они являлись статическим содержимым, поскольку их расположение относительно друг друга контролируется.
Создадим проект
Visual Studio .NET предлагает множество шаблонов
Шаблон .asmx веб-служб в C#, являющимся механизмом
управления DLL-библиотекой, веб-служба сервера
(рис 4.4) Окно Overview (Обзор) мастера проекта сервера ATLПосле нажатия на кнопку Finish (Готово) Visual Studio .NET начнет
генерирование файлов согласно параметрам по умолчанию мастера проекта
сервера NewSimpleATLServer (см.
рис. 4.3). В Visual Studio .NET имеется Solution Explorer
(Обозреватель решения) для просмотра проектов и связанных с ними
файлов. В его окне представлено иерархическое дерево проектов и файлов,
связанных с открытым в данный момент программным решением. Solution
Explorer можно открыть с помощью команды View\Solution Explorer
(Вид\Обозреватель решения). В окне Solution Explorer мы видим проекты NewSimpleATLServer и NewSimpleATLServerISAPI. Проект NewSimpleATLServer
содержит код, специфичный для приложения. Его результатом является
DLL-библиотека веб-приложения и файл ответа сервера (SRF). Продуктом
проекта NewSimpleATLServerISAPI является только ISAPI DLL.
В отличие от шаблонов веб-служб для C# и Visual Basic, в локальный
экземпляр IIS не добавляется автоматически виртуальный каталог. Visual
Studio .NET можно настроить на реализацию файлов, устанавливающих
программное решение
(рис 4.5) Окно свойств проекта и окно Solution Explorer (Обозреватель решения)bin папки, на которую
указывает виртуальный каталог IIS. Вы можете указать другое имя
каталога..srf;.dll. В созданном виртуальном каталоге будут присутствовать
эти связи.После установки
Нажмите на клавишу F5, и, независимо от того, какое окно выбрано в Visual Studio .NET, начнется построение, реализация и запуск проекта NewSimpleATLServer. Появится окно, информирующее об истечении срока действия файлов с запросом на разрешение повторной компиляции. После успешной компиляции двоичных файлов обработчика запросов DLL и расширения ISAPI эти файлы будут перемещены вместе с демонстрационным файлом SRF в место расположения в корневом веб-каталоге веб-сайта IIS по умолчанию. Visual Studio .NET попробует присоединить себя к IIS и провести пошаговую отладку кода, в результате чего, скорее всего, появится следующее сообщение об ошибке.

Запомните. Имя проекта StartUp в любом решении Visual Studio .NET
указывается в Solution Explorer жирным шрифтом. Если решение содержит
несколько проектов, то шаблон проекта, как правило, автоматически
устанавливает нужный проект как StartUp. Тем не менее, убедитесь в том,
что в качестве стартового (StartUp) установлен нужный проект, так как
проект StartUp устанавливается случайным образом. Для присвоения
проекту статуса StartUp щелкните правой кнопкой мыши на проекте в окне
Solution Explorer и в контекстном меню выберите Set As StartUp Project
(Сделать
Visual Studio .NET не устанавливается с поддержкой отладки
(рис 4.6) Установка Native Remote Debugging (Обычная удаленная отладка)После установки обычной .dll и .srf
не связаны с ассоциированной DLL-библиотекой расширения ISAPI в
рассматриваемом экземпляре IIS или виртуальном каталоге. В этом случае
откройте связи приложения (см. рис. 4.2) и проверьте правильность
связи файлов .dll и .srf с нужной библиотекой.
Поскольку сложная конфигурация Hello World, разработчик должен хорошо разбираться в процессах,
происходящих внутри IIS и технологии .NET. Использование мощи
Совет. Если при работе с IIS и
Мастер проекта сервера
Во вкладке Project Settings (Параметры проекта) мастера проекта сервера
(рис 4.7) Параметры проекта в мастере проекта сервера ATLОпытный разработчик сможет самостоятельно настроить параметры проекта для смены его типа, но с точки зрения надежности и быстроты операции разумнее изменить параметры мастера для некоторых конфигураций создаваемых двоичных файлов.
Во вкладке Server Options (Параметры сервера) мастера проекта сервера
(рис 4.8) Вкладка Server Options (Параметры сервера) мастера проекта сервера ATLЕсли проект сервера
При генерации мастером кода создается класс с таким же именем, как у
проекта, к началу имени присоединяется символ "C", а к
концу добавляется слово "Handler". Этот класс будет
интерфейсом веб-приложения в IIS за счет включения в себя обработчиков
тегов. Пусть проект называется atlServer4 ((см. рис. 4.7), тогда
мастер для поддержки обработчиков тегов создаст класс CatlServer4Handler.
Включение любой из следующих опций во вкладке Server Options (Параметры сервера) мастера позволит добавить в класс обработчик кода, объявляющий и инициализирующий указатели на соответствующий класс поддержки.
ImemoryCache для
управления случайными участками памяти.IfileCache для
управления именами файлов.IbrowserCapsSvs для управления возможностями браузера.Если в мастере выбраны опции File Cache (Кэш файлов), Blob Cache (Кэш
памяти) и Browser Capabilities Support (Поддержка возможностей
браузера), а проект называется SimpleATLServer, то будет сгенерирован
класс CSimpleATLServerHandler и записан в заголовок SimpleATLServer.h.
В частной секции класса CSimpleATLServerHandler будут сгенерированы
следующие объявления с комментариями перед кодом:
// File cache support
// CComPtr<IFileCache> m_spFileCache;
// Blob cache support
// CComPtr<IMemoryCache> m_spBlobCache;
// Data Source cache support
// CComPtr<IBrowserCapsSvc> m_spBrowserCaps;
Примечание. В приведенном коде указатель Browser Capabilities Support
(Поддержка возможностей браузера) неправильно определен в комментарии
как поддержка кэша источника данных, что привело к незначительной
ошибке в шаблоне мастера проекта сервера
При использовании указателей на File Cache (Кэш файлов), Blob Cache
(Кэш памяти) и Browser Capabilities Support (Поддержка возможностей
браузера) с каждого из них нужно снять статус комментария. Указатели
инициализируются в общей функции ValidateAndExchange. Она включается в
каждый класс обработчика, генерируемый мастером проекта сервера
HTTP_CODE ValidateAndExchange()
{
// TODO: Put all initialization and validation code here
// Set the content-type
m_HttpResponse.SetContentType("text/html");
// uncomment the service initialization(s) if you want to use
// a service that was generated with your ISAPI extension
// Get the IFileCache service from the ISAPI extension
// if (FAILED(m_spServiceProvider->QueryService
// (__uuidof(IFileCache),
// m_spFileCache)))
// return HTTP_FAIL;
// Get the IMemoryCache service from the ISAPI extension
// if (FAILED(m_spServiceProvider->QueryService
// (__uuidof(IMemoryCache),
// m_spBlobCache)))
// return HTTP_FAIL;
// Get the IBrowserCapsSvc service from the ISAPI extension
// if (FAILED (m_spServiceProvider->QueryService
// (__uuidof(IBrowserCapsSvc),
// m_spBrowserCaps)))
// return HTTP_FAIL;
return HTTP_SUCCESS;
}
В ассоциированное расширение ISAPI следует добавить код для поддержки элементов, выбранных во вкладке Server Options (Параметры сервера) мастера. В отличие от кода класса обработчиков код поддержки в расширении ISAPI не является закомментированным, он входит в программное решение независимо от того, используется он или нет. Не включайте поддержку функциональности – это позволит сократить количество ресурсов.
Поддержка файлового кэширования добавляет указатель класса для поддержки функций управления указателями файлов, относящихся к чтению и записи файлов. Непосредственно содержимое файла не хранится в классе кэша; он содержит информацию о расположении файлов, их именах и размерах. При удалении элементов из кэша они удаляются с жесткого диска, поэтому кэширование файлов предназначено только для управления временными файлами.
Кэш памяти необходим для взаимодействия с фрагментами памяти
переменного размера в отличии от других классов кэширования памяти
Кэш источника данных обеспечивает функциональность, присущую и другим классам кэширования, исключая хранение подключений к источникам данных.
При выборе опции
Предопределенными счетчиками производительности являются следующие.
Для поддержки возможностей браузера имеется указатель класса IbrowserCapsSvc и код инициализации, предназначенный для настройки
указателя на IbrowserCapsSvc. Если указатель на указатель класса IbrowserCaps передается функции GetCaps класса IbrowserCapsSvc вместе с
указателем на контекст сервера, то экземпляр IbrowserCaps позволяет
выполнить запрос возможностей браузера. Эта информация определяется
экземпляром класса IbrowserCaps с помощью сравнения значения , отправленного веб-серверу с запросом HTTP, с
соответствующим значением в файле browsercap.ini (он обычно находится в
папке $(windows)\system32\inetsrv\ ). В файле browsercap.ini приведен HTTP User Agent и определены его параметры. Например, для браузера
Internet Explorer (IE) 5 в файле browsercap.ini указано следующее:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 [IE 5.0] browser=IE Version=5.0 majorver=5 minorver=0 frames=True tables=True cookies=True backgroundsounds=True vbscript=True javaapplets=True javascript=True ActiveXControls=True Win16=False beta=True AK=False SK=False AOL=False Update=False [Mozilla/4.0 (compatible; MSIE 5.*; Windows 95*)] parent=IE 5.0 platform=Win95 beta=True [Mozilla/4.0 (compatible; MSIE 5.*; Windows 98*)] parent=IE 5.0 platform=Win98 beta=True [Mozilla/4.0 (compatible; MSIE 5.*; Windows NT*)] parent=IE 5.0 platform=WinNT beta=True [Mozilla/4.0 (compatible; MSIE 5.*; Windows 2000*)] parent=IE 5.0 platform=Win2000 beta=True [Mozilla/4.0 (compatible; MSIE 5.*)] parent=IE 5.0
Опция Resource Language (Язык источника) во вкладке Server Options (Параметры сервера) обеспечивает поддержку использования других языков для генерирования текста копии в файлах источников проекта. Необходимо установить Visual Studio .NET с поддержкой языков для нужного ресурса, чтобы открыть доступ к этой опции.
Параметры приложения обычно базируются на особенностях выбранного
шаблона проекта (см. рис. 4.9). При создании веб-службы с помощью
(рис 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.
Опция hello world и демонстрационный
обработчик этой функции. Доступ к области Options For The Initial
Server Response File (Опции начального файла ответа сервера)
открывается при включении опции SRF,
сгенерированном мастером.
Если во вкладке Application Options (Параметры приложения) не отмечено
ни одной опции, то будет сгенерирована программная структура,
аналогичная простому проекту расширения ISAPI. Для многих
программистов, работающих с ISAPI и не нуждающихся в функциональности
SRF, этот вариант более предпочтителен.
Ниже приведен код класса для 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.10) Параметры поддержки разработчика в мастере проекта сервера ATLПримечание. Комментарии TODO – это инструкции о назначении рассматриваемого фрагмента кода, размещаемые в программе.
CDebugReportHook для фиксирования информации из макроса отладки Опция 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
По окончании генерирования код проекта
Далее нужно выполнить анализ информации, полученной от
веб-пользователя, вынесение решения относительно полученных данных и
возврат ответа пользователю. Посредством добавления определенного кода
в проект NewSimpleATLServer файл SRF веб-приложения Hello World
связывается с другим приложением, которое выполняет либо запрос имени и
любимого цвета веб-пользователя, либо сообщает пользователю его имя и
любимый цвет. После настройки файла SRF можно изменить класс
DLL-библиотеки обработчика запросов в соответствии с требованиями SRF.
Файл SRF является хорошей альтернативой языкам Extensible Styleshet
Language (XSL) или Extensible Stylesheet Language Transformation (XSLT)
и веб-формам ASP.NET за счет предоставления механизма форматирования и
отображения выходных данных
(рис 4.11) Представление Design (Дизайн) файла NewSimpleATLServer.srf
Теги в SRF обозначаются двумя парами фигурных скобок, содержащих внутри
аргумент, обычно соответствующий атрибуту тега внутри DLL-библиотеки
обработчика запросов. Атрибуты тега в DLL-библиотеке обработчика
запросов связаны с функциями, выполняющими определенную задачу и
возвращающими данные, предназначенные для вставки в файл SRF. Один файл
SRF способен вызвать много DLL-библиотек обработки запросов. Файл SRF
может включать в себя другие файлы SRF с помощью тега include и
поддерживает комментарии в коде.
Первым тегом любого файла SRF является тег handler. Тег handler
указывает библиотеку DLL, к которой осуществляется доступ при поиске
функций, указанных тегами замещения в файле SRF. Также можно указать
тег subhandler. В одном файле SRF можно вызвать функции из одной или
нескольких DLL-библиотек обработки запросов. В теге handler или subhandler используются псевдонимы, с помощью которых формируются теги
замещения для вызова функций из рассматриваемой библиотеки DLL
обработчика запросов с применением имени alias.function. Тег handler
имеет следующий синтаксис:
{{handler <handler name>.dll/Default}}
По умолчанию Visual Studio .NET записывает файлы DLL в каталог с
файлами SRF. Размещение двоичных файлов, как правило, представляет
определенный уровень абстракции, отличающийся от кода файлов SRF,
поэтому двоичные файлы предпочтительнее записывать в отдельный каталог
на сервере. Для этого обычно используется подкаталог корневого
веб-каталога или каталог корневого виртуального каталога с именем bin.
При использовании подкаталога bin для хранения библиотек DLL тег handler выглядит следующим образом:
{{handler bin\<handler name>.dll/Default}}
Тег замещения наиболее часто используется в файле SRF. Теги замещения
являются точкой доступа разработчика к функциям DLL-библиотек обработки
запросов. Тег замещения осуществляет запрос ответа от библиотеки,
содержащей нужную функцию, и вставляет ответ в том месте файла SRF, в
котором находится тег замещения. Теги замещения поддерживают инструкции
для вызова функций, выполняют передачу аргументов функции в
DLL-библиотеку обработки запросов. Например, блок if..else..endif можно
реализовать с помощью команды {{if<FunctionName>}}, являющейся
начальной точкой блока if. Блоки Else и endif обозначаются командами {{else}} и {{endif}} соответственно.
В проекте NewSimpleATLServer SRF вызывает функцию по имени атрибута HaveNameAndColor, как показано в следующем коде. Если HaveNameAndColor
возвращает значение "истина", отображаются имя и любимый
цвет, введенные пользователем. Если один из элементов неизвестен, то
функция HaveNameAndColor возвращает значение "ложь", и SRF
запрашивает у пользователя имя, фамилию и любимый цвет. Теги замещения
поддерживают инструкции while..endwhile для реализации циклов.
<html>
<HEAD>
</HEAD>
<BODY>
<P>{{//comments can appear before handler tag}}</P>
<P>{{handler bin\NewSimpleATLServer.dll/Default}}</P>
<P>First let me say : {{Hello}}<br>
</P>
<P>{{if HaveNameAndColor}}
</P>
<P>I can rest easy now because I know your name is:
{{YourName}}</P>
<P>
and your favorite color is: {{YourFavoriteColor}}
<P>
{{else}}
<P>Tell me this:</P>
<FORM id="Form1" action="NewSimpleATLServer.srf" method="post">
<P>First Name <INPUT id="Text1" type="text" name="firstname"></P>
<P>Last Name <INPUT id="Text2" type="text" name="lastname"></P>
<P>Favorite color <INPUT id="Text3" type="text" name="color"></P>
<P>
<INPUT id="Submit1" type="submit" value="Submit" name="Submit1">
</P>
</FORM>
<P>{{endif}}</P>
</BODY>
</html>
Предупреждение. Теги замещения в файлах SRF, ссылающиеся на
несуществующий атрибут в DLL-библиотеке обработки запросов, вызовут
ошибку HTTP 500 Internal
Мы видим, что листинг исходного кода файла NewSimpleATLServer.srf (см.
рис. 4.11) является документом HTML. Единственным различием между
файлом HTML и SRF является присутствие тегов, заключенных в парные
фигурные скобки ("{{ }}"). Элементы управления сервера,
предоставляемых проектами веб-службы или веб-формы, по умолчанию
недоступны в проекте сервера .srf.
Примечание. Возможность добавления комментариев в файл SRF не столь
обширна, как в других типах программных решений (например, в
исполняемой программе или веб-службе). Иногда пробелы, размещаемые
перед или после тегов замещения, вызывают ошибку в работе файла SRF.
Комментарии размещаются перед тегом обработки. Для обозначения тегов
используются стили комментариев HTML ( !-- ) или C++ ( // ). Комментарии
нельзя располагать на одной строке с другими тегами, например, с тегами
замещения. Например, следующая строка вызовет возврат файлом SRF
внутренней ошибки сервера HTTP 500: {{endif // if HaveNameAndColor}}.
DLL-библиотека обработки запросов, создаваемая мастером проекта сервера
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
Класс CNewSimpleATLServerHandler выполняет следующие задачи:
Весь код проекта 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
После запуска утилиту WebDbg нужно присоединить к имени канала AtlsDbgPipe с помощью команды File\Select Pipe\Pipe Name (Файл\Выбрать
канал\Имя канала). Отлаживаемый процесс должен иметь разрешение на
запись в указанный канал. Аутентификационные данные, под которыми
работает IIS, устанавливаются с помощью команды File\Permissions
(Файл\Разрешения). Если WebDbg выполняется на том же компьютере, что и
веб-сайт, группе Everyone предоставляются разрешение на запись в канал.
Если работа сайта осуществляется удаленно, то следует указать
аутентификационные данные для определенного компьютера или домена.
Утилита WebDbg принимает через канал сообщения от программы,
осуществляющей запись в этот канал. Сообщения по мере записи
отображаются в окне WebDbg. Пошаговая обработка кода с помощью Visual
Studio .NET IDE является хорошим способом первоначального тестирования
кода, однако для использования в тех средах, где будет находиться
программное обеспечение после перемещения из среды сервера разработки,
целесообразно применение команды trace.
(рис 4.12) Сообщения ATLTRACE, записанные в WebDbg
ATLTRACE работает только в конфигурации debug. Если программное решение
скомпилировано в конфигурации release, макросы ATLTRACE игнорируются, и
не нужно удалять какие-либо коды отладки. При запуске проекта NewSimpleATLServer пользователю отображается фраза hello world. Затем с
помощью тега замещения HaveNameAndColor в файле SRF вызывается функция OnHaveNameAndColor. Она проверяет возвращаемое значение локальной
переменной HaveNameandColor ("истина" или
"ложь"), после чего возвращает соответствующий ответ, т.е.
файл SRF либо отображает информацию, либо запрашивает у пользователя
имя и любимый цвет. На рисунке 4.13 показан результат выполнения
проекта NewSimpleATLServer после ввода пользователем информации. При
получении результата, показанного на рисунке, файл SRF определяет
значение, возвращенное переменной HaveNameandColor. Поскольку оно
истинно, выполняется вызов функции OnYourFavoriteColor и OnYourName с
помощью тегов замещения YourFavorityColor и YourName соответственно.
(рис 4.13) Результат выполнения проекта NewSompleATLServer после ввода
пользователем информации
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.