Программирование в IIS

Сервер ATL

Разбить на страницы
Показывать лекцию целиком

Сервер ATL представляет собой набор классов, являющихся частью пакета Microsoft Visual Studio .NET и предназначенных для использования в контексте интернета. Классы применяются при разработке веб-приложений на C++. Когда компания Microsoft решила выпустить технологию ASP.NET, начальным решением стал компонент ATL Server. Многие возможности веб-форм и веб-служб ASP.NET представляют собой урезанные версии функциональности, присутствующей в классах ATL Server. В дополнение к классам веб-служб ATL Server предлагает разработчику классы, осуществляющие контроль над использованием памяти, управление сеансами, кэширование ресурсов и управление нитями запросов IIS и HTTP. ATL Server включает множество новых классов, связанных с управлением файлами, ранее они были не доступны разработчикам, использующим ISAPI. ATL Server предоставляет команды по управлению программными решениями для интернета, обеспечивает простоту и удобный доступ к соответствующим классам.

ATL Server считается хорошим расширение для ISAPI. Так же, как Active Template Library (ATL) разработанная в помощь программисту при взаимодействии с Microsoft Foundation Classes (MFC) и интерфейсом программирования Windows (API), ATL Server помогает при работе с IIS API или ISAPI. С помощью ATL Server разработчики создают программные решения для интернета с управлением через технологию .NET либо без всякого управления. ATL Server содержит множество опций, контролирующих взаимодействие с IIS, которые не доступны в языках C# и Visual Basic. ATL Server является прекрасной альтернативой непосредственного использования ISAPI, так как многие классы ATL Server разработчику пришлось бы создавать вручную при работе с ISAPI.

Обзор архитектуры ATL Server

ATL Server связывает классы и функции, хранящиеся в DLL, используя теги в текстовых файлах. В результате этого запросы к IIS могут вызывать функции внутри библиотек и возвращать запрашивающему клиенту содержимое текстового файла вместе с результатами вызова функции. ATL Server использует ISAPI для реализации механизма вызова между текстовыми файлами, IIS и библиотеками DLL с использованием системы командных тегов, поддерживаемой технологией .NET. Простейшее программное решение ATL Server включает в себя следующие компоненты.

  • Библиотека DLL расширения ISAPI.
  • Библиотека DLL интернет-приложения или DLL поддержки запросов.
  • Файл ответа сервера (SRF).
  • Службы IIS.
  • При отправке запросов в IIS на ресурс, которым является источник ATL Server, IIS связывает вызов с библиотекой DLL расширения ISAPI. После получения этого запроса расширение ISAPI открывает и обрабатывает библиотеку DLL запрошенного веб-приложения или файл ответа сервера. Если запрошен файл ответа сервера, то вызывается тег замещения, обозначающий вызов функции из библиотеки DLL веб-приложения, и результаты работы вставляются в файл ответа сервера в месте расположения тега замещения. Комбинация результатов вызовов к DLL веб-приложения и содержимое файла ответа сервера возвращаются запрашивавшей стороне. Если DLL веб-приложения запрашивается напрямую, библиотека DLL расширения ISAPI выполняет соответствующий вызов (вызовы) и возвращает результаты в браузер.

    На рисунке 4.1 приведен обзор архитектуры ATL Server.

    (рис 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 для интерпретации кода и тегов, содержащихся в соответствующих файлах.

    ATL Server с помощью библиотек DLL расширения ISAPI интерпретирует код, включенный в теги файла ответа сервера, и вызовы функций, определенные тегами замещения в библиотеке DLL веб-приложения. При создании веб-приложения с использованием файлов ASP разработчик ни в коем случае не станет перекомпилировать ASP.DLL таким образом, чтобы она содержала только код для обработки функций ASP. ASP.DLL не изменяется от одного ASP-приложения к другому; по существу, именно за счет этого работает одна библиотека DLL расширения ISAPI. Имейте в виду, что ATL Server создает особый интерпретатор для строящегося программного решения, оптимизированный именно для этого решения. Он также является библиотекой DLL расширения ISAPI, которая входит в проект ATL Server. Разработчик имеет прекрасную возможность модифицировать ее в соответствии с требованиями конкретного приложения, а не использовать конфигурацию по умолчанию.

    Для использования службами IIS библиотеки расширения ISAPI файлы ответа сервера и файлы библиотеки DLL приложения необходимо связать с соответствующей библиотекой расширения ISAPI, аналогично тому, как файлы с расширениями .asp связаны с библиотекой ASP.DLL или файлы с расширениями .aspx связаны с интерпретатором технологии .NET aspnet_isapi.dll. Расширение имен файлов ответов сервера .srf и расширение .dll DLL-библиотек веб-приложения должны быть связаны с соответствующей DLL-библиотекой расширения ISAPI.

    Ниже показано, как можно связать расширения имен файлов с расширениями ISAPI.

  • Откройте консоль MMC для IIS.
  • Щелкните на значке папки Web Site (Веб-узел) в дереве папок, чтобы развернуть список экземпляров веб-сервера на сервере, затем щелкните на экземпляре веб-сайта, который необходимо настроить, для отображения его содержимого.
  • Откройте окно свойств для любого веб-объекта или виртуального каталога и нажмите на кнопку Configuration (Настройка) во вкладке Home Directory (Домашний каталог) или Virtual Directory (Виртуальный каталог) соответственно. Откроется апплет Application Configuration (Настройка приложения) (см. рис. 4.2).
  • Свяжите файл и путь к нужной DLL-библиотеке расширения ISAPI на сайте. После этого IIS необходимо перезапустить.
  • (рис 4.2) Окно настройки приложения предназначено для связывания файлов с расширениями

    Расположение DLL-библиотеки веб-приложения, используемой файлом ответа сервера, определяется в самом файле ответа сервера. Она должна находиться в корне виртуального каталога. Файл ответа сервера содержит тег обработчика, определяющий относительное расположение этой библиотеки. (Для получения более подробной информации о тегах обработчика обратитесь к разделу "Файлы ответа сервера".) Когда в IIS направляется HTTP-запрос на файлы ответа сервера или библиотеку DLL веб-приложения, IIS с помощью связей файлов определяет, где искать эту библиотеку для обработки и интерпретации запроса.

    Ни одна из задействованных библиотек не является DLL-библиотекой модели компонентных объектов (COM), поэтому IIS и компоненты ATL Server для поиска нужных DLL-библиотек физически отыскивают их на узле по текущим файловым расположениям.

    Многие из разработчиков знают, что расположение COM-объекта на узле определяется связыванием уникального идентификационного номера (CLSID) с путем к файлу DLL. Эта информация записывается в реестр Windows, и любое программное обеспечение, запрашивающее использование DLL-библиотеки COM- объекта, сможет работать с ней. Доступ к DLL с помощью ее физического нахождения и загрузки выглядит несколько устаревшим по сравнении с архитектурой, появившейся после технологии COM, но такое решение дает некоторые преимущества с точки зрения управления. Связи с файлами в IIS базируются на файловых расширениях. DLL-библиотека веб-приложения указывается посредством относительного пути. Перемещение файлов на другой сервер нарушает связи файлов IIS с DLL-библиотекой расширения ISAPI, но другие файлы перемещаются так, как если бы они являлись статическим содержимым, поскольку их расположение относительно друг друга контролируется.

    Создание простого проекта ATL Server

    Создадим проект ATL Server.

  • Откройте Visual Studio .NET.
  • Выберите команду File\New\Project (Файл\Создать\Проект) для открытия диалогового окна New Project (Новый проект) (см. рис 4.3(рис 4.3) Диалоговое окно New Project (Новый проект) с шаблоном проекта ATL Server
  • Visual Studio .NET предлагает множество шаблонов ATL для веб-решений и решений ATL. В рамках нашего упражнения выберем шаблон ATL Server Project (Проект сервера ATL). Будьте внимательны: не следует выбирать шаблон ATL Project (Проект ATL), так как он не содержит веб-компонентов. Шаблон ATL Project (Проект ATL) обеспечивает среду для разработки классической ATL DLL или исполняемого файла, использующего библиотеки ATL.

    Шаблон ATL Server Web Service (Веб-служба сервера ATL) создает проект веб-службы, аналогичный шаблонам проектов веб-служб языков Visual Basic и C#, за исключением того, что данный проект использует язык C++. Для веб-службы создается связанное расширение ISAPI, установка и управление которым осуществляется отдельно от DLL-библиотеки веб-службы. По аналогии с файлом .asmx веб-служб в C#, являющимся механизмом управления DLL-библиотекой, веб-служба сервера ATL для этой цели использует файлы HTML.

  • Введите имя проекта, после чего нажмите на кнопку Next (Далее) для запуска мастера проекта сервера ATL (ATL Server Project Wizard); откроется окно с обзором создаваемого проекта.
  • Окно мастера проекта сервера ATL имеет четыре раздельные области, предназначенные для изменения параметров проекта ATL Server перед генерацией файлов (см. рис. 4.4). Если параметры по умолчанию известны и подходят для использования, то нажмите на кнопку Finish (Готово) для создания файлов проекта.
  • (рис 4.4) Окно Overview (Обзор) мастера проекта сервера ATL

    После нажатия на кнопку Finish (Готово) Visual Studio .NET начнет генерирование файлов согласно параметрам по умолчанию мастера проекта сервера ATL. Любой из упомянутых в шаге 3 шаблонов (ATL Server Web Service [Веб-служба сервера ATL] или ATL Server Project [Проект сервера ATL]) сгенерирует в Visual Studio .NET два проекта. Стартовый проект представляет собой главный проект, имя которого мы ввели в диалоговом окне New Project (Новый проект). Второй генерируемый проект носит то же имя, что и стартовый, но к его имени добавляется окончание ISAPI. Создаваемому проекту ATL Server присвоено имя 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 можно настроить на реализацию файлов, устанавливающих программное решение ATL Server на IIS. При этом будет производиться установка лишь в первый веб-экземпляр, загруженный в IIS. При установке в другой веб-экземпляр (не в первый, являющийся веб-сайтом по умолчанию) следует провести данную операцию вручную. Для настройки Visual Studio на автоматическую установку решения ATL Server в IIS выполните следующие шаги.

  • В меню Visual Studio .NET выберите Project\Properties (Проект\Свойства) для открытия окна свойств (см. рис. 4.5). Проект сервера ATL состоит из двух проектов (если только он не настроен на использование одной библиотеки DLL). Окно свойств отображает параметры выбранного в данный момент проекта Visual Studio. Изменить проект можно, выделив его в окне Solution Explorer.(рис 4.5) Окно свойств проекта и окно Solution Explorer (Обозреватель решения)
  • В окне свойств выделите внизу левой панели окна узел Web Deployment (Веб-реализация). Каждый из узлов в панели слева обозначается значком папки. Выбор любого из них обновит содержимое правой панели и отобразит элементы управления, используемые для настройки конфигурации выделенного узла.
  • В окне Solution Explorer выберите проект DLL-библиотеки расширения ISAPI. Если имя проекта не было изменено, то к имени обычно присоединяется окончание ISAPI.
  • Для свойства Relative Path (Относительный путь), отображаемого в области справа, введите значение bin. В результате DLL-библиотека расширения ISAPI будет расположена в подкаталоге bin папки, на которую указывает виртуальный каталог IIS. Вы можете указать другое имя каталога.
  • Установите параметр Virtual Directory Name (Имя виртуального каталога) равным имени виртуального каталога, в который устанавливаются файлы проекта ATL Server. Если виртуальный каталог не существует, он будет создан. Ниспадающий список позволяет легко выбрать имя проекта.
  • Параметр Application Mappings (Связи приложения) нужно установить равным .srf;.dll. В созданном виртуальном каталоге будут присутствовать эти связи.
  • Выберите проект DLL-библиотеки веб-приложения в Solution Explorer (Обозреватель решения) для обновления окна и отображения параметров проекта.
  • По аналогии с проектом ISAPI выберите узел Web Deployment (Веб-реализация) в левой области окна внизу (если вы еще не сделали это).
  • Установите такие же значения параметров, как в шагах 4 и 5. Имя виртуального каталога должно совпадать с именем проекта ISAPI. Параметр относительного пути может отличаться от относительного пути проекта ISAPI. Связи приложения устанавливать не нужно.
  • Нажмите на кнопку OK, чтобы сохранить изменения в конфигурации и закрыть окно.
  • После установки относительного пути, имени виртуального каталога и связей приложения для проектов в решении ATL Server реализация файлов произойдет при первом же выполнении команды построения.

    Нажмите на клавишу 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 не устанавливается с поддержкой отладки ATL Server. По умолчанию устанавливается компонент Full Remote Debugging (Полная удаленная отладка), обеспечивающий отладку веб-форм и веб-служб Visual Basic и C#. Решениям C++ необходима Native Remote Debugging (Обычная удаленная отладка). С помощью программы установки Visual Studio .NET добавляется необходимая поддержка (см. рис. 4.6). Откройте программу установки и запустите процесс инсталляции. В окне, показанном на рис. 4.6, выберите Native Remote Debugging (Обычная удаленная отладка).

    (рис 4.6) Установка Native Remote Debugging (Обычная удаленная отладка)

    После установки обычной удаленной отладки и правильной настройке ее параметров откроется окно браузера с отображением сообщения: "This is a test: Hello World!". На данном этапе может возникнуть ошибка по причине того, что файловые расширения .dll и .srf не связаны с ассоциированной DLL-библиотекой расширения ISAPI в рассматриваемом экземпляре IIS или виртуальном каталоге. В этом случае откройте связи приложения (см. рис. 4.2) и проверьте правильность связи файлов .dll и .srf с нужной библиотекой.

    Поскольку сложная конфигурация ATL Server требует запуска программы Hello World, разработчик должен хорошо разбираться в процессах, происходящих внутри IIS и технологии .NET. Использование мощи ATL Server очень выгодно для разработки, но требует серьезных навыков и знаний от программиста.

    Совет. Если при работе с IIS и ATL Server по непонятной причине возникают неполадки, попробуйте перезапустить веб-службы. Это помогает, если разработчик или системный инженер установил связь с расширением ISAPI вручную, либо после внесения изменений в конфигурацию экземпляра IIS или виртуального каталога.

    Работа с мастером проекта сервера ATL

    Мастер проекта сервера ATL позволяет настраивать параметры, используемые при создании проекта. Он предлагает множество возможных вариантов проекта ATL Server. Некоторые элементы можно изменить на страницах окна свойств проекта уже после создания проекта, а некоторые нужно установить в мастере, так как позже это сделать уже будет нельзя. Visual Studio .NET позволяет корректировать любой проект, менять его тип; а вот аналогичное изменение, производимое вручную, займет много времени. При смене типа проекта вы предотвратите появление проблем, просто сохранив нужный код и вставив его в проект, сгенерированный корректным шаблоном проекта в Visual Studio .NET. Знание опций, доступных в мастере проекта сервера ATL, позволит сэкономить время и более детально ознакомиться с этим компонентом.

    Параметры проекта

    Во вкладке Project Settings (Параметры проекта) мастера проекта сервера ATL (см. рис. 4.7) указывается виртуальный каталог, в который будет записан проект после компиляции. Этот каталог можно сменить в любое время с помощью окна свойств проекта. Вы можете также переименовать проект и каталоги после генерирования мастером проекта сервера ATL файлов программного решения, но возможность генерации одной DLL для хранения кода ISAPI и кода веб-приложения нужно указать до окончания работы мастера.

    (рис 4.7) Параметры проекта в мастере проекта сервера ATL

    Опытный разработчик сможет самостоятельно настроить параметры проекта для смены его типа, но с точки зрения надежности и быстроты операции разумнее изменить параметры мастера для некоторых конфигураций создаваемых двоичных файлов.

    Параметры сервера в мастере проекта сервера ATL

    Во вкладке Server Options (Параметры сервера) мастера проекта сервера ATL (см. рис. 4.8) устанавливается поддержка дополнительной интеграции со службами узла сервера и управление сеансами. Следует отметить, что сеанс может записываться в источник данных, имеющий провайдера OLE-DB. Это относится к разработке веб-кластера, когда требуется размещение данных сеанса внутри источника данных, если другие серверы, участвующие в поддержке веб-решения, должны иметь доступ к сеансу.

    (рис 4.8) Вкладка Server Options (Параметры сервера) мастера проекта сервера ATL

    Если проект сервера ATL создан для функционирования на одном сервере, или если не требуется взаимодействие с другими веб-серверами, использующими сеанс, выберите опцию Memory-Backed Session State Services (Службы состояния сеанса, хранимые в памяти) для обеспечения более высокой производительности. Опция OLE DB-Backed Session State Services (Службы состояния сеанса, хранимые в OLE DB) позволяет расширять программное решение, т.е. установить его в распределенной аппаратной среде без изменения кода. Если программное решение требует поддержки сеансов, отметьте опцию Session Services (Службы сеансов). В зависимости от требуемого уровня поддержки выберите соответствующую опцию хранения: в OLE DB или в памяти.

    При генерации мастером кода создается класс с таким же именем, как у проекта, к началу имени присоединяется символ "C", а к концу добавляется слово "Handler". Этот класс будет интерфейсом веб-приложения в IIS за счет включения в себя обработчиков тегов. Пусть проект называется atlServer4 ((см. рис. 4.7), тогда мастер для поддержки обработчиков тегов создаст класс CatlServer4Handler.

    Включение любой из следующих опций во вкладке Server Options (Параметры сервера) мастера позволит добавить в класс обработчик кода, объявляющий и инициализирующий указатели на соответствующий класс поддержки.

  • Blob Cache. Добавляет указатель на экземпляр класса ImemoryCache для управления случайными участками памяти.
  • File Cache. Добавляет указатель на экземпляр класса IfileCache для управления именами файлов.
  • Data Source Cache. Добавляет классы в проект ATL Server и проект ISAPI для управления кэшированием подключений OLE DB каждого потока.
  • Predefined Performance Counters. Добавляет классы для интеграции проекта со счетчиками производительности perfmon.
  • Browser Capabilities Support. Добавляет указатель на экземпляр класса 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 (Поддержка возможностей браузера) неправильно определен в комментарии как поддержка кэша источника данных, что привело к незначительной ошибке в шаблоне мастера проекта сервера ATL.

    При использовании указателей на File Cache (Кэш файлов), Blob Cache (Кэш памяти) и Browser Capabilities Support (Поддержка возможностей браузера) с каждого из них нужно снять статус комментария. Указатели инициализируются в общей функции ValidateAndExchange. Она включается в каждый класс обработчика, генерируемый мастером проекта сервера ATL, если отмечена опция Validation Support (Поддержка подтверждения) во вкладке Application Options (Параметры приложения) (см. следующий раздел). С фрагментов кода, отвечающих за инициализацию соответствующего указателя, также нужно снять статус комментария.

    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 не является закомментированным, он входит в программное решение независимо от того, используется он или нет. Не включайте поддержку функциональности – это позволит сократить количество ресурсов.

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

    Кэш памяти необходим для взаимодействия с фрагментами памяти переменного размера в отличии от других классов кэширования памяти ATL Server, поддерживающих фрагменты памяти определенного размера.

    Кэш источника данных обеспечивает функциональность, присущую и другим классам кэширования, исключая хранение подключений к источникам данных.

    При выборе опции Predefined Performance Counters (Предопределенные счетчики производительности) в расширении ISAPI размещается код, реализующий обновление счетчиков ISAPI для perfmon согласно взаимодействию веб-приложения с IIS. Разработчик не участвует в написании кода, весь код, необходимый для обеспечения функциональности, генерируется мастером в файле реализации расширения ISAPI.

    Предопределенными счетчиками производительности являются следующие.

  • Active Threads (Активные потоки). Активные потоки, используемые процессом веб-приложения.
  • Average Response Time (Среднее время ответа). Усредненное время возврата HTTP-ответа веб-приложением.
  • Current Queued Requests (Текущие запросы в очереди). HTTP-запросы, ожидающие обработки.
  • Maximum Queued Requests (Максимальное количество запросов в очереди). Максимальное количество HTTP-запросов в очереди.
  • Server Failed Requests (Ошибочные запросы сервера). Запросы, обработка которых невозможна, включая ошибки "Файл не найден" (404) и "Доступ запрещен" (403).
  • Server Requests Per Second (Количество запросов сервера в секунду). Количество запросов, поступивших на веб-сайт за секунду.
  • Server Total Requests (Общее количество запросов сервера). Общее количество запросов, полученных веб-сайтом IIS.
  • Для поддержки возможностей браузера имеется указатель класса IbrowserCapsSvc и код инициализации, предназначенный для настройки указателя на IbrowserCapsSvc. Если указатель на указатель класса IbrowserCaps передается функции GetCaps класса IbrowserCapsSvc вместе с указателем на контекст сервера, то экземпляр IbrowserCaps позволяет выполнить запрос возможностей браузера. Эта информация определяется экземпляром класса IbrowserCaps с помощью сравнения значения HTTP_USER_AGENT, отправленного веб-серверу с запросом 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 с поддержкой языков для нужного ресурса, чтобы открыть доступ к этой опции.

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

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

    (рис 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

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

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

    (рис 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;
  • код с атрибутами;
  • поддержка особых опций отладки.
  • Файлы ответа сервера

    Далее нужно выполнить анализ информации, полученной от веб-пользователя, вынесение решения относительно полученных данных и возврат ответа пользователю. Посредством добавления определенного кода в проект NewSimpleATLServer файл SRF веб-приложения Hello World связывается с другим приложением, которое выполняет либо запрос имени и любимого цвета веб-пользователя, либо сообщает пользователю его имя и любимый цвет. После настройки файла SRF можно изменить класс DLL-библиотеки обработчика запросов в соответствии с требованиями SRF.

    Теги в файлах ответа сервера

    Файл SRF является хорошей альтернативой языкам Extensible Styleshet Language (XSL) или Extensible Stylesheet Language Transformation (XSLT) и веб-формам ASP.NET за счет предоставления механизма форматирования и отображения выходных данных ATL Server при отделении логики представления от бизнес-логики. Представление Design (Дизайн) в ATL Server предоставляет определенный уровень абстракции для доступа к DLL-библиотеке обработчика запросов и записи кода HTML (см. рис. 4.11). Используя теги в файле SRF, можно реализовать упрощенные сценарии, оптимизированные для управления вызовами функций в DLL-библиотеке обработчика запросов, аналогично файлам XSL и XSLT, которые анализируют и управляют содержимым XML. Файл XSL или XSLT содержат в верхней части инструкции для обозначения того, как нужно использовать файл, и в файле SRF имеется такой же элемент. Файл SRF поддерживает упрощенные возможности циклов и вынесения решений, как и файлы XSL и XSLT.

    (рис 4.11) Представление Design (Дизайн) файла NewSimpleATLServer.srf

    Теги в SRF обозначаются двумя парами фигурных скобок, содержащих внутри аргумент, обычно соответствующий атрибуту тега внутри DLL-библиотеки обработчика запросов. Атрибуты тега в DLL-библиотеке обработчика запросов связаны с функциями, выполняющими определенную задачу и возвращающими данные, предназначенные для вставки в файл SRF. Один файл SRF способен вызвать много DLL-библиотек обработки запросов. Файл SRF может включать в себя другие файлы SRF с помощью тега include и поддерживает комментарии в коде.

    Теги Handler и Subhandler

    Первым тегом любого файла 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 Server Error (HTTP 500: внутренняя ошибка сервера). Эту ошибку обнаружить довольно сложно, поскольку она возникает при многих условиях. В Visual Studio .NET отсутствует функция автозавершения, отображающая доступные атрибуты в DLL-библиотеке обработки запросов при изменении разработчиком файла SRF, поэтому велика вероятность неправильного указания тега обработчика запросов.

    Мы видим, что листинг исходного кода файла NewSimpleATLServer.srf (см. рис. 4.11) является документом HTML. Единственным различием между файлом HTML и SRF является присутствие тегов, заключенных в парные фигурные скобки ("{{ }}"). Элементы управления сервера, предоставляемых проектами веб-службы или веб-формы, по умолчанию недоступны в проекте сервера ATL. Расширение файла SRF связано с библиотекой расширения ISAPI, поэтому файл HTM, HTML или любой другой файл можно связать с DLL-библиотекой расширения ISAPI и реализовать его обработку так, как если бы речь шла о файле SRF с расширением .srf.

    Примечание. Возможность добавления комментариев в файл SRF не столь обширна, как в других типах программных решений (например, в исполняемой программе или веб-службе). Иногда пробелы, размещаемые перед или после тегов замещения, вызывают ошибку в работе файла SRF. Комментарии размещаются перед тегом обработки. Для обозначения тегов используются стили комментариев HTML ( !-- ) или C++ ( // ). Комментарии нельзя располагать на одной строке с другими тегами, например, с тегами замещения. Например, следующая строка вызовет возврат файлом SRF внутренней ошибки сервера HTTP 500: {{endif // if HaveNameAndColor}}.

    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

    Класс 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.

    (рис 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 после ввода пользователем информации
    Страницы:

    Сервер ATL представляет собой набор классов, являющихся частью пакета Microsoft Visual Studio .NET и предназначенных для использования в контексте интернета. Классы применяются при разработке веб-приложений на C++. Когда компания Microsoft решила выпустить технологию ASP.NET, начальным решением стал компонент ATL Server. Многие возможности веб-форм и веб-служб ASP.NET представляют собой урезанные версии функциональности, присутствующей в классах ATL Server. В дополнение к классам веб-служб ATL Server предлагает разработчику классы, осуществляющие контроль над использованием памяти, управление сеансами, кэширование ресурсов и управление нитями запросов IIS и HTTP. ATL Server включает множество новых классов, связанных с управлением файлами, ранее они были не доступны разработчикам, использующим ISAPI. ATL Server предоставляет команды по управлению программными решениями для интернета, обеспечивает простоту и удобный доступ к соответствующим классам.

    ATL Server считается хорошим расширение для ISAPI. Так же, как Active Template Library (ATL) разработанная в помощь программисту при взаимодействии с Microsoft Foundation Classes (MFC) и интерфейсом программирования Windows (API), ATL Server помогает при работе с IIS API или ISAPI. С помощью ATL Server разработчики создают программные решения для интернета с управлением через технологию .NET либо без всякого управления. ATL Server содержит множество опций, контролирующих взаимодействие с IIS, которые не доступны в языках C# и Visual Basic. ATL Server является прекрасной альтернативой непосредственного использования ISAPI, так как многие классы ATL Server разработчику пришлось бы создавать вручную при работе с ISAPI.

    Обзор архитектуры ATL Server

    ATL Server связывает классы и функции, хранящиеся в DLL, используя теги в текстовых файлах. В результате этого запросы к IIS могут вызывать функции внутри библиотек и возвращать запрашивающему клиенту содержимое текстового файла вместе с результатами вызова функции. ATL Server использует ISAPI для реализации механизма вызова между текстовыми файлами, IIS и библиотеками DLL с использованием системы командных тегов, поддерживаемой технологией .NET. Простейшее программное решение ATL Server включает в себя следующие компоненты.

  • Библиотека DLL расширения ISAPI.
  • Библиотека DLL интернет-приложения или DLL поддержки запросов.
  • Файл ответа сервера (SRF).
  • Службы IIS.
  • При отправке запросов в IIS на ресурс, которым является источник ATL Server, IIS связывает вызов с библиотекой DLL расширения ISAPI. После получения этого запроса расширение ISAPI открывает и обрабатывает библиотеку DLL запрошенного веб-приложения или файл ответа сервера. Если запрошен файл ответа сервера, то вызывается тег замещения, обозначающий вызов функции из библиотеки DLL веб-приложения, и результаты работы вставляются в файл ответа сервера в месте расположения тега замещения. Комбинация результатов вызовов к DLL веб-приложения и содержимое файла ответа сервера возвращаются запрашивавшей стороне. Если DLL веб-приложения запрашивается напрямую, библиотека DLL расширения ISAPI выполняет соответствующий вызов (вызовы) и возвращает результаты в браузер.

    На рисунке 4.1 приведен обзор архитектуры ATL Server.

    (рис 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 для интерпретации кода и тегов, содержащихся в соответствующих файлах.

    ATL Server с помощью библиотек DLL расширения ISAPI интерпретирует код, включенный в теги файла ответа сервера, и вызовы функций, определенные тегами замещения в библиотеке DLL веб-приложения. При создании веб-приложения с использованием файлов ASP разработчик ни в коем случае не станет перекомпилировать ASP.DLL таким образом, чтобы она содержала только код для обработки функций ASP. ASP.DLL не изменяется от одного ASP-приложения к другому; по существу, именно за счет этого работает одна библиотека DLL расширения ISAPI. Имейте в виду, что ATL Server создает особый интерпретатор для строящегося программного решения, оптимизированный именно для этого решения. Он также является библиотекой DLL расширения ISAPI, которая входит в проект ATL Server. Разработчик имеет прекрасную возможность модифицировать ее в соответствии с требованиями конкретного приложения, а не использовать конфигурацию по умолчанию.

    Для использования службами IIS библиотеки расширения ISAPI файлы ответа сервера и файлы библиотеки DLL приложения необходимо связать с соответствующей библиотекой расширения ISAPI, аналогично тому, как файлы с расширениями .asp связаны с библиотекой ASP.DLL или файлы с расширениями .aspx связаны с интерпретатором технологии .NET aspnet_isapi.dll. Расширение имен файлов ответов сервера .srf и расширение .dll DLL-библиотек веб-приложения должны быть связаны с соответствующей DLL-библиотекой расширения ISAPI.

    Ниже показано, как можно связать расширения имен файлов с расширениями ISAPI.

  • Откройте консоль MMC для IIS.
  • Щелкните на значке папки Web Site (Веб-узел) в дереве папок, чтобы развернуть список экземпляров веб-сервера на сервере, затем щелкните на экземпляре веб-сайта, который необходимо настроить, для отображения его содержимого.
  • Откройте окно свойств для любого веб-объекта или виртуального каталога и нажмите на кнопку Configuration (Настройка) во вкладке Home Directory (Домашний каталог) или Virtual Directory (Виртуальный каталог) соответственно. Откроется апплет Application Configuration (Настройка приложения) (см. рис. 4.2).
  • Свяжите файл и путь к нужной DLL-библиотеке расширения ISAPI на сайте. После этого IIS необходимо перезапустить.
  • (рис 4.2) Окно настройки приложения предназначено для связывания файлов с расширениями

    Расположение DLL-библиотеки веб-приложения, используемой файлом ответа сервера, определяется в самом файле ответа сервера. Она должна находиться в корне виртуального каталога. Файл ответа сервера содержит тег обработчика, определяющий относительное расположение этой библиотеки. (Для получения более подробной информации о тегах обработчика обратитесь к разделу "Файлы ответа сервера".) Когда в IIS направляется HTTP-запрос на файлы ответа сервера или библиотеку DLL веб-приложения, IIS с помощью связей файлов определяет, где искать эту библиотеку для обработки и интерпретации запроса.

    Ни одна из задействованных библиотек не является DLL-библиотекой модели компонентных объектов (COM), поэтому IIS и компоненты ATL Server для поиска нужных DLL-библиотек физически отыскивают их на узле по текущим файловым расположениям.

    Многие из разработчиков знают, что расположение COM-объекта на узле определяется связыванием уникального идентификационного номера (CLSID) с путем к файлу DLL. Эта информация записывается в реестр Windows, и любое программное обеспечение, запрашивающее использование DLL-библиотеки COM- объекта, сможет работать с ней. Доступ к DLL с помощью ее физического нахождения и загрузки выглядит несколько устаревшим по сравнении с архитектурой, появившейся после технологии COM, но такое решение дает некоторые преимущества с точки зрения управления. Связи с файлами в IIS базируются на файловых расширениях. DLL-библиотека веб-приложения указывается посредством относительного пути. Перемещение файлов на другой сервер нарушает связи файлов IIS с DLL-библиотекой расширения ISAPI, но другие файлы перемещаются так, как если бы они являлись статическим содержимым, поскольку их расположение относительно друг друга контролируется.

    Создание простого проекта ATL Server

    Создадим проект ATL Server.

  • Откройте Visual Studio .NET.
  • Выберите команду File\New\Project (Файл\Создать\Проект) для открытия диалогового окна New Project (Новый проект) (см. рис 4.3(рис 4.3) Диалоговое окно New Project (Новый проект) с шаблоном проекта ATL Server
  • Visual Studio .NET предлагает множество шаблонов ATL для веб-решений и решений ATL. В рамках нашего упражнения выберем шаблон ATL Server Project (Проект сервера ATL). Будьте внимательны: не следует выбирать шаблон ATL Project (Проект ATL), так как он не содержит веб-компонентов. Шаблон ATL Project (Проект ATL) обеспечивает среду для разработки классической ATL DLL или исполняемого файла, использующего библиотеки ATL.

    Шаблон ATL Server Web Service (Веб-служба сервера ATL) создает проект веб-службы, аналогичный шаблонам проектов веб-служб языков Visual Basic и C#, за исключением того, что данный проект использует язык C++. Для веб-службы создается связанное расширение ISAPI, установка и управление которым осуществляется отдельно от DLL-библиотеки веб-службы. По аналогии с файлом .asmx веб-служб в C#, являющимся механизмом управления DLL-библиотекой, веб-служба сервера ATL для этой цели использует файлы HTML.

  • Введите имя проекта, после чего нажмите на кнопку Next (Далее) для запуска мастера проекта сервера ATL (ATL Server Project Wizard); откроется окно с обзором создаваемого проекта.
  • Окно мастера проекта сервера ATL имеет четыре раздельные области, предназначенные для изменения параметров проекта ATL Server перед генерацией файлов (см. рис. 4.4). Если параметры по умолчанию известны и подходят для использования, то нажмите на кнопку Finish (Готово) для создания файлов проекта.
  • (рис 4.4) Окно Overview (Обзор) мастера проекта сервера ATL

    После нажатия на кнопку Finish (Готово) Visual Studio .NET начнет генерирование файлов согласно параметрам по умолчанию мастера проекта сервера ATL. Любой из упомянутых в шаге 3 шаблонов (ATL Server Web Service [Веб-служба сервера ATL] или ATL Server Project [Проект сервера ATL]) сгенерирует в Visual Studio .NET два проекта. Стартовый проект представляет собой главный проект, имя которого мы ввели в диалоговом окне New Project (Новый проект). Второй генерируемый проект носит то же имя, что и стартовый, но к его имени добавляется окончание ISAPI. Создаваемому проекту ATL Server присвоено имя 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 можно настроить на реализацию файлов, устанавливающих программное решение ATL Server на IIS. При этом будет производиться установка лишь в первый веб-экземпляр, загруженный в IIS. При установке в другой веб-экземпляр (не в первый, являющийся веб-сайтом по умолчанию) следует провести данную операцию вручную. Для настройки Visual Studio на автоматическую установку решения ATL Server в IIS выполните следующие шаги.

  • В меню Visual Studio .NET выберите Project\Properties (Проект\Свойства) для открытия окна свойств (см. рис. 4.5). Проект сервера ATL состоит из двух проектов (если только он не настроен на использование одной библиотеки DLL). Окно свойств отображает параметры выбранного в данный момент проекта Visual Studio. Изменить проект можно, выделив его в окне Solution Explorer.(рис 4.5) Окно свойств проекта и окно Solution Explorer (Обозреватель решения)
  • В окне свойств выделите внизу левой панели окна узел Web Deployment (Веб-реализация). Каждый из узлов в панели слева обозначается значком папки. Выбор любого из них обновит содержимое правой панели и отобразит элементы управления, используемые для настройки конфигурации выделенного узла.
  • В окне Solution Explorer выберите проект DLL-библиотеки расширения ISAPI. Если имя проекта не было изменено, то к имени обычно присоединяется окончание ISAPI.
  • Для свойства Relative Path (Относительный путь), отображаемого в области справа, введите значение bin. В результате DLL-библиотека расширения ISAPI будет расположена в подкаталоге bin папки, на которую указывает виртуальный каталог IIS. Вы можете указать другое имя каталога.
  • Установите параметр Virtual Directory Name (Имя виртуального каталога) равным имени виртуального каталога, в который устанавливаются файлы проекта ATL Server. Если виртуальный каталог не существует, он будет создан. Ниспадающий список позволяет легко выбрать имя проекта.
  • Параметр Application Mappings (Связи приложения) нужно установить равным .srf;.dll. В созданном виртуальном каталоге будут присутствовать эти связи.
  • Выберите проект DLL-библиотеки веб-приложения в Solution Explorer (Обозреватель решения) для обновления окна и отображения параметров проекта.
  • По аналогии с проектом ISAPI выберите узел Web Deployment (Веб-реализация) в левой области окна внизу (если вы еще не сделали это).
  • Установите такие же значения параметров, как в шагах 4 и 5. Имя виртуального каталога должно совпадать с именем проекта ISAPI. Параметр относительного пути может отличаться от относительного пути проекта ISAPI. Связи приложения устанавливать не нужно.
  • Нажмите на кнопку OK, чтобы сохранить изменения в конфигурации и закрыть окно.
  • После установки относительного пути, имени виртуального каталога и связей приложения для проектов в решении ATL Server реализация файлов произойдет при первом же выполнении команды построения.

    Нажмите на клавишу 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 не устанавливается с поддержкой отладки ATL Server. По умолчанию устанавливается компонент Full Remote Debugging (Полная удаленная отладка), обеспечивающий отладку веб-форм и веб-служб Visual Basic и C#. Решениям C++ необходима Native Remote Debugging (Обычная удаленная отладка). С помощью программы установки Visual Studio .NET добавляется необходимая поддержка (см. рис. 4.6). Откройте программу установки и запустите процесс инсталляции. В окне, показанном на рис. 4.6, выберите Native Remote Debugging (Обычная удаленная отладка).

    (рис 4.6) Установка Native Remote Debugging (Обычная удаленная отладка)

    После установки обычной удаленной отладки и правильной настройке ее параметров откроется окно браузера с отображением сообщения: "This is a test: Hello World!". На данном этапе может возникнуть ошибка по причине того, что файловые расширения .dll и .srf не связаны с ассоциированной DLL-библиотекой расширения ISAPI в рассматриваемом экземпляре IIS или виртуальном каталоге. В этом случае откройте связи приложения (см. рис. 4.2) и проверьте правильность связи файлов .dll и .srf с нужной библиотекой.

    Поскольку сложная конфигурация ATL Server требует запуска программы Hello World, разработчик должен хорошо разбираться в процессах, происходящих внутри IIS и технологии .NET. Использование мощи ATL Server очень выгодно для разработки, но требует серьезных навыков и знаний от программиста.

    Совет. Если при работе с IIS и ATL Server по непонятной причине возникают неполадки, попробуйте перезапустить веб-службы. Это помогает, если разработчик или системный инженер установил связь с расширением ISAPI вручную, либо после внесения изменений в конфигурацию экземпляра IIS или виртуального каталога.

    Работа с мастером проекта сервера ATL

    Мастер проекта сервера ATL позволяет настраивать параметры, используемые при создании проекта. Он предлагает множество возможных вариантов проекта ATL Server. Некоторые элементы можно изменить на страницах окна свойств проекта уже после создания проекта, а некоторые нужно установить в мастере, так как позже это сделать уже будет нельзя. Visual Studio .NET позволяет корректировать любой проект, менять его тип; а вот аналогичное изменение, производимое вручную, займет много времени. При смене типа проекта вы предотвратите появление проблем, просто сохранив нужный код и вставив его в проект, сгенерированный корректным шаблоном проекта в Visual Studio .NET. Знание опций, доступных в мастере проекта сервера ATL, позволит сэкономить время и более детально ознакомиться с этим компонентом.

    Параметры проекта

    Во вкладке Project Settings (Параметры проекта) мастера проекта сервера ATL (см. рис. 4.7) указывается виртуальный каталог, в который будет записан проект после компиляции. Этот каталог можно сменить в любое время с помощью окна свойств проекта. Вы можете также переименовать проект и каталоги после генерирования мастером проекта сервера ATL файлов программного решения, но возможность генерации одной DLL для хранения кода ISAPI и кода веб-приложения нужно указать до окончания работы мастера.

    (рис 4.7) Параметры проекта в мастере проекта сервера ATL

    Опытный разработчик сможет самостоятельно настроить параметры проекта для смены его типа, но с точки зрения надежности и быстроты операции разумнее изменить параметры мастера для некоторых конфигураций создаваемых двоичных файлов.

    Параметры сервера в мастере проекта сервера ATL

    Во вкладке Server Options (Параметры сервера) мастера проекта сервера ATL (см. рис. 4.8) устанавливается поддержка дополнительной интеграции со службами узла сервера и управление сеансами. Следует отметить, что сеанс может записываться в источник данных, имеющий провайдера OLE-DB. Это относится к разработке веб-кластера, когда требуется размещение данных сеанса внутри источника данных, если другие серверы, участвующие в поддержке веб-решения, должны иметь доступ к сеансу.

    (рис 4.8) Вкладка Server Options (Параметры сервера) мастера проекта сервера ATL

    Если проект сервера ATL создан для функционирования на одном сервере, или если не требуется взаимодействие с другими веб-серверами, использующими сеанс, выберите опцию Memory-Backed Session State Services (Службы состояния сеанса, хранимые в памяти) для обеспечения более высокой производительности. Опция OLE DB-Backed Session State Services (Службы состояния сеанса, хранимые в OLE DB) позволяет расширять программное решение, т.е. установить его в распределенной аппаратной среде без изменения кода. Если программное решение требует поддержки сеансов, отметьте опцию Session Services (Службы сеансов). В зависимости от требуемого уровня поддержки выберите соответствующую опцию хранения: в OLE DB или в памяти.

    При генерации мастером кода создается класс с таким же именем, как у проекта, к началу имени присоединяется символ "C", а к концу добавляется слово "Handler". Этот класс будет интерфейсом веб-приложения в IIS за счет включения в себя обработчиков тегов. Пусть проект называется atlServer4 ((см. рис. 4.7), тогда мастер для поддержки обработчиков тегов создаст класс CatlServer4Handler.

    Включение любой из следующих опций во вкладке Server Options (Параметры сервера) мастера позволит добавить в класс обработчик кода, объявляющий и инициализирующий указатели на соответствующий класс поддержки.

  • Blob Cache. Добавляет указатель на экземпляр класса ImemoryCache для управления случайными участками памяти.
  • File Cache. Добавляет указатель на экземпляр класса IfileCache для управления именами файлов.
  • Data Source Cache. Добавляет классы в проект ATL Server и проект ISAPI для управления кэшированием подключений OLE DB каждого потока.
  • Predefined Performance Counters. Добавляет классы для интеграции проекта со счетчиками производительности perfmon.
  • Browser Capabilities Support. Добавляет указатель на экземпляр класса 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 (Поддержка возможностей браузера) неправильно определен в комментарии как поддержка кэша источника данных, что привело к незначительной ошибке в шаблоне мастера проекта сервера ATL.

    При использовании указателей на File Cache (Кэш файлов), Blob Cache (Кэш памяти) и Browser Capabilities Support (Поддержка возможностей браузера) с каждого из них нужно снять статус комментария. Указатели инициализируются в общей функции ValidateAndExchange. Она включается в каждый класс обработчика, генерируемый мастером проекта сервера ATL, если отмечена опция Validation Support (Поддержка подтверждения) во вкладке Application Options (Параметры приложения) (см. следующий раздел). С фрагментов кода, отвечающих за инициализацию соответствующего указателя, также нужно снять статус комментария.

    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 не является закомментированным, он входит в программное решение независимо от того, используется он или нет. Не включайте поддержку функциональности – это позволит сократить количество ресурсов.

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

    Кэш памяти необходим для взаимодействия с фрагментами памяти переменного размера в отличии от других классов кэширования памяти ATL Server, поддерживающих фрагменты памяти определенного размера.

    Кэш источника данных обеспечивает функциональность, присущую и другим классам кэширования, исключая хранение подключений к источникам данных.

    При выборе опции Predefined Performance Counters (Предопределенные счетчики производительности) в расширении ISAPI размещается код, реализующий обновление счетчиков ISAPI для perfmon согласно взаимодействию веб-приложения с IIS. Разработчик не участвует в написании кода, весь код, необходимый для обеспечения функциональности, генерируется мастером в файле реализации расширения ISAPI.

    Предопределенными счетчиками производительности являются следующие.

  • Active Threads (Активные потоки). Активные потоки, используемые процессом веб-приложения.
  • Average Response Time (Среднее время ответа). Усредненное время возврата HTTP-ответа веб-приложением.
  • Current Queued Requests (Текущие запросы в очереди). HTTP-запросы, ожидающие обработки.
  • Maximum Queued Requests (Максимальное количество запросов в очереди). Максимальное количество HTTP-запросов в очереди.
  • Server Failed Requests (Ошибочные запросы сервера). Запросы, обработка которых невозможна, включая ошибки "Файл не найден" (404) и "Доступ запрещен" (403).
  • Server Requests Per Second (Количество запросов сервера в секунду). Количество запросов, поступивших на веб-сайт за секунду.
  • Server Total Requests (Общее количество запросов сервера). Общее количество запросов, полученных веб-сайтом IIS.
  • Для поддержки возможностей браузера имеется указатель класса IbrowserCapsSvc и код инициализации, предназначенный для настройки указателя на IbrowserCapsSvc. Если указатель на указатель класса IbrowserCaps передается функции GetCaps класса IbrowserCapsSvc вместе с указателем на контекст сервера, то экземпляр IbrowserCaps позволяет выполнить запрос возможностей браузера. Эта информация определяется экземпляром класса IbrowserCaps с помощью сравнения значения HTTP_USER_AGENT, отправленного веб-серверу с запросом 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 с поддержкой языков для нужного ресурса, чтобы открыть доступ к этой опции.

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

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

    (рис 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

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

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

    (рис 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;
  • код с атрибутами;
  • поддержка особых опций отладки.
  • Файлы ответа сервера

    Далее нужно выполнить анализ информации, полученной от веб-пользователя, вынесение решения относительно полученных данных и возврат ответа пользователю. Посредством добавления определенного кода в проект NewSimpleATLServer файл SRF веб-приложения Hello World связывается с другим приложением, которое выполняет либо запрос имени и любимого цвета веб-пользователя, либо сообщает пользователю его имя и любимый цвет. После настройки файла SRF можно изменить класс DLL-библиотеки обработчика запросов в соответствии с требованиями SRF.

    Теги в файлах ответа сервера

    Файл SRF является хорошей альтернативой языкам Extensible Styleshet Language (XSL) или Extensible Stylesheet Language Transformation (XSLT) и веб-формам ASP.NET за счет предоставления механизма форматирования и отображения выходных данных ATL Server при отделении логики представления от бизнес-логики. Представление Design (Дизайн) в ATL Server предоставляет определенный уровень абстракции для доступа к DLL-библиотеке обработчика запросов и записи кода HTML (см. рис. 4.11). Используя теги в файле SRF, можно реализовать упрощенные сценарии, оптимизированные для управления вызовами функций в DLL-библиотеке обработчика запросов, аналогично файлам XSL и XSLT, которые анализируют и управляют содержимым XML. Файл XSL или XSLT содержат в верхней части инструкции для обозначения того, как нужно использовать файл, и в файле SRF имеется такой же элемент. Файл SRF поддерживает упрощенные возможности циклов и вынесения решений, как и файлы XSL и XSLT.

    (рис 4.11) Представление Design (Дизайн) файла NewSimpleATLServer.srf

    Теги в SRF обозначаются двумя парами фигурных скобок, содержащих внутри аргумент, обычно соответствующий атрибуту тега внутри DLL-библиотеки обработчика запросов. Атрибуты тега в DLL-библиотеке обработчика запросов связаны с функциями, выполняющими определенную задачу и возвращающими данные, предназначенные для вставки в файл SRF. Один файл SRF способен вызвать много DLL-библиотек обработки запросов. Файл SRF может включать в себя другие файлы SRF с помощью тега include и поддерживает комментарии в коде.

    Теги Handler и Subhandler

    Первым тегом любого файла 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 Server Error (HTTP 500: внутренняя ошибка сервера). Эту ошибку обнаружить довольно сложно, поскольку она возникает при многих условиях. В Visual Studio .NET отсутствует функция автозавершения, отображающая доступные атрибуты в DLL-библиотеке обработки запросов при изменении разработчиком файла SRF, поэтому велика вероятность неправильного указания тега обработчика запросов.

    Мы видим, что листинг исходного кода файла NewSimpleATLServer.srf (см. рис. 4.11) является документом HTML. Единственным различием между файлом HTML и SRF является присутствие тегов, заключенных в парные фигурные скобки ("{{ }}"). Элементы управления сервера, предоставляемых проектами веб-службы или веб-формы, по умолчанию недоступны в проекте сервера ATL. Расширение файла SRF связано с библиотекой расширения ISAPI, поэтому файл HTM, HTML или любой другой файл можно связать с DLL-библиотекой расширения ISAPI и реализовать его обработку так, как если бы речь шла о файле SRF с расширением .srf.

    Примечание. Возможность добавления комментариев в файл SRF не столь обширна, как в других типах программных решений (например, в исполняемой программе или веб-службе). Иногда пробелы, размещаемые перед или после тегов замещения, вызывают ошибку в работе файла SRF. Комментарии размещаются перед тегом обработки. Для обозначения тегов используются стили комментариев HTML ( !-- ) или C++ ( // ). Комментарии нельзя располагать на одной строке с другими тегами, например, с тегами замещения. Например, следующая строка вызовет возврат файлом SRF внутренней ошибки сервера HTTP 500: {{endif // if HaveNameAndColor}}.

    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

    Класс 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.

    (рис 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 после ввода пользователем информации
    Вернуться к учебному плану