Architecture Net или что такое Microsoft.NET?




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

Проект на основе библиотеки шаблонных классов ATL создается обычным способом. Во время создания окно вывода показывает, как происходит размещение проекта ATL-ServerApp. При этом размещении ATLServerApp. srf, ATLServerApp.dll и ATL-ServerAppIsapi.dll копируются в каталог \inetpub\wwwroot\ATLServerApp\. На рис. 12.7 показано приложение ATLServerApp сразу же после его размещения на информационном сервере Internet (IIS).
Затем можно посмотреть, что же получилось в результате Для этого следует запустить решение обычным способом в среде Visual Studio.NET или просто перейти в Web-броузере по адресу http:7/localhost/ATLServerApp/ATLServerApp.srf. Результат показан на рис. 12.8
Полезно с помощью отладчика понаблюдать, что же происходит в динамически подключаемой библиотеке (DLL) Web-приложения. Вы обнаружите, что в ATLServerAp-plsapi.dll сперва вызывается функция HttpExtensionProc с параметром EXTENSION_CONTROL_BLOCK, который содержит структуры, описанные в табл. 12.1. Содержимое этих элементов берется по адресу, определяемому унифицированным указателем информационного ресурса (URL), который указан в Web-броузере
Следующей вызывается функция ValidateAndExchange [На самом же деле для DLL_PROCESS_ATTACH следующей вызывается функция DllMain из ATLServerApp.dll При обработке Web-запросов DllMain вызывается несколько раз, и в настоящем контексте она будет игнорироваться Впрочем, обратите внимание, — этот первый вызов DllMain происходит потому, что динамически подключаемая библиотека DLL расширения интерфейса прикладного программирования Internet-сервера (1SAPI), ATLServerAppIsapi. dll, для обработки Web-запроса динамически загружает динамически подключаемую библиотеку (DLL) Web-приложения, ATLServerApp.dll ]. Она просто отправляет в HTTP-ответ, определенное значение, которое указывает тип содержимого (text/html) Кроме того, эта функция полезна тогда, когда инициализацию и проверку надо проводить перед обработкой запроса.
И, наконец, в динамически подключаемой библиотеке (DLL) Web-приложения вызывается метод OnHello класса CATLServerAppHandler. Этот метод отправляет в HTTP-ответ текст "Hello World!" ("Здравствуй, мир!"). Получившиеся в результате данные, которые передаются на броузер, можно увидеть, просматривая исходный текст HTML []. Комментарии вида <!— комментарий —> вставлены для удобства — Прим ред

<html>
<head>
</head>
<body> <!-- тело -->
This is a test: Hello World!<br>
<!-- Это - испытание: Привет, мир! -->
</body> <!-- тело -->
</html>

7.gif

Рис. 12.7. Только что размещенное приложение ATLServerApp

Обратите внимание, что в .srf-файле указан метод-обработчик Default (Стандартный) в ATLServerApp. dll, а также дескриптор Hello (Привет), который будет заменен в результате подстановки, выполняемой динамически подключаемой библиотекой (DLL) Web-приложения

{{handler ATLServerApp.dll/Default}}
This is a test. {{Hello}}
({{обработчик ATLServerApp dll/Default}}
Это - испытание: {{Привет}})

В исходном коде указанной динамически подключаемой библиотеки (DLL) ATLServerApp.dll видно, что атрибут обработчика Default (Стандартный) применяется к классу CATLServerAppHandler, в котором содержится метод OnHello с атрибутом tag_name, соответствующим дескриптору Hello (Привет) Это означает, что когда информационный сервер Internet (US) получает запрос именно на этот . srf-файл, то, чтобы текстовая строка заменяла дескриптор, т е передавалась в ответ на запрос клиента, информационный сервер Internet (US) загружает указанную динамически подключаемую библиотеку (DLL), находит названный класс и вызывает указанный метод OnHello

8.gif

Рис. 12.8. Просмотр стандартного файла ATLServerApp srf

Таблица 12.1. Структура EXTENSION_CONTROL_BLOCK для ATLServerApp.srf

Компонент структуры Значение
IpszMethod (метод) "СЕТ" (Получить)
IpszOueryString (строка запроса) " "
IpszPathlnf о (информация о пути) "/ATLServerApp/ ATLServerApp srf"
pbData (данные) 0

[ request_handler("Default") ] // по умолчанию
class CATLServerAppHandler
{
[ tag_name(name="Hello") ] // Привет
HTTP_CODE OnHello(void)
{
m__HttpResponse « "Hello World'"; // Привет, мир!
return HTTP_SUCCESS;
}