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

Аутентификационные данные подключения к базе данных

Общей проблемой VB-приложений является неправильная поддержка абстракции логики. Если класс clsChair создан для чтения и записи данных в источник типа базы данных, то программист может включить в этот класс свойство Connection. Свойство Connection предоставляет классу информацию, необходимую для подключения к базе данных. Такой подход нежелателен, потому что возникают проблемы с расширяемостью интернет-приложений, написанных на языке VB. Интерфейс класса не отражает реальное положение дел, поскольку объект "стул" не имеет атрибута Connection на самом деле. Размещая свойство Connection в интерфейсе, программист предполагает, что потребителю класса известно, каким образом класс взаимодействует с источником данных. Атрибут Connection и подобные технические атрибуты не должны вредить интерфейсу. Здесь правильным решением является абстрагирование в бизнес-логике от всего, что не относится к объекту в реальной жизни.
Как программист может обеспечить "чистоту" логической абстракции класса и реализовать подключение к базе данных? Ввод вручную информации о подключении в классе, разумеется, не выход из положения, так как требует изменения кода. Всякое программное обеспечение должно иметь параметры состояния, доступные при инициализации или конструировании. Для сервера Windows механизмом хранения данных состояния или инициализации является реестр, который используется всеми утилитами и службами поддержки Windows. Технология .NET унаследовала использование файлов XML для хранения данных о развертывании и состоянии интернет-приложений.
Любая система работает до тех пор, пока программному обеспечению известен контекст хранения данных инициализации. Реестр Windows отыскивается всегда одинаково, независимо от узла его расположения. Программа не должна искать реестр на диске C:, ведь на другом сервере он может располагаться в другом месте. Реестр обладает контекстом, связанным с самим узлом, а не с положением файла на узле, внутри сервера или внутри сервера на отдельном узле.
В интернет-приложениях корневой веб-каталог выступает в роли общего узла контекста. К содержимому или файлам можно обращаться в контексте корневого веб-каталога. Он может располагаться на диске C: или D:, и при выражении контекста как корневого веб-каталога не возникнет проблем, связанных с нахождением значения данного параметра инициализации. Платформа .NET унаследовала стандарт хранения данных развертывания в файлах XML с именем Web.config, которые располагаются в любом каталоге структуры веб-каталогов. Более подробная информация о приложениях .NET и использовании файла web.config приведена в лекциях 2 и 3.

Так как класс clsChair размещен в приложении COM+, то реализован интерфейс IobjectConstruct для получения аутентификационных данных при подключении к базе данных. Для его использования в список ссылок проекта класса добавлена ссылка COM+ Services Type Library (см. рис. 1.7).

Интерфейс IObjectConstrucion реализован с использованием команды Implements, и в класс добавлена подпрограмма события IObjectConstruct_Construct. Эта подпрограмма выполняется при инициализации класса и передает экземпляр объекта классу, представляемому параметром pCtorObj. Экземпляр класса, на который указывает pCtorObj, имеет свойство ConstructString. Значение ConstructString использовалось для инициализации объекта ADO Connection, повсеместно применяемого в классе clsChair. В листинге 1.4

показана подпрограмма события IObjectConstruct_Construct.

Листинг 1.4.

(html, txt)

Значение свойства ConstructString устанавливается в окне свойств службы компонентов. Для clsClass строка подключения задана в текстовом поле Constructor String (Строка конструктора) вкладки Activation (Активация) окна свойств компонента ConfigSeat.clsClass (см. рис. 1.18). При использовании данного механизма хранения данных о состоянии инициализации класс clsChair настраивается при помощи обычных служб Windows Server, с которыми знаком любой инженер, обслуживающий такой сервер.

Примечание. Технология доступа к данным Windows, использующая технологию ODBC или OLE-DB, позволяет автоматически сохранять подключения к базе данных.Экземпляр класса подключения ADO, хранящийся в m_Connection, является локальным по отношению к классу clsChair (см. рис. 1.4). Это означает, что подключение открыто, пока существует экземпляр класса clsChair. При уничтожении экземпляра класса clsChair экземпляр подключения ADO уничтожается, однако провайдер ODBC или OLE-DB сохраняет экземпляр подключения для следующего запроса. Не нужно кэшировать объекты подключения или создавать ситуации, требующие кэширования, поскольку Windows и так выполняет эту функцию.

Аутентификационные данные подключения к базе данных
Рис. 1.18.  Вкладка Activation (Активация) окна свойств ConfigSeat.clsClass


'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' ***** locals to class ***** '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' holds the color of the chair Private m_scolor As String

'Chair ID for class instance Private m_sID As String

'holds the ADO Connection to the data 'source that the object interacts with Private m_Connection As ADODB.Connection

Private m_sErrorMessage As String

Private Sub IObjectConstruct_Construct(ByVal pCtorObj As Object)

On Error GoTo Sub_Error_Handler Const ERROR_MESSAGE_INFO = "IObjectConstruct_Construct"

Dim sConnection As String

sConnection = pCtorObj.ConstructString

'make certain there is something If Len(sConnection) < 1 Then sConnection = DEFAULT_CONSTRUCTION_STRING End If

'establish connection to database server If m_Connection Is Nothing Then Set m_Connection = CreateObject("ADODB.Connection") End If

m_Connection.Open sConnection 'DEFAULT_CONSTRUCTION_STRING 'establish connection to database server Set m_Connection = CreateObject("ADODB.Connection") m_Connection.Open sConnection '"DSN=ASPExample"

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: Exit Sub

Sub_Error_Handler: 'record the error in class instance and rethrow 'for consuming software to learn of issue ProcessErr ERROR_MESSAGE_INFO & _ " Failure obtaining database connection information." & _ " Class will not connect to database" End Sub

Листинг 1.4.

Значение свойства ConstructString устанавливается в окне свойств службы компонентов. Для clsClass строка подключения задана в текстовом поле Constructor String (Строка конструктора) вкладки Activation (Активация) окна свойств компонента ConfigSeat.clsClass (см. рис. 1.18). При использовании данного механизма хранения данных о состоянии инициализации класс clsChair настраивается при помощи обычных служб Windows Server, с которыми знаком любой инженер, обслуживающий такой сервер.

Примечание. Технология доступа к данным Windows, использующая технологию ODBC или OLE-DB, позволяет автоматически сохранять подключения к базе данных.Экземпляр класса подключения ADO, хранящийся в m_Connection, является локальным по отношению к классу clsChair (см. рис. 1.4). Это означает, что подключение открыто, пока существует экземпляр класса clsChair. При уничтожении экземпляра класса clsChair экземпляр подключения ADO уничтожается, однако провайдер ODBC или OLE-DB сохраняет экземпляр подключения для следующего запроса. Не нужно кэшировать объекты подключения или создавать ситуации, требующие кэширования, поскольку Windows и так выполняет эту функцию.

Аутентификационные данные подключения к базе данных
Рис. 1.18.  Вкладка Activation (Активация) окна свойств ConfigSeat.clsClass

Браузер объектов

Свойством называется специальная пара функций, предназначенных для эмуляции одного атрибута класса при использовании класса другой программой. Одна из функций предназначена для считывания значения, а другая – для записи значения. Нажмите на клавишу F2 для открытия специального окна просмотра Object Browser (Браузер объектов) – это интерфейс ко всем программным элементам проекта, открытого в VB IDE. На рисунке 1.6 в левом верхнем поле со списком выбрана библиотека ConfigSeat, а в списке Classes (Классы) в левой части окна содержится класс clsChair.
Браузер объектов
Рис. 1.6.  Браузер объектов отображает класс clsChair и свойство сolor
Выберите класс clsChair, чтобы отобразить добавленное свойство color в правой области. Выделите свойство color, и в нижней части окна в области отчета появится детальное описание этого свойства с указанием типа, класса и библиотеки, которым оно принадлежит.
Свойство color в его текущем состоянии является практически бесполезным, так как для его значений еще не определены переменные. Без этих переменных установка значения свойства не позволит ни сохранить значение, ни получить его. Свойство используется для изменения значения в классе, которое находится в памяти при работе класса, поэтому нужно объявить локальную переменную с областью действия, охватывающей весь класс.
Значение color представляет собой строку, описывающую цвет стула, поэтому в верхней части кода класса объявим частную (private) строковую переменную с именем m_scolor. Ключевое слово private означает, что переменная недоступна программе за пределами класса. Область действия private целесообразно использовать при контроле доступа потребителей к членам класса, свойствам, подпрограммам и функциям. При работе возможна ситуация, когда потребуется изменить другие значения класса или проверить цвет при его установке. Если локальная переменная m_scolor будет общей, то потребитель класса сможет изменить ее значение, не поставив в известность класс.
Рекомендуется всегда использовать свойства для разрешения установки или считывания атрибута в классе.
Данный подход несколько затрудняет программирование и повышает уровень сложности программного решения, однако в будущем будет проще вносить изменения в класс. Если правила работы класса поменяются, то обновление объекта COM гораздо легче реализовать под общим интерфейсом COM, поскольку код, лежащий в основе функций свойства, используется для корректировки атрибута класса без изменения общего интерфейса класса. Изменение интерфейса класса потребует изменения потребителей класса, поэтому сложности из-за отсутствия абстракции между внутренними членами класса и его внешним интерфейсом, окажутся более серьезными по сравнению с первоначальным усложнением проекта.

В листинге 1.1 приведен код, реализующий класс clsChair.

Листинг 1.1. clsChair With Support to Read and Write the Color to the Instance Option Explicit (html, txt)

Вверху каждого файла кода в VB рекомендуется размещать выражение Option Explicit. Оно проверяет все необъявленные переменные, используемые в коде, при компиляции. При обнаружении таких переменных VB прерывает компиляцию и генерирует сообщение об ошибке. Данное выражение позволяет принудительно объявлять переменные, что полезно для выявления опечаток в именах переменных. Можно провести долгие часы, пытаясь понять, почему переменная не содержит нужного значения, и в результате обнаружить, что эта переменная просто неправильно указана в строке кода. Выявить такие ошибки трудно, поэтому используйте команду Option Explicit. VB настраивается на автоматическое добавление данного выражения в код каждого файла с помощью команды Tools\Options (Сервис\Параметры). Откройте вкладку Editor (Редактор) и отметьте опцию Require Variable Declaration (Требовать объявление переменных).

Добавление нового компонента в приложение COM+ в службы компонентов

Цель создания приложения COM+ – дать возможность службам компонентов обслуживать экземпляры классов в ConfigSeat.dll. Следующим шагом по установке ConfigSeat.dll на несущем сервере является добавление ConfigSeat.dll в только что созданное приложение COM+ New ConfigSeatWeb.

  • В консоли управления Component Services (Службы компонентов) щелкните правой кнопкой мыши на папке Component (Компонент) под пунктом приложения COM+ New ConfigSeatWeb и выберите команду New\Component (Создать\Компонент) (см. рис. 1.15).
    Добавление нового компонента в приложение COM+ в службы компонентов
    увеличить изображение
    Рис. 1.15.  Запуск мастера установки компонентов COM+
  • В окне приветствия мастера установки компонентов COM+ (COM+ Component Install Wizard) нажмите на кнопку Next (Далее) для продолжения работы.
  • В окне Import Or Install A Component (Импорт или установка компонента) нажмите на кнопку Install New Components (Установка новых компонентов).
  • В диалоговом окне выбора файла выберите ConfigSeat.dll и нажмите на кнопку Open (Открыть).

  • В окне Install New Components (Установка новых компонентов) приведен список компонентов, добавляемых в новое приложение COM+ (см. рис. 1.16 ).
    Добавление нового компонента в приложение COM+ в службы компонентов
    Рис. 1.16.  Окно Install New Component (Установка нового компонента) мастера компонентов COM+ с результатом загрузки библиотеки ConfigSeat.dll.
    Данное окно предназначено для открытия библиотек COM DLL, загрузки их в приложение COM+ и отображения выбранных элементов. Нажмите на кнопку Add (Добавить) для открытия диалогового окна выбора файла (см. шаг 4). Выбор других библиотек COM DLL добавит их в списки файлов и компонентов, отображаемые в этом окне. Нажмите на кнопку Next (Далее).
  • Нажмите на кнопку Finish (Готово). Мастер установки компонента COM+ завершит свою работу, и библиотека ConfigSeat.dll будет добавлена в приложение COM+ New ConfigSeatWeb.


  • Добавление нового приложения COM+ в службы компонентов

    Ниже приведены шаги, с помощью которых новое приложение добавляется в службы компонентов.
  • Откройте консоль MMC Component Services (Службы компонентов) и разверните дерево элементов в левой части окна; под значком компьютера, содержащего компонент, должна быть открыта папка COM+ Applications (Приложения COM+).
    Примечание. С помощью консоли MMC cлужб компонентов можно управлять службой компонентов на удаленном узле, если у вас есть имя пользователя и пароль администратора, действительные на удаленном узле. Загрузка компонента на удаленный узел требует расположения файла компонента на этом узле. В консоли cлужб компонентов нельзя переместить файл компонента на удаленный узел.
  • Щелкните правой кнопкой мыши на папке COM+ Applications (Приложения COM+) и выберите New\Application (Создать\Приложение) (см. рис. 1.9) для запуска мастера установки приложения COM+ (COM+ Application Install Wizard).

  • В первом окне мастера нажмите на кнопку Next (Далее).
    Добавление нового приложения COM+ в службы компонентов
    увеличить изображение
    Рис. 1.9.  Добавление нового приложения в консоль управления Components Services (Службы компонентов).

  • В окне Install Or Create A New Application (Установка или создание нового приложения) (см. рис. 1.10) нажмите на кнопку Create An Empty Application (Создать пустое приложение) для перехода к следующему окну.
    Добавление нового приложения COM+ в службы компонентов
    Рис. 1.10.  Окно Install Or Create A New Application (Установка или создание нового приложения) мастера установки приложения COM+

  • В окне Create Empty Application (Создать пустое приложение) (см. рис. 1.11) введите имя приложения COM+; в нашем случае – New ConfigSeatWeb. Имя приложения COM+ не играет особой роли с точки зрения программирования, оно определяет приложение COM+ в консоли управления службами компонентов. Библиотека DLL ConfigSeat является новым компонентом, поэтому выберите значение по умолчанию Server Application (Приложение сервера) в качестве типа активации. Параметр Activation Type (Тип активации) сильно влияет на производительность и надежность приложения COM+.
    Для получения более подробной информации об этом параметре обратитесь к разделу "Общие сведения об архитектуре Windows и приложениях служб компонентов". Для продолжения работы нажмите на кнопку Next (Далее).

    Добавление нового приложения COM+ в службы компонентов
    Рис. 1.11.  Окно Create Empty Application (Создание пустого приложения) мастера установки приложения COM+



  • В окне Set Application Identity (Установка принадлежности приложения) (см. рис. 1.12) параметром по умолчанию является Interactive User (Интерактивный пользователь). Здесь можно указать одну из встроенных учетных записей: Local Service (Локальная служба) или Network Service (Сетевая служба) – либо вручную присвоить учетную запись для выполнения приложения COM+. Параметр Interactive User (Интерактивный пользователь) подразумевает выполнение приложения COM+ под учетной записью текущего пользователя, находящегося в системе.

    Добавление нового приложения COM+ в службы компонентов
    Рис. 1.12.  Окно Set Application Identity (Установка принадлежности приложения) мастера установки приложения COM+

    Не используйте этот параметр при работе с несущими компонентами приложения COM+, так как приложение COM+ не будет запускаться после выхода пользователя из системы узла.

    Учетная запись Network Service (Сетевая служба) является учетной записью пользователя Windows по умолчанию для рабочих процессов в IIS. Учетная запись Local Service (Локальная служба) налагает большие ограничения, нежели учетная запись Network Service (Сетевая служба). Обе учетные записи являются ограничительными и, следовательно, достаточно защищенными для выполнения в них приложений. В рассматриваемом примере для выполнения приложения используется учетная запись Windows с именем webuser, которая создана для работы служб, связанных с интернетом. Учетная запись webuser принадлежит группе users. После ввода и подтверждения пароля webuser нажмите на кнопку Next (Далее).

  • Появится окно Add Application Roles (Добавить роли приложения) (см. рис. 1.13). По мере усложнения веб-приложений программисты вынуждены, помимо обеспечения контроля доступа к содержимому, определять роли.

    Интеграция XML и XSL

    Класс clsChair поддерживает обобщение логики представления. Функция GetChairState создает упорядоченную версию объекта "стул" потребителю, осуществляющему построение страницы. Как правило, веб-приложения COM используют ASP-страницу для анализа представления HTML, реализации классов и упрощения прорисовки страницы посредством связывания XML-объектов с документами XML, необходимыми для построения страницы. В ситуации COM – ASP – XSL (или XSLT) можно создать многозвенное приложение, обобщающее типы логики и технологии, приведенные в таблице 1.1.

    Таблица 1.1. Звенья и технологии в веб-приложении COMНазвание звенаПоддерживаемая технология
    Логика представленияЛист XSL или XSLT
    Бизнес-логикаVB COM и ASP.
    Логика доступа к даннымADO
    Логика данныхSQL Server

    Страница ASP является уникальной частью программного решения, поскольку объединяет бизнес-логику и логику представления. В программном решении, представленном выше, ASP не была чистым обобщением бизнес-звена или звена представления, поскольку содержала аспекты каждого из них. В листинге 1.14 приведен исходный код страницы-диспетчера ASP, использовавшейся с clsChair. XMLCOMChair.asp не содержит кода HTML, вся страница отображается на листе XSL. Независимо от способа отображения данных из clsChair в браузере, ASP не требует внесения изменений. ASP должна иметь сведения об интерфейсе класса clsChair, поэтому в код включена бизнес-логика. Если в класс clsChair добавляются новые функции или свойства, то нужно отредактировать код ASP. ASP легко параметризуется в соответствии с настраиваемой системой запуска классов, полностью абстрагируясь от бизнес-логики и логики представления.
    Листинг 1.14. Source Code for XMLCOMChair.asp object dispatcher (html, txt)
    После выполнения экземпляром класса clsChair своей бизнес-логики состояние clsClass преобразуется в XML и используется для построения страницы HTML. Имя листа XSL – formatChair.xsl – хранится в коде ASP, но его можно получить другим способом, например, с помощью аргументов HTTP в представлениях форм или ссылках.
    Подпрограмма Drawpage при помощи строкового аргумента, содержащего XML, прорисовывает конечную веб-страницу. Лист XSL определяет способ построения веб-страницы и отображение значений в XML. В XSL можно расположить и другие данные, например, сценарии JavaScript, предназначенные для выполнения в браузере. В листинге 1.15 приведен код листа XSL formatChair.xsl.

    Листинг 1.15. Source code for formatChair.xsl (html, txt)

    При XSL-программировании следует иметь в виду несколько важных моментов. Любой файл XSL должен быть правильно сформирован, т.е. соответствовать стандартам XML, принятым Консорциумом WWW (W3C). Ошибки в формировании файлов, как правило, вызываются следующими проблемами в коде XML.

  • Теги элементов не соответствуют друг другу. Убедитесь, что в коде используются соответствующие друг другу начальные и конечные теги (включая теги HTML).
  • Несоответствующее расстояние между символами. Необходимо соблюдать правильное количество пробелов между отдельными частями элементов. Лишний пробел между символами "/" и ">" становится причиной некорректного формирования XML.
  • Присутствие специальных символов. Значения элементов и атрибутов не должны содержать специальных символов. Обратитесь к инструкции "Специальные символы в коде XML" для получения более подробной информации.


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

    Когда программное решение целиком отгружено на сервер, и браузер запрашивает XMLCOMChair.asp, то отображаемая страница должна иметь следующий вид (см. рис. 1.21).

    Интеграция XML и XSL
    Рис. 1.21.  XMLCOMChair.asp использует clsChair и formatChair.xsl для прорисовки веб-страницы




    Start the HTML page here XML COM page

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ build table for chair data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    current
    ID Color


    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ XSL parts are completed

    Please never forget, all HTML must be well formed also. XSL is also case sensitive. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


    command
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ build table for commanding new chair data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Action
    ID
    color







    Листинг 1.15. Source code for formatChair.xsl

    При XSL-программировании следует иметь в виду несколько важных моментов. Любой файл XSL должен быть правильно сформирован, т.е. соответствовать стандартам XML, принятым Консорциумом WWW (W3C). Ошибки в формировании файлов, как правило, вызываются следующими проблемами в коде XML.

  • Теги элементов не соответствуют друг другу. Убедитесь, что в коде используются соответствующие друг другу начальные и конечные теги (включая теги HTML).
  • Несоответствующее расстояние между символами. Необходимо соблюдать правильное количество пробелов между отдельными частями элементов. Лишний пробел между символами "/" и ">" становится причиной некорректного формирования XML.
  • Присутствие специальных символов. Значения элементов и атрибутов не должны содержать специальных символов. Обратитесь к инструкции "Специальные символы в коде XML" для получения более подробной информации.


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

    Когда программное решение целиком отгружено на сервер, и браузер запрашивает XMLCOMChair.asp, то отображаемая страница должна иметь следующий вид (см. рис. 1.21).

    Интеграция XML и XSL
    Рис. 1.21.  XMLCOMChair.asp использует clsChair и formatChair.xsl для прорисовки веб-страницы

    dll на сервер ее необходимо

    После копирования библиотеки ConfigSeat. dll на сервер ее необходимо зарегистрировать или загрузить в службы компонентов как приложение COM+. Для регистрации компонента компания Microsoft разработала утилиту командной строки regsvr32.exe. Для работы с ней выполните следующие действия.

  • Откройте окно командной строки или выберите Start\Run (Пуск\Выполнить).
  • Введите regsvr32 <имя COM DLL> (где <имя COM DLL> – имя файла библиотеки COM DLL). Для файла библиотеки ConfigSeat.dll команда имеет вид regsvr32 ConfigSeat.dll, а курсор командной строки при выполнении команды должен находиться в той же папке, что и файл ConfigSeat.dll. При запуске regsvr32 из другого места расположения в команде следует указать полный путь к файлу .dll на сервере. Например, если файл ConfigSeat.dll расположен в папке C:\bin\, то команда имеет вид regsvr32 C:\bin\ConfigSeat.dll.
  • Нажмите на клавишу Enter, чтобы зарегистрировать библиотеку COM DLL.
  • В диалоговом окне появится сообщение об успешном завершении регистрации. Нажмите на клавишу OK для закрытия диалогового окна.


  • Для удаления библиотеки DLL COM или замены ее другой библиотекой следует аннулировать регистрацию библиотеки DLL и удалить соответствующий файл. При аннулировании регистрации из реестра удаляется запись CLSID для данной библиотеки, чем достигается "чистота" реестра и сокращается количество записей. Выполните те же самые шаги, с помощью которых проводилась регистрация, но используйте в команде ключ /u. Например, для аннулирования регистрации файла C:\bin\ConfigSeat.dll команда примет вид regsvr32 /u C:\bin\ConfigSeat.dll. Для просмотра ключей команды и информации о них выполните ее без каких-либо параметров: regsvr32.

    При работе с regsvr32 не возникает каких-либо проблем. Это идеальное программное решение, не требующее управления и дополнительной информации о COM-объекте. Регистрация COM-объектов с помощью regsvr32

    прекрасно подходит для приложения рабочего стола.

    Использование служб компонентов для ролевого доступа

    Службы компонентов разрешают ролевой доступ к любому компоненту, загруженному в приложение COM+. Учетные записи пользователей Windows приписываются к роли, и запросы компонента выполняются с помощью аутентификационных данных этих учетных записей. Если эти роли связаны с запрашиваемой частью компонента, то программа-потребитель будет функционировать должным образом; в противном случае она не сможет осуществить доступ к компоненту. Роли связываются с компонентом, загруженным в приложение COM+, на следующих уровнях:
  • приложение COM+ – все компоненты располагаются в приложении COM+;
  • компонент – конкретный объект COM, загруженный в приложение COM+;
  • коллективные интерфейсы компонента – все методы объекта COM загружаются в приложение COM+;M
  • метод компонента – конкретный метод в конкретном объекте COM, загруженном в приложение COM+.

  • Следует включать ролевой доступ, начиная с верхнего уровня и далее вниз, до нужного уровня контроля доступа. В качестве метода компонента можно определить низшую дискретную функциональность, реализующую контроль доступа. Для включения ролевого доступа выполните следующие шаги.
  • Включите проверку доступа уровня компонента для приложения COM+.
  • Включите проверку доступа уровня компонента для компонента.
  • Присвойте роль (роли) любой из частей компонента:
  • сам компонент;
  • метод компонента;
  • все методы компонента.

  • Чтобы включить проверку доступа уровня компонента для приложения COM+, выполните следующие шаги.
  • В консоли управления Component Services (Службы компонентов) щелкните правой кнопкой мыши на пункте COM+ Application (Приложение COM+) и выберите Properties (Свойства).
  • В окне свойств откройте вкладку Security (Безопасность).
  • Отметьте опцию Enforce Component-Level Access Checks (Обязательная проверка доступа уровня компонента).
  • Нажмите на кнопку OK.

  • Для включения проверки доступа для компонента нужно включить проверку доступа для приложения COM+ и после этого выполнить следующие шаги.
  • В консоли управления Component Services (Службы компонентов) щелкните правой кнопкой мыши на пункте COM+ Application (Приложение COM+) и выберите Properties (Свойства).
  • В окне свойств откройте вкладку Security (Безопасность).


  • Для присвоения роли компоненту в целом отметьте роль в списке Roles Explicitly Set For Selected Item(s) (Роли, установленные для выделенных элементов). Все методы компонента унаследуют данную роль.

    Для присвоения роли определенным методам внутри компонента отметьте опцию Enforce Component-Level Access Checks (Обязательная проверка доступа на уровне компонента), что позволит в дальнейшем присваивать роли методам компонента.

  • Нажмите на кнопку OK.


  • Для компонента ConfigSeat.clsChair, добавленного в приложение COM+ New ConfigSeatWeb, ролевой доступ не требуется, поэтому обязательные проверки доступа уровня компонента не включены. Приложение COM+ New ConfigSeatWeb, тем не менее, настроено на обязательную проверку доступа, поэтому проверки доступа компонентного уровня включены. Если система IIS функционировала под учетной записью по умолчанию, созданной Windows (например, IUSR_имя_компьютера), то ASP-программа, создающая объект ConfigSeat.clsChair, вызовет ошибку, поскольку гостевая учетная запись интернета не имеет доступа к компоненту ConfigSeat.clsChair. После смены ее на другую учетную запись с доступом к указанному компоненту код ASP будет функционировать должным образом. Для использования кодом ASP компонента ConfigSeat.clsChair веб-сайт или виртуальный каталог в IIS настроен на работу с использованием аутентификационных данных учетной записи webuser.

    Для настройки доступа выполните следующие шаги.

  • Откройте окно свойств веб-сайта или виртуального каталога и выберите вкладку Directory Security (Безопасность каталога).
  • Нажмите на кнопку Edit (Изменить) в области Authentication And Access Control (Контроль аутентификации и доступа) для открытия соответствующего окна.
  • По умолчанию опция Enable Anonymous Access (Разрешить анонимный доступ) включена; аутентификационные данные гостевой учетной записи пользователя располагаются в полях User Name (Имя пользователя) и Password (Пароль). Введите webuser в текстовое поле User Name (Имя пользователя) и пароль – в текстовое поле Password (Пароль).
  • Нажмите на кнопку OK несколько раз для закрытия всех окон.


  • Теперь страницы ASP будут выполняться под учетной записью webuser. При создании страницами ASP компонента ConfigSeat.clsChair аутентификационные данные учетной записи webuser представляются для запроса в службы компонентов. Службы компонентов проверяют разрешения учетной записи webuser на создание и использование компонента, и ASP реализует функции в компоненте ConfigSeat.clsChair.

    Использование служб компонентов

    Установка объекта COM в службах компонентов более предпочтительна для веб-приложений по сравнению с использованием regsvr32, поскольку компоненты веб-приложении зачастую требуют последующего управления и обновления компонентов. Любое программное обеспечение, загруженное в службы компонентов, называется компонентом. Службы компонентов имеют больше возможностей по управлению компонентами, например:
  • обновление компонента без прерывания его использования потребителем;
  • предоставление статистической информации об использовании компонента;
  • маскировка функционирования компонента под установленным набором входных данных пользователей;
  • распределение функций компонента на другие узлы;
  • откат транзакций базы данных.

  • Для загрузки объекта COM в службы компонентов сначала нужно создать приложение COM+. Приложение COM+ содержит один или более объектов или компонентов COM. Приложение COM+ в службах компонентов интерпретируется как идеальный (с точки зрения потребителя) развертываемый модуль. Приложение COM+ может использоваться другим процессом, или процесс, под которым выполняется приложение COM+, может быть предоставлен службам компонентов. Запуск (или остановка) приложения COM+ включает (или запрещает) использование всех его компонентов. Если наряду с надежными компонентами загружены ненадежные, то надежные компоненты нужно переместить в другое приложение COM+, которое не требует такого количества административных изменений, как приложение COM+ с проблемными библиотеками DLL. Такая стратегия минимизирует время простоя компонентов приложения, которое не будет "списано со счета" из-за ошибки в одном-единственном компоненте. Появляется возможность более четкого управления установкой компонента, изолированного от остальных надежных компонентов, пока его надежность не будет доказана.

    Использование VB в COM

    До сих пор мы показывали построение простейшего веб-приложения COM, включая все этапы процесс разработки. В реальном COM-объекте должен присутствовать набор классов, отражающий объекты, выявленные в процессе сбора требований. Среди возможностей веб-приложений COM следует отметить хранение данных, связанных с выявленными объектами, чтение данных об этих объектах, упорядочивание данных с помощью XML и их форматирование для отображения в браузере. В данной лекции мы пропустим шаги, связанные со сбором требований. В лекции 6 показаны действия, входящие в цикл разработки программного обеспечения.
    Объектно-ориентированное (ОО) проектирование и анализ представляют собой большую редкость в современном сообществе разработчиков программного обеспечения. Веб-программы не менее сложны, чем другое комплексное программное обеспечение, имеют неопределенную структуру при разработке и дизайне, поэтому не следует игнорировать зарекомендовавшие себя правила и подходы к разработке.
    В организациях проектирование и анализ зачастую выполняются после создания продукта, и в этом случае каждое усовершенствование требует его перестройки. В любом проекте время, отведенное для анализа и проектирования, влияет на завершение процесса программирования в намеченные сроки, позволяет в будущем без особых проблем усовершенствовать программу и усиливает командный дух специалистов, занятых разработкой.
    Существует проблема, связанная с ОО-анализом и проектированием в VB6. VB6 не позволяет создать действительно объектно-ориентированное программное решение. Эта среда программирования не поддерживает наследование реализации. Отсутствие реального полиморфизма и других возможностей ограничивает его эффективность при разработке приложений, обеспечивающих долговечность, особенно для масштабируемого программного решения. Объекты COM можно построить на других ОО-языках, например, на C++ и Java.
    VB6 поддерживает другие возможности истинно полиморфного языка, но наследование классов – очень важная функция – в нем отсутствует.
    Не следует воспринимать наследование в VB6 за истинное наследование. Документация Microsoft описывает VB6 как объектно-ориентированный язык, обеспечивающий наследование классов с помощью команды implements. Однако команда implements обеспечивает только наследование интерфейса. С практической точки зрения это означает, что IDE в VB6 заново конструирует интерфейс суперкласса в дочернем классе и заставляет программиста поддерживать весь интерфейс суперкласса в подчиненном классе. Программист создает весь объем кода наследуемых функций в дочернем классе.

    VB6 позволяет быстро разработать надежные компоненты, обеспечивающие функциональность, связанную с экземпляром класса. Классы используют другие классы, что весьма полезно. Вероятно, лучшей демонстрацией возможностей VB6 является проект, в котором на этапе сбора требований выявлено немного объектов, или проект с небольшим потенциалом для масштабируемости в будущем и с коротким циклом разработки. VB6 является альтернативой истинно полиморфного языка типа C++, требующего от программиста высокого уровня знаний, и технологии сценариев типа VBScript ASP.

    Модульный тест библиотеки COM DLL

    Для тестирования библиотеки ConfigSeat.dll можно создать несложный код ASP, реализующий экземпляр класса clsChair для вывода значения color в браузер и изменения этого значения. Файл ASP DescribeChair.asp (см. листинг 1.2) можно расположить в веб-приложении на сервере с библиотекой ConfigSeat.dll. Файл ASP можно расположить на веб-сайте по умолчанию, созданном при установке IIS. Если сервер не настроен на выполнение exe-файлов, то проведите соответствующую настройку. Для получения инструкций по реализации работы ASP в IIS6 обратитесь к лекции 12 курса "Администрирование web-серверов в IIS".
    Листинг 1.2. ASP DescribeChair.asp used to test the COM component ConfigSeat.DLL (html, txt)
    Для демонстрации возможностей служб компонентов DescribeChair.asp следует запустить много раз. Нагрузка на веб-сервер, созданная запросами на файл ASP, не обеспечивает достаточный спрос на компонент COM или сервер, на котором он расположен, поэтому службы компонентов не зарегистрируют потребность в ресурсах. Microsoft предлагает две утилиты, предназначенные для проведения проверки нагрузкой.
  • Тест Microsoft Application Center Test
  • Тест Microsoft Web Application Stress (WAS)

  • WAS – бесплатная программа; Microsoft Application Center Test входит в пакет Visual Studio .NET Enterprise Edition.
    Для создания нехватки ресурсов в ASP и просмотра реакции на это условие в Microsoft Application Center Test был создан простой сценарий, моделирующий одновременную работу ста пользователей в течение 5 минут. Такая нагрузка достаточно велика, и службы компонентов испытывали большую нагрузку при обслуживании экземпляра clsChair. В каждый момент времени создавалось от нуля до пяти экземпляров clsChair, обеспечивавших 175 запросов на страницы в секунду. На рисунке 1.17
    показана консоль управления службами компонентов, отображающая состояние класса clsChair при тестировании нагрузкой.
    Модульный тест библиотеки COM DLL
    увеличить изображение
    Рис. 1.17.  Консоль управления службами компонентов, отражающая использование класса clsChair

    Настройка проекта ActiveX DLL

    После выбора типа проекта будет создан новый проект с именем Project1 и новый класс Class1. Если сразу скомпилировать проект, то конечный файл будет называться по умолчанию Project1.dll, а идентификатор класса (CLSID), используемый для идентификации класса в команде ASP Server.CreateObject – Project1.Class1. Имена класса и проекта должны быть информативными, а не шаблонными именами по умолчанию. Классу следует присвоить имя применительно к сути создаваемого проекта, а проекту – имя, определяющее файл хранилища или исполнения, внутри которого будет находиться класс.
    Примечание. Все COM-объекты, созданные с помощью проекта Active X DLL в VB6, имеют расширение .dll.
    Пусть в нашем примере веб-приложение является частью интернет-проекта по выбору параметров мебели с именем ConfigSeat.
    Объект "стул" определен в процессе сбора требований, а создаваемый класс предназначен для представления этого объекта и является частью бизнес-логики программного приложения. Данный класс логично назвать clsChair. Префикс cls определяет объект как класс. Элемент Auto List Members в функции Visual Basic IntelliSense отображает имена частей проекта и не различает классы и другие типы файлов, например, модули. Использование префикса cls облегчает идентификацию класса в списке Auto List Members.
    Для изменения имени класса откройте окно свойств с помощью команды View\Properties Window (Вид\Окно свойств) и выберите класс в Project Explorer (Диспетчер проектов). Исправьте имя Class1 в области Name (Имя) на clsChair (см. рис. 1.3). (Остальные параметры в окне свойств не меняйте, поскольку для этого требуются глубокие знания процесса разработки VB ActiveX. В данной лекции этот вопрос не рассматривается.)
    Вы можете также изменить имя проекта, щелкнув правой кнопкой мыши на имени проекта в Project Explorer (Диспетчер проектов).
    Настройка проекта ActiveX DLL
    Рис. 1.3.  Окно свойств класса
    В диалоговом окне свойств проекта во вкладке General (Общие) имеется текстовое поле Project Name (Имя проекта), в котором отображается имя по умолчанию Project1.
    В нашем примере назовем проект ConfigSeat. Удалите в текстовом поле имя Project1 и введите ConfigSeat (см. рис. 1.4).

    Многие программисты не знают о существовании автоматической нумерации версий в VB6. Номера версий помогают определять последнюю версию разрабатываемой библиотеки DLL с помощью уникальных идентификаторов. При каждой компиляции программного кода номер версии увеличивается. Как правило, объект COM устанавливается на узел несколько раз. Потребители программного обеспечения должны использовать только одну версию (последнюю), и номера версий позволяют работать именно с этой версией. При отсутствии номеров версий для определения последней версии пришлось бы использовать дату создания файла. В некоторых ситуациях (особенно при совместной работе над проектом нескольких программистов) определение номера версии по дате не работает. Для включения автоматического присвоения номеров новым версиям проекта откройте вкладку Make (Создание) в диалоговом окне свойств проекта и отметьте опцию Auto Increment (Автоматическая нумерация). Если вы не сделаете это, ошибки в программе не возникнет. Опция Auto Increment (Автоматическая нумерация) по умолчанию не включена, но мы настоятельно рекомендуем включать ее в каждом проекте.

    Настройка проекта ActiveX DLL
    Рис. 1.4.  Диалоговое окно свойств проекта с новым именем ConfigSeat

    Настройка совместимости с двоичными файлами в VB

    Если при перекомпиляции ConfigSeat.dll не скомпилирована тестовая структура, то может возникнуть ошибка при создании экземпляра класса. Это возможно для любого COM-объекта, если другая программа использует COM-объект и содержит ссылки на него. В VB проект ActiveX DLL настраивается на совместимость с проектом по умолчанию во вкладке Component (Компонент) окна свойств проекта. При перекомпиляции рассматриваемого проекта ActiveX DLL не будет установлена совместимость с двоичными файлами, поэтому при выполнении других программ со скомпилированными ссылками на библиотеку ActiveX DLL возникнут ошибки.
    Для иллюстрации вышесказанного рассмотрим следующую ситуацию: ConfigSeat.dll скомпилирована в 9:00 утра. В полдень скомпилирована тестовая структура с именем testconfigseat.exe. Тестовая структура testconfigseat.exe содержит определенные ссылки на ConfigSeat.dll, и в ее коде класс озаглавлен строго определенным образом. В 18:00 проект ConfigSeat.dll перекомпилирован и установлена совместимость с проектом. При выполнении в 18:08 файл testconfigseat.exe вызвал ошибку, поскольку не смог найти библиотеку ConfigSeat.dll из-за изменения CLSID. При каждой компиляции ConfigSeat без указания совместимости с двоичными файлами генерируется новый CLSID. После настройки компонента на совместимость с двоичными файлами (см. рис. 1.20) VB использует один и тот же CLSID при каждой компиляции DLL, поэтому любое зависимое от библиотеки программное обеспечение работает исправно.
    Приложение, использующее библиотеку ActiveX DLL, ожидает интерфейс для данного CLSID. Изменение интерфейса класса иначе, чем добавлением новой функции или свойства, вызовет ошибки в приложениях-потребителях, работа которых основывается на классе.
    Настройка совместимости с двоичными файлами в VB
    Рис. 1.20.  Во вкладке Component (Компонент) окна свойств проекта установлена совместимость с двоичными файлами
    Вы можете добавить новые функции, однако нельзя изменить или удалить имеющиеся параметры. Для имени библиотеки и класса идентификатор CLSID остается неизменным, что достигается компиляцией, совместимой с двоичными файлами. Преимуществом совместимости с проектами является то, что программист может ссылаться на проект ActiveX DLL и легко изменять интерфейсы внутренних классов. Поскольку при программировании интерфейс меняется, совместимость с проектами позволит VB разрешить изменения, не предупреждая о нарушении совместимости при удалении или редактировании общей функции.

    Обработка ошибок

    Взаимодействие с базой данных выводит нас на новый уровень сложности приложения, для которого требуется большая надежность в критических ситуациях. Корректная поддержка ошибок является необходимым условием реализации любого кода; она должна обрабатывать ситуации, которые вызывают возникновение ошибки в подпрограмме, например, при взаимодействии с пользователем или при соединении с разнородными системами.
    В Visual Basic имеется система обработки ошибок, легкая в использовании и управлении. Отсутствие обработки ошибок распространяется и на программу-потребителя. В этом случае пользователь видит малоинформативное сообщение, и программа прерывает свою работу. В веб-приложении, где COM-объект используется страницей ASP, конечному пользователю отображается сообщение об ошибке, если IIS настроен на показ таких сообщений.
    Каждая исключительная ситуация, имеющая место в классе clsChair, фиксируется в журнале событий и сохраняется в локальной переменной свойства ChairError. Код написан таким образом, что при получении информации об ошибке приостанавливается его работа. Обработка ошибок в классе clsChair реализована с использованием той же базовой технологии во всех функциях и подпрограммах. Обработчик ошибок устанавливается на входе в функцию или подпрограмму для перехода к определенной строке. Указываются две строки, определяющие стратегию выхода при обработке ошибок: sub_Exit_Done и sub_Error_Handler. Строка sub_Error_Handler представляет стратегию, согласно которой действия осуществляются при возникновении исключительных условий, указанных в выражении On Error. Код, следующий за строкой sub_Exit_Done, представляет собой обычную стратегию выхода функции или подпрограммы, если при работе программы не возникают исключительные ситуации. В листинге 1.5 приведена типовая структура системы обработки ошибок, примененная в классе clsClass.
    Листинг 1.5.
    (html, txt)
    Подпрограмма ProcessErr, вызываемая в рамках стратегии обработки исключительных условий, обрабатывает ошибки VB или другие неверные условия. ProcessErr выполняет следующие действия:
  • фиксирует информацию об ошибках в журнале событий Windows для дальнейшего анализа;
  • записывает ошибки в локальную переменную класса для доступа к ней программы-потребителя.

  • Журнала не будет заполняться до тех пор, пока компонент не будет скомпилирован, по причине ограничения VB и мер безопасности Windows. При выполнении компонента в VB IDE журналы событий не ведутся.
    В листинге 1.6 приведен код подпрограммы ProcessErr.
    Листинг 1.6. ProcessErr Subroutine – Error Logger and Formatting (html, txt)
    ProcessErr записывает время и добавляет его к описанию ошибки. Свойства класса VB Err конкатенируются в строку, которая станет частью сообщения об ошибке, фиксируемого и сохраняемого в локальной переменной ошибки.

    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return success value

    On Error Resume Next 'destroy objects Exit Function

    Sub_Error_Handler: ProcessErr " message about the failure in terms of function"

    Листинг 1.5.

    Подпрограмма ProcessErr, вызываемая в рамках стратегии обработки исключительных условий, обрабатывает ошибки VB или другие неверные условия. ProcessErr выполняет следующие действия:

  • фиксирует информацию об ошибках в журнале событий Windows для дальнейшего анализа;
  • записывает ошибки в локальную переменную класса для доступа к ней программы-потребителя.


  • Журнала не будет заполняться до тех пор, пока компонент не будет скомпилирован, по причине ограничения VB и мер безопасности Windows. При выполнении компонента в VB IDE журналы событий не ведутся.

    В листинге 1.6 приведен код подпрограммы ProcessErr.

    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'ProcessErr 'formats error and stores it in error local 'then write to event log. Event logging 'will not function in IDE - only in compiled. ' 'in: vsMessage - usually denoting function 'out: nothing '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private Sub ProcessErr(ByVal vsMessage As String)

    Const ERROR_SEPARATOR = " -- " Const NOW_TIME_FORMAT = "yyyy mmm d hh:mm:ss" Const A_SPACE = " " Const ERROR_NUM = " Error #" Const ERROR_BY = " was generated by "

    Dim sDateTime As String

    'get a time data stamp sDateTime = CStr(Format(Now, NOW_TIME_FORMAT)) & _ ERROR_SEPARATOR

    'construct the error entry vsMessage = sDateTime & vsMessage

    'add err object data to the error entry m_sErrorMessage = vsMessage & ERROR_NUM & Err.Number _ & ERROR_BY & Err.Source & A_SPACE & Err.Description & vbCrLf

    'write to event log App.LogEvent m_sErrorMessage, vbLogEventTypeError

    End Sub

    Листинг 1.6. ProcessErr Subroutine – Error Logger and Formatting

    ProcessErr записывает время и добавляет его к описанию ошибки. Свойства класса VB Err конкатенируются в строку, которая станет частью сообщения об ошибке, фиксируемого и сохраняемого в локальной переменной ошибки.

    Общие сведения об архитектуре Windows и приложениях служб компонентов

    Для понимания различий между серверным приложением и приложением библиотеки в службах компонентов необходимо знать некоторые термины и механизмы архитектуры Windows. Процессом называется исполняемая программа, которая выполняется в данный момент. Операционная система Windows предоставляет процессорное время для каждого порожденного процесса. Нитью называется работа, выполняемая внутри процесса. Процесс может поддерживать одновременно несколько нитей. Если нити в процессе отсутствуют, то процесс считается выполненным, и Windows не выделяет ему процессорное время.
    Чем больше процессов выполняется, тем больше ресурсов используется компьютером для обеспечения их работы. Запуск процесса изначально требует значительного количества ресурсов сервера. Остановка одного процесса не влияет на другие процессы, если последние не нуждаются в нем. Остановка процессов является лояльным действием, не представляющим риск для стабильности системы, поэтому распределение большего количества работы между процессами требует большего объема системных ресурсов, но обеспечивает более высокий уровень надежности.
    Стремясь к сокращению системных ресурсов, связанных с запуском и работой процессов, программисты разрабатывают программное обеспечение для загрузки в память под существующим процессом вместо создания нового процесса. Сравнение веб-приложений Common Gateway Interface (CGI) и веб-приложений ASP показывает различие, о котором идет речь. Если на веб-странице, требующей работы приложения CGI, наблюдается 10 посещений в минуту, то независимо от сложности этой работы серверу придется запускать исполняемый файл CGI 10 раз в минуту, т.е. 600 раз в час.
    Если страница ASP выполняет те же задачи, что и исполняемый файл CGI, то через один и тот же интервал времени запускаются нулевые процессы. На самом деле запускается лишь один процесс, и это происходит при старте сервера; этот процесс – IIS. Расширение ISAPI ASP.DLL работает в пространстве процесса IIS. Раньше службы IIS останавливались без видимых причин после продолжительного периода времени.
    Подобные ошибки возникали из-за повреждения процесса IIS и его дестабилизации исключением, утечкой памяти или невыпущенными указателями. Причиной этому была загрузка библиотеки DLL с дефектами в пространство процесса IIS. Эта унаследованная особенность (или ошибка) в архитектуре Windows привела к тому, что IIS воспринимается как ненадежная система в сравнении с другими, менее сложными системами, использующими CGI.

    Для повышения надежности без потерь производительности (что возможно при работе программного обеспечения в собственном независимом процессе) был разработан сервер Microsoft Transaction Server (MTS) для Windows NT 4. MTS превратился в службы приложений (или COM+) на платформе Windows 2000. На каждой новой платформе у служб компонентов появлялись новые возможности. Основным достоинством служб является то, что они выступают в роли сервера DLL. Библиотеку DLL объекта COM можно загрузить в приложение COM+, и она будет выполняться в своем собственном процессе или в процессе программы-потребителя. Приложение сервера COM+ выполняется в собственном процессе, а приложение библиотеки – в процессе программы-потребителя. Если используемые библиотеки DLL надежны и не требуют частого изменения и обновления, то их следует размещать в приложении библиотеки, так как среднестатистическое программное решение использует меньше ресурсов сервера и функционирует с большей производительностью. Если библиотеки DLL созданы недавно, ненадежны или требуют частого обновления, то их следует располагать в приложении сервера. Это исключит сбои в обычной программе при возникновении ошибки в компоненте, и для обновления не потребуется полная остановка этой программы.

    Построение тестовой структуры

    Любое программное обеспечение необходимо тестировать, и VB IDE для этого имеется прекрасный механизм. Нажмите на кнопку Start (Пуск) в панели инструментов VB либо на клавишу F5, чтобы откомпилировать и выполнить программу.
    Поскольку проект ConfigSeat является библиотекой ActiveX DLL, его нельзя выполнить, т.к. он должен использоваться другой исполняемой программой. Для тестирования класса clsChair следует создать еще один проект в том экземпляре IDE, где редактируется clsChair.Это будет исполняемая программа с одной задачей – тестированием класса clsChair. Программа для тестирования другой программы называется тестовой структурой.
  • В Visual Basic выберите команду File\Add Project (Файл\Создать проект) для открытия диалогового окна Add Project (Создание проекта).
  • Во вкладке New (Новый проект) выберите шаблон проекта Standard Exe. Будет создан новый проект с именем Project1, содержащий форму Form1.
  • В Project Explorer (Диспетчер проектов) щелкните правой кнопкой мыши на новом проекте и выберите Set As Start Up.
  • Переименуйте проект, присвоив ему имя clsChairTester.
  • В настоящий момент класс clsChair недоступен, поскольку в тестовой структуре clsChairTester нет ссылки на проект ConfigSeat. Для создания ссылки выберите команду Project\References (Проект\Ссылки) для открытия диалогового окна References (Ссылки) (см. рис. 1.7).
    Построение тестовой структуры
    Рис. 1.7.  Диалоговое окно проекта References (Ссылки)
  • Выберите ссылку для библиотеки ConfigSeat, отметив соответствующую ей опцию, после чего нажмите на кнопку OK.

  • Запомните. В диалоговом окне References (Ссылки) отображаются ссылки для выбранного в настоящий момент проекта. Изменение ссылок применяется только к этому проекту. Вы можете случайно выделить и другие проекты в группе проектирования, поэтому перед внесением изменений убедитесь в том, что выбрано соответствующее диалоговое окно References (Ссылки) с именем окна активного проекта в строке заголовка.
    Элемент form1 можно настроить на отображение функционирования различных компонентов класса clsChair.
    Используемый подход заключается в представлении всех свойств класса в виде текстовых полей, всех функций – в виде кнопок, с текстовыми полями для аргументов формы тестовой структуры соответствующего класса. Тестовую структура нужно сохранить вместе с исходным кодом тестируемого класса, так как в будущем это поможет при усовершенствовании класса или устранении ошибок.

    Примечание. Рассматриваемая тестовая структура – clsChairTester – сохранена с исходным кодом данной лекцию и доступна на веб-сайте автора книги.

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

  • Нажмите на клавишу F5 для запуска тестовой структуры. Выходные данные покажут, что объект успешно создан, и что цвет стула равен значению Brown (Коричневый).
  • Введите новый цвет и нажмите на кнопку Set New Color (Присвоить новый цвет).


  • На рисунке 1.8 показана тестовая структура, при работе которой цвет стула успешно изменен в нескольких тестах.

    Построение тестовой структуры
    Рис. 1.8.  Тестовая структура clsChair тестирует свойство color

    Построение в VB6 COM-объекта с поддержкой доступа к данным

    Возьмем созданный ранее объект "стул" и используем его в дальнейшем процессе разработки, т.е. усовершенствуем объект, добавив функции чтения и записи данных в базу данных, упорядочивание состояния экземпляра класса и его фиксирование в документе XML. В класс clsChair добавятся следующие функции.
  • OpenChair(ID as string) as Boolean – открывает имеющуюся запись "стул" и заполняет объект значениями.
  • CreateChair() as Boolean – генерирует новый ID, заполняет объект новым ID и записывает запись в базу данных.
  • GetChairState() as XMLDOM – упорядочивает состояние объекта в XML DOM в виде: .

  • В класс clsChair добавятся следующие свойства.
  • ChairID as String – Read Only . Идентификатор, используемый для уникальной идентификации рассматриваемого объекта "стул".
  • ChairError as String – Read Only. Описание последней обнаруженной ошибки, имевшей место в классе clsChair.

  • Интерфейс по-прежнему не сложен, однако теперь он более соответствует классу в истинном объектно-ориентированном программном решении. Целесообразно добавить в интерфейс и другие функции: delete (удаление) и save (сохранение) – однако для сокращения приводимых в книге примеров рассматривать их не будем.
    Имя chair предшествует именам функций в классе clsChair. Создавать интерфейс к объекту, использующий имя самого объекта, не рекомендуется, однако этого требуют ограничения данной технологии. Оpen и create являются ключевыми словами, зарезервированными в VB, поэтому их нельзя использовать в качестве имен пользовательских функций в экземпляре класса. Следует заметить, что наследование класса не содержит какой-либо логики, за исключением того, что связано с описанием самого стула или с его действиями в рассматриваемом сценарии. Отсутствует логика данных или логика представления, например, строки подключения к базе данных или HTML-вывод.
    В листинге 1.3 приведен общий интерфейс объекта "стул"; он содержит объявления следующих функций, включая код реализации.
    Листинг 1.3.
    (html, txt)

    Применение библиотеки COM DLL

    Теперь, когда класс clsChair прошел модульное тестирование в тестовой структуре, он почти готов для использования в веб-приложении. Однако перед этим его нужно скомпилировать и разместить на несущем сервере. Выполните следующие действия.
  • В Project Explorer (Диспетчер проектов) выберите проект ConfigSeat.
  • Выберите команду File\Make ConfigSeat.dll (Файл\Создать ConfigSeat.dll).

  • Откроется диалоговое окно Make Project (Создать проект), в котором нужно ввести имя файла и расположение новой библиотеки DLL. Измените имя файла или путь к файлу, если это необходимо, и нажмите на клавишу OK.
    VB откомпилирует проект ConfigSeat и создаст файл .dll. Библиотека DLL автоматически зарегистрируется на узле, и ее можно будет сразу использовать. (О регистрации DLL речь пойдет в следующем подразделе.)
  • Скопируйте новую библиотеку DLL на несущий сервер. Библиотека DLL не обязательно должна находиться в корневом веб-каталоге – ее можно расположить в любом месте узла. Рекомендуем выбрать папку вне корневого веб-каталога, специально предназначенную для хранения двоичных компонентов веб-приложения. Размещение двоичных COM-файлов в корневом каталоге представляет необоснованный риск, ведь при наличии ошибки в настройках веб-сервера пользователь получает возможность доступа и загрузки двоичного файла COM.


  • Расширенная тестовая структура

    Новый класс clsChair можно протестировать после расширения тестовой структуры (см. рис. 1.8) для проверки созданного интерфейса. В тестовую структуру были добавлены кнопки Get XML (Получить XML), Open (Открыть) для открытия нового экземпляра объекта "стул" и Create (Создать) (см. рис. 1.19). Перед нажатием на кнопку Open (Открыть) укажите в текстовом поле аргумент стула ID.
    Расширенная тестовая структура
    Рис. 1.19.  Расширенная тестовая структура для clsChair

    Создание интерфейса класса в ActiveX DLL

    Объект "стул" имеет некоторые атрибуты: цвет, высота, наличие или отсутствие колес. Эти атрибуты можно присоединить к классу в виде свойств. Ниже показано, как расширить класс clsChair добавлением свойства color.
  • Выберите команду Tools\Add Procedure (Сервис\Добавить процедуру).
  • Введите имя свойства в текстовом поле Name (Имя) (см. рис. 1.5).
  • В области Type (Тип) выберите Property (Свойство).
  • В области Scope (Область) выберите Public (Общая).
  • Нажмите на клавишу OK, и в соответствующем окне отобразится код, представляющий структуру свойств Let и Get.

  • Создание интерфейса класса в ActiveX DLL
    Рис. 1.5.  Диалоговое окно Add Procedure (Добавление процедуры)

    Специальные символы в коде XML

    В XML для описания данных используется обычный текст, поэтому возможны проблемы, связанные с расшифровкой данных из структуры XML. Возьмем, к примеру, имя сотрудника компании O'Brien. Что произойдет, если программа поместит список сотрудников, в который входит и O'Brien, в документ XML, предназначенный для отображения в браузере? Элемент XML будет выглядеть так: <имя сотрудника="O'Brien">. Если апостроф не будет закодирован как специальный символ, то в анализаторе XML при загрузке кода произойдет ошибка. При кодировании специальных символов соответствующим образом элемент XML примет вид: <имя сотрудника="O'Brien">.
    Многие символы требуют кодирования. Специальные символы представляются в виде числовых ссылок из набора символов ISO/IEC 10646. Некоторым символам присвоены специальные знаковые последовательности, вид которых соответствует обозначаемому символу.
    СимволПоследовательность знаков общей сущности
    &&
    <<
    >>
    ''
    ""

    Например, числовая ссылка на символ "&" имеет вид "&", можно использовать и представление "&". Числовым представлением символа "=" является "=". Для данного символа отсутствует знаковая последовательность. Для получения информации о других символах и эквивалентных им представлениях обратитесь к Приложению. Дополнительная информация по XML приведена на странице http://www.w3.org/TR/REC-xml, где можно ознакомиться с W3C-спецификацией для XML.

    Структурирование данных в XML

    Функция GetChairState создает документ XML, описывающий экземпляр класса clsChair. XML является простым одноэлементным документом. Элемент Chair содержит два атрибута: ID и Color. Для использования объекта XML добавьте в проект ссылку на библиотеку MSXML (см. рис. 1.7). В нашем проекте выбрана библиотека Microsoft XML v3.0, но существуют и другие версии этой библиотеки. На момент публикации книги уже вышла четвертая версия. В подпрограмме применяется конкатенация строк для построения XML и возврата строки из класса. Однако такой подход опасен, поскольку в большинстве XML-анализаторов сразу возникнет ошибка при некорректности любой части XML. Создание XML с использованием анализатора позволит правильно построить XML. В листинге 1.12 приведен исходный код функции GetChairState.
    Листинг 1.12. Function GetChairState (html, txt)
    После изучения кода в листинге 1.12 становится ясно, почему при построении XML используется конкатенация строк. Применение DOM Document
    интуитивно непонятно, и кажется, что для построения форматированной строки выполняется очень большой объем работы. Первая версия библиотеки XML MSXML.DLL была медленной и неэкономичной с точки зрения ресурсов; здравомыслящий программист реализует XML гораздо быстрее конкатенацией строк. Язык VB не достаточно эффективен для этого. Сокращение изменений, вносимых в строку, кардинально улучшает производительность. Поскольку технологии, связанные с XML, являются довольно новыми, программное обеспечение, поддерживающее эти технологии, должным образом не "устоялось". Программист должен быть в курсе новых данных от производителя и авторов статей и книг, так как данная технология постоянно модернизируется.

    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return object Set GetChairState = xmlChair

    On Error Resume Next 'destroy objects Set xmlChair = Nothing

    Exit Function

    Sub_Error_Handler: ProcessErr " Failure serializing chair into XML. "

    End Function

    Листинг 1.12. Function GetChairState

    После изучения кода в листинге 1.12 становится ясно, почему при построении XML используется конкатенация строк. Применение DOM Document

    интуитивно непонятно, и кажется, что для построения форматированной строки выполняется очень большой объем работы. Первая версия библиотеки XML MSXML.DLL была медленной и неэкономичной с точки зрения ресурсов; здравомыслящий программист реализует XML гораздо быстрее конкатенацией строк. Язык VB не достаточно эффективен для этого. Сокращение изменений, вносимых в строку, кардинально улучшает производительность. Поскольку технологии, связанные с XML, являются довольно новыми, программное обеспечение, поддерживающее эти технологии, должным образом не "устоялось". Программист должен быть в курсе новых данных от производителя и авторов статей и книг, так как данная технология постоянно модернизируется.

    Свойства в классах

    Свойства в VB представляют собой обычные функции для упрощения доступа и присвоения значений. Программист может включить в подпрограмму свойства код, реализующий работу программы. Рекомендуется создавать функции или подпрограммы для ситуаций, в которых работа выполняется программой. Хорошим примером функции в классе clsChair, являющейся свойством "только для чтения", будет GetChairState(). GetChairState() выполняет работу по созданию кода XML, поэтому она размещена в функции, возвращающей экземпляр класса. Если класс DOMDocument30 сохранен в локальной переменной класса и инициирован после вызова функции Open() или Create(), то использование свойства с доступом "только для чтения" является лучшим способом возврата экземпляра класса DOMDocument30.
    Поскольку свойства ChairError и ChairID доступны только для чтения, то при попытке записи в функцию значения произойдет ошибка. Свойство color является единственным свойством, поддерживающим чтение и запись, поскольку существуют два прототипа свойства – Get и Let. Свойства ChairError и ChairID доступны только для чтения, поэтому содержат только прототип Get.
    Ни в одном фрагменте кода данной лекции не показана еще одна возможность VB, которая, правда, не очень важна. Свойство может принимать и возвращать аргумент экземпляра класса. Если для принятия экземпляра класса используется прототип свойства, то используется ключевое слово Set, а не Let. Например, если класс clsChair имеет свойство записи ChairState, которое воспринимает экземпляр класса XML DOM как аргумент, то прототип выглядит следующим образом:
    Public Property Set ChairState(ByVal vNewValue As DOMDocument30) End Property

    отображается диалоговое окно New

    После запуска Visual Basic 6 отображается диалоговое окно New Project (Новый проект) (см. рис. 1.2), в котором выбирается тип проекта. Для построения COM-объектов веб-приложения выберите ActiveX DLL и нажмите на кнопку Open (Открыть).
    отображается диалоговое окно New
    Рис. 1.2.  Диалоговое окно нового проекта в Visual Basic 6
    В VB6 можно создать проекты других типов, например, исполняемые файлы и элементы управления ActiveX. Проекты ActiveX EXE и Standard EXE обычно используются при разработке приложений. Проект исполняемого файла мы рассмотрим далее при создании тестовой программы для библиотеки DLL ActiveX. В проекте ActiveX Control мы сгенерируем элемент управления ActiveX, передаваемый браузеру или используемый в приложениях рабочего стола.
    Из-за ограничений, связанных с разработкой программ в VB runtime, элементы управления ActiveX, написанные на VB, не подходят для веб-разработки, поскольку после установки программы на клиенте зачастую требуется перезагрузка компьютера для работы с новым элементом управления ActiveX.

    Загрузка в COM+ с помощью строки Constructor

    ConfigSeat.dll можно скопировать в среду сервера и разместить в приложении COM+, заменив предыдущую версию ConfigSeat.dll. Приложение COM+ в службах компонентов может заблокировать DLL. После отключения приложение в службах компонентов библиотека DLL освобождается для удаления. Если библиотека DLL участвует в работе веб-приложения, то веб-сервер не будет использовать класс clsChair после удаления классов в DLL из приложения COM+.
    Сейчас мы выполним загрузку новой версии clsClass в приложение COM+ New ConfigSeatWeb.
  • В консоли управления службами компонентов удалите старую версию ConfigSeat.clsClass, щелкнув правой кнопкой мыши на компоненте и выбрав Delete (Удалить).
  • Добавьте новую версию компонента так же, как и первую версию, с помощью мастера установки компонентов COM+ (COM+ Component Install Wizard ).
  • По окончании работы с мастером щелкните правой кнопкой мыши на классе в консоли управления Component Services и выберите Properties (Свойства), чтобы открыть окно свойств для класса ConfogSeat.clsClass.
  • Откройте вкладку Activation (Активация) и отметьте опцию Enable Object Construction (Включить конструирование объекта). Затем введите текст, который должен получить класс от подпрограммы события IObjectConstruct_Construct, приведенной в листинге 1.4. В классе ConfigSeat.clsClass строка конструктора содержит строку подключения ADO для получения доступа к информации в базе данных (см. рис. 1.18).
  • Убедитесь, что класс clsChair загружен, выполнив на нем быстрый модельный тест. Тестовая структура проясняет функциональность класса внутри новой среды. Исполняемый файл скопируйте на узел и запустите. Выполните более простой тест с помощью DescribeChair.asp (см. листинг 1.2), добавив несколько новых вызовов функций для нагрузки компонента. В листинге 1.13 приведена расширенная версия файла DescribeChair.asp с именем DescribeChairFinal.asp.

  • Листинг 1.13. DescribeChairFinal.asp used to demonstrate added interface of clsChair. (html, txt)
    Запустите тест нагрузкой из утилиты Microsoft Application Center Test, и вы увидите, что работа приложения ASP – COM – база данных требует больше ресурсов, чем простое приложение ASP – COM. Предыдущая версия clsChair не предусматривает взаимодействия с базой данных, и база данных располагается на том же сервере, где расположены ASP и COM-объект clsChair. При моделировании одновременной работы 100 пользователей в течении 5 минут выяснилось, что приложение способно поддерживать среднюю нагрузку, равную 45 запросам на страницы в секунду.
    На рисунке 1.17 показано окно служб компонентов, отображающее состояние предыдущего теста. В тесте для предыдущей версии clsChair заголовки Call и Call Time не регистрировали никаких значений, кроме 0. В последней версии clsChair поле In Call стабильно отображало значения от 0 до 1, а поле Call Time стало равным 15 мс. Очевидно, что производительность компонента заметно снизилась по сравнению с проведенным ранее тестом. Как видите, дополнительная функциональная нагрузка, связанная со считыванием информации из базы данных, снижает эффективность работы веб-приложения.

    ' create the object since this is hard work set o = Server.CreateObject("ConfigSeat.clsChair")

    'demonstrate that values were changing Response.Write(" color=" & o.color & "
    ") Response.Write("change color to blue
    ") o.color = "blue" Response.Write(" color=" & o.color & "
    ")

    if o.CreateChair() then Response.Write(" new id=" & o.ChairID & "
    ") else Response.Write(" possible error=" & o.ChairError & "
    ")

    end if

    set oXML = o.GetChairState()

    Response.Write(" xml=" & oXML.XML & "
    ")

    Response.Write(" open new chair
    ")

    if not o.OpenChair("20021129095221") then Response.Write(" possible error=" & o.ChairError & "
    ") end if

    Response.Write(" new chair color should be purple
    ") Response.Write(" new chair color =" & o.color & "
    ")

    'destroy object so it can be created again set o = nothing %>

    Листинг 1.13. DescribeChairFinal.asp used to demonstrate added interface of clsChair.

    Запустите тест нагрузкой из утилиты Microsoft Application Center Test, и вы увидите, что работа приложения ASP – COM – база данных требует больше ресурсов, чем простое приложение ASP – COM. Предыдущая версия clsChair не предусматривает взаимодействия с базой данных, и база данных располагается на том же сервере, где расположены ASP и COM-объект clsChair. При моделировании одновременной работы 100 пользователей в течении 5 минут выяснилось, что приложение способно поддерживать среднюю нагрузку, равную 45 запросам на страницы в секунду.

    На рисунке 1.17 показано окно служб компонентов, отображающее состояние предыдущего теста. В тесте для предыдущей версии clsChair заголовки Call и Call Time не регистрировали никаких значений, кроме 0.В последней версии clsChair поле In Call стабильно отображало значения от 0 до 1, а поле Call Time стало равным 15 мс. Очевидно, что производительность компонента заметно снизилась по сравнению с проведенным ранее тестом. Как видите, дополнительная функциональная нагрузка, связанная со считыванием информации из базы данных, снижает эффективность работы веб-приложения.

    Запись в базу данных

    Реализация функций CreateChair и OpenChair требует взаимодействия с базой данных. Функция CreateDir вставляет данные о новом объекте "стул" в базу данных, в OpenChair заполняет состояние экземпляра класса значениями, считанными из базы данных. Функция Createchair генерирует для этого объекта идентификатор ID, создает команду SQL и записывает новые значения в базу данных при помощи выражения SQL INSERT. В листинге 1.7 приведен код функции CreateChair.
    Листинг 1.7. Function CreateChair (html, txt)
    При вызове функции CreateNewID генерируется новый ID объекта "стул". CreateNewID вызывает функцию New(), форматирует значение в виде уникального числа и преобразует его в строку. В листинге 1.8 приведен исходный код функции CreateNewID. Данный алгоритм имеет большой недостаток. Он генерирует уникальную строку ID только в том случае, если запрос выполняется через 1 с после предыдущего запроса ID. Для получения уникальных значений необходимы более приемлемые подходы, например, использование функции глобально уникального идентификатора Windows (GUID) или других самодельных функций с генератором случайных чисел. Этот недостаток не был устранен, чтобы класс clsChair стабильно генерировал ошибку при записи информации в базу данных. Ошибка возникает из-за того, что ID объекта "стул" является главным ключом в таблице базы данных, в которой находится информация об этом объекте. Запись строки, содержащей такое же значение ID, что и записанное ранее, приведет к ошибке обновления ADO.
    Листинг 1.8. Function CreateNewID (html, txt)
    После генерации ID конструируется выражение SQL с использованием констант, являющихся частью выражения обновления SQL, с помощью которого новые данные записываются в базу данных. Использованное значение color в действительности является локальным значением m_scolor. Свойство color, как и me.color, можно (и нужно) использовать вместо локального значения m_scolor. Если свойство color нужно подтвердить или изменить из его текущего состояния в экземпляре класса, то оно пригодится для внесения небольшого изменения в код в единственном месте, однако в этом случае потребуется изменить код и в свойстве, и в функции при помощи переменной m_scolor.

    После построения команды SQL функция ExecuteCommand передает эту команду в базу данных для выполнения (см. листинг 1.9). В этой функции не предусмотрен возврат значения от события. При выполнении операции ExecuteCommand использует ADO.

    Для работы с технологией ADO в набор ссылок проекта ConfigSeat нужно добавить ссылку на ADO. ADO инсталлируется при помощи пакета Microsoft Data Access Components (MDAC). ADO присутствует в ссылках Visual Basic как библиотека ActiveX Data Objects x Library, где x – номер версии MDAC. На момент написания данной книги последней версией пакета была версия 2.7, но можно использовать и версию 2.6. Если программное обеспечение располагается на узле с NT 4, то нужно использовать версию 2.6.

    Листинг 1.9. Function ExecuteCommand (html, txt)

    В большей части вызовов Err.Raise, выполняемых при возникновении исключительных ситуаций, выводится номер ошибки 1001. Можно указать любой номер, однако это число выбрано для простоты. Используйте числа из диапазона 1000 – 65535, предназначенного для нумерации особых ошибок. Объект ADO Command предназначен для вызова сервера базы данных. Если от объекта Command ожидается набор записей Recordset, то функция Execute возвращает набор записей ADO Recordset. Так как объект ExecuteCommand изначально не предназначен для возврата набора записей Recordset, объект Recordset, возвращаемый от объекта Command, игнорируется.

    ExecuteCommand проверяет, что локальный объект подключения m_Connection установлен и жизнеспособен. После этого создается объект Command и настраивается на отправку серверу команды SQL. Если во время выполнения ExecuteCommand возникнет ошибка, обработчик ошибок зафиксирует ее и выйдет из функции, возвратив значение "ложь". Все переменные типа boolean в VB имеют значение "ложь", если им не присвоены иные значения, поэтому включите в программу код, присваивающий функции значение "истина" по достижении успеха.

    Функция OpenChair открывает набора записей ADO Recordset по известному ID объекта "стул", переданного функции, и заполняет экземпляр класса по результатам перемещения к первой записи набора Recordset.


    В листинге 1. 10 приведен исходный код функции OpenChair. Так как ID объекта "стул" является уникальным в базе данных, то ввиду ограничений работы с данными безопаснее считать, что функция возвращает только одну строку данных, и, как правило, следует использовать именно первую строку. Recordset исследуется на наличие данных с помощью проверки BOF (начало файла) и EOF (конец файла) – они не должны равняться значению "истина". Если значение параметров BOF и EOF равно "истине", то в наборе Recordset записи отсутствуют. Выполнение команды MoveFirst в пустом наборе Recordset приведет к ошибке. Свойства EOF или BOF всегда проверяются перед прохождением по набору Recordset в одном из направлений при помощи команд MoveNext или MovePrevious.

    Листинг 1.10. Function OpenChair (html, txt)

    Набор Recordset, полученный для OpenChair, создан другой вспомогательной ADO-функцией – GetADORecordSet. Как и ExecuteCommand, GetADORecordSet воспринимает выражение SQL как параметр и открывает набор Recordset из источников данных в локальном экземпляре m_Connection объекта Connection. Объект набора записей передается в вызывающую функцию. В листинге 1.11 приведен исходный код функции GetADORecordSet.

    Листинг 1.11. Function GetADORecordSet (html, txt)

    Существует много возможностей по усовершенствованию функции GetADORecordSet. Одной из них является установка набора ADO Recordset как параметра функции, передаваемого в ByRef, и возврат значения "истина" или "ложь" в зависимости от результата извлечения набора Recordset. Программа расходует ресурсы на создание набора записей ADO Recordset только один раз, и функция сообщит вызывающей функции о правильности набора Recordset. Функции ExecuteCommand и GetADORecordSet можно объединить в одну.


    Можно указать любой номер, однако это число выбрано для простоты. Используйте числа из диапазона 1000 – 65535, предназначенного для нумерации особых ошибок. Объект ADO Command предназначен для вызова сервера базы данных. Если от объекта Command ожидается набор записей Recordset, то функция Execute возвращает набор записей ADO Recordset. Так как объект ExecuteCommand изначально не предназначен для возврата набора записей Recordset, объект Recordset, возвращаемый от объекта Command, игнорируется.

    ExecuteCommand проверяет, что локальный объект подключения m_Connection установлен и жизнеспособен. После этого создается объект Command и настраивается на отправку серверу команды SQL. Если во время выполнения ExecuteCommand возникнет ошибка, обработчик ошибок зафиксирует ее и выйдет из функции, возвратив значение "ложь". Все переменные типа boolean в VB имеют значение "ложь", если им не присвоены иные значения, поэтому включите в программу код, присваивающий функции значение "истина" по достижении успеха.

    Функция OpenChair открывает набора записей ADO Recordset по известному ID объекта "стул", переданного функции, и заполняет экземпляр класса по результатам перемещения к первой записи набора Recordset. В листинге 1.10 приведен исходный код функции OpenChair. Так как ID объекта "стул" является уникальным в базе данных, то ввиду ограничений работы с данными безопаснее считать, что функция возвращает только одну строку данных, и, как правило, следует использовать именно первую строку. Recordset исследуется на наличие данных с помощью проверки BOF (начало файла) и EOF (конец файла) – они не должны равняться значению "истина". Если значение параметров BOF и EOF равно "истине", то в наборе Recordset записи отсутствуют. Выполнение команды MoveFirst в пустом наборе Recordset приведет к ошибке. Свойства EOF или BOF всегда проверяются перед прохождением по набору Recordset в одном из направлений при помощи команд MoveNext или MovePrevious.


    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'OpenChair ' Opens an existing record for a chair and 'populates the object with the values ' 'in: Chair ID to open 'out: returns true on success and false otherwise '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Function OpenChair(ID As String) As Boolean On Error GoTo Sub_Error_Handler Const ERROR_MESSAGE_INFO = "OpenChair"

    Const COMMAND_PREFIX = "SELECT * FROM tblChair WHERE ([ID]='" Const COMMAND_SUFFIX = "')"

    Dim sSQL As String Dim rs As ADODB.Recordset

    'build the insert statement sSQL = COMMAND_PREFIX & ID & COMMAND_SUFFIX

    'get Recordset Set rs = GetADORecordSet(sSQL)

    'make certain we got a valid Recordset If rs Is Nothing Then Err.Raise 1001, ERROR_MESSAGE_INFO, _ "Failure Opening Chair ID = " & ID End If

    'make certain that we got a Recordset 'with at least 1 value If rs.EOF And rs.BOF Then Err.Raise 1001, ERROR_MESSAGE_INFO, _ "Failure - record for Chair does not exist. ID = " & ID End If

    rs.MoveFirst

    'set new ID to local setting m_sID = rs(CHAIR_ID)

    'set new color to local setting color = rs(CHAIR_COLOR)

    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return success value

    OpenChair = True

    On Error Resume Next 'destroy objects Set rs = Nothing Exit Function

    Sub_Error_Handler: ProcessErr "Failure Opening Chair ID = " & ID

    End Function

    Листинг 1.10. Function OpenChair

    Набор Recordset, полученный для OpenChair, создан другой вспомогательной ADO-функцией – GetADORecordSet. Как и ExecuteCommand, GetADORecordSet воспринимает выражение SQL как параметр и открывает набор Recordset из источников данных в локальном экземпляре m_Connection объекта Connection. Объект набора записей передается в вызывающую функцию. В листинге 1.11 приведен исходный код функции GetADORecordSet.

    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'GetADORecordSet 'Sends SQL command to datasource and returns 'an ADO Recordset to the function consumer '


    'in: vsSource - SQL string to execute 'out: returns true on success, false otherwise '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private Function GetADORecordSet(ByVal vsSource As String) _ As ADODB.Recordset

    On Error GoTo Sub_Error_Handler Const ERROR_MESSAGE_INFO = "GetADORecordSet"

    Dim rsRequested As ADODB.Recordset Dim cmdRequested As ADODB.Command

    'establish connection If m_Connection.State <> adStateOpen Then Err.Raise 1001, ERROR_MESSAGE_INFO, _ "Connection Object is not open. Database connect be opened." End If

    'establish command Set cmdRequested = CreateObject("ADODB.Command") Set cmdRequested.ActiveConnection = m_Connection

    'set up command object cmdRequested.CommandType = adCmdText cmdRequested.CommandText = vsSource

    'Create instance of Recordset object Set rsRequested = cmdRequested.Execute

    'return Recordset If Not rsRequested Is Nothing Then If rsRequested.State = adStateOpen Then Set GetADORecordSet = rsRequested Else 'rsRequested state is not open Err.Raise 1001, ERROR_MESSAGE_INFO, _ " Recordset state is not open " & vsSource End If Else 'rsRequested is nothing error Err.Raise 1001, ERROR_MESSAGE_INFO, _ " Recordset object is nothing " & vsSource End If

    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return value On Error Resume Next 'destroy objects Set rsRequested = Nothing Set cmdRequested = Nothing Exit Function

    Sub_Error_Handler: ProcessErr " Failure obtaining Recordset."

    End Function

    Листинг 1.11. Function GetADORecordSet

    Существует много возможностей по усовершенствованию функции GetADORecordSet. Одной из них является установка набора ADO Recordset как параметра функции, передаваемого в ByRef, и возврат значения "истина" или "ложь" в зависимости от результата извлечения набора Recordset. Программа расходует ресурсы на создание набора записей ADO Recordset только один раз, и функция сообщит вызывающей функции о правильности набора Recordset.Функции ExecuteCommand и GetADORecordSet можно объединить в одну.

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

    Безопасность ASP.NET

    При загрузке страницы showGrid.aspx фиксируется событие Load и вызывается функция LoadGrid. При вызове функции LoadGrid устанавливается подключение к базе данных посредством строковой переменной и инициализируется объект подключения ADO Connection.
    Примечание. Следует отметить, что указывать символьные аргументы строки подключения в коде, как в листинге 2.10, крайне не рекомендуется. Это сделано, чтобы показать аутентификационные данные, используемые для подключения, а также метод их применения к объекту Connection. Рекомендуем получать аутентификационные данные, размещая строки подключения к базе данных в файле web.config (см. лекции 3).
    В листинге 2.10 используется источник данных Microsoft Access 2000. Чтобы веб-форма ASP.NET могла считывать и записывать информацию в файл базы данных Access, необходимо настроить файловые разрешения сервера для файлов данных Access (.mdb). При использовании базы данных корпоративного уровня, например, SQL Server или Oracle, для передачи аутентификационных данных серверу базы данных при ее запросе веб-формой ASP.NET возможно применение интегрированной безопасности. Аргумент integrated security=sspi в строке подключения к базе данных указывает использование интегрированной безопасности, и аутентификационные данные Windows .NET Server предоставляются источнику данных. Учетная запись пользователя Windows, используемая приложением ASP.NET, меняться в зависимости от следующих критериев.
  • Аутентификация осуществляется для приложения ASP.NET. Анонимная или не анонимная.
  • Используется режим изоляции IIS. Режим изоляции IIS 5.0 или режим изоляции рабочих процессов.

  • В зависимости от метода аутентификации в приложении IIS ASP.NET использует следующие учетные записи Windows.
  • Гостевая учетная запись Windows IIS для анонимного доступа.
    IUSER_<имя_компьютера>
  • Субъект пула приложения. Учетная запись Windows, определенная в пуле приложения. Учетными записями по умолчанию являются Network Service (Сетевая служба), Local Service (Локальная служба) и Local System (Локальная система).
  • Учетная запись Windows-аутентифицируемого пользователя, являющегося потребителем приложения. Аутентификационные данные, предоставленные пользователем при аутентификации приложения сервера ASP.NET.


  • Если IIS настроен на разрешение анонимного доступа к сайту, и для сервера установлен режим изоляции приложения по умолчанию (т.е. режим изоляции рабочих процессов), то ASP.NET использует субъект в пуле приложения, занятом веб-приложением. Если режим изоляции IIS 5.0 используется для обеспечения обратной совместимости, то субъектом пула приложения будет гостевая учетная запись IIS. Если приложение настроено на использование одного из режимов аутентификации, доступных в IIS и предусматривающих предоставление аутентификационных данных пользователем, то IIS по умолчанию использует в качестве субъекта аутентификационные данные. Субъекты, используемые по умолчанию приложением IIS, приведены в табл. 2.1.

    В рассматриваемом приложении (или в любом другом) возможны и другие субъекты доступа. Например, для авторизации доступа пользователя к приложению применяется аутентификация форм, и, в то же время, используется специальная учетная запись пользователя для выполнения всех запросов базы данных.

    Для веб-формы showGrid.aspx применяется режим изоляции рабочих процессов. Анонимный доступ будет разрешен, поэтому аутентификационными данными учетной записи Windows пула приложений станут входные данные, используемые для доступа к источнику информации. Для файла базы данных Microsoft Access файловые разрешения несущего сервера устанавливаются так, чтобы учетная запись Windows производила чтение, запись и изменение файла .mdb. Если речь идет о базе данный корпоративного уровня, то учетной записи Windows нужно предоставить соответствующий доступ к базе данных на сервере базы данных.

    Примечание. Следует помнить, что файл web.config содержит элемент authentication. Режимом элемента аутентификации по умолчанию является Windows. Так как многие программисты используют учетную запись группы администраторов, то впечатление о правильности параметров в форме ASP.NET может быть обманчивым, так как эта учетная запись наделена правами на выполнение практически любых действий в среде разработки. При перемещении приложения на тестовый или конечный сервер с ограниченными разрешениями доступа возможно, что веб-форма не будет функционировать.


    Таблица 2.1. Субъекты по умолчанию для приложения ASP.NETАутентификацияРежим изоляции приложенияУчетная запись Windows, используемая ASP.NET
    АнонимнаяИзоляция IIS 5.0IUSER_<имя_компьютера>.
    АнонимнаяИзоляция рабочих процессовСубъект пула приложения для веб-приложения.
    Не анонимнаяИзоляция IIS 5.0Аутентификационные данные, предоставленные пользователем при проверке подлинности.
    Не анонимнаяИзоляция рабочих процессовАутентификационные данные, предоставленные пользователем при проверке подлинности.

    Файл AssemblyInfo.cs

    Проект ASP.NET с именем SimpleWF создает библиотеку – установочный пакет для файлов веб-формы, из которых состоит проект; эта библиотека является обычной DLL. Библиотека создается при первом запросе файла ASPX из IIS. Файл Codebehind и файл источника, ссылки на которые содержатся в файле ASPX, компилируются в языке инструкций Microsoft (MISL). Формат этого языка аналогичен коду библиотеки в отличие от двоичных продуктов других компиляторов. MISL создается только для исполняемых подпрограмм кода.
    Файлы AssemblyInfo.cs, SimpleWF.csproj, SimpleWF.csproj.webinfo и SimpleWF.vsdisco поставляют компилятору необходимую информацию для создания библиотеки, содержащей код MISL, сгенерированный из файлов ASP.NET. Информация в файле AssemblyInfo.cs представляет собой описание библиотеки, например, ее версию и имя. Этот файл можно использовать для подписи библиотек посредством присвоения ключа, который является механизмом защиты библиотеки от реинжиниринга. В листинге 2.5 приведен код пустого файла AssemblyInfo.cs. Файл библиотеки можно редактировать напрямую, и для этого не требуется высокого уровня знаний. Укажите известные значения, оставив другие значения незаполненными.
    Листинг 2.5. Blank AssemblyInfo.cs file (html, txt)

    Файл Codebehind веб-формы – aspx.cs

    В классическом ASP разработчик размещает в файле ASP код для извлечения данных, отправленных пользователем. После извлечения данных из объекта Request они располагаются в атрибуте значения другого текстового поля, отображающего отправленную пользователем информацию. В файле ASP нужный результат достигается в строке кода:

    В веб-форме ASP.NET требуется разработка большего объема кода, но с более высоким уровнем организации. В листинге 2.4 приведен код веб-формы requestSomething.aspx в файле requestSomething.aspx.cs. Дизайнер веб-форм автоматически генерирует большую часть кода, приведенного в листинге 2.4. При открытии файла requestSomehing.aspx в представлении Design (Дизайн) и двойном щелчке на элементе управления верхнего текстового поля txtYourself дизайнер веб-форм создаст событие в файле requestSomething.aspx.cs с именем txtYourself_TextChanged. Дизайнер веб-форм откроет файл requestSomething.aspx.cs для получения функции события, созданной для элемента управления txtYourself. Несмотря на то, что дизайнер веб-форм генерирует большую часть кода в файле Codebehind, этот код при желании можно редактировать вручную.
    Листинг 2.4. Source Code for the requestSomething.aspx CodeBehind File requestSomething.aspx.cs (html, txt)
    Обработчик события веб-формы вызывается при изменении и отправке на веб-сервер значения txtYourself в форме. После отправки формы серверу файл Codebehind веб-формы requestSomething.aspx определяет, что отправлено значение текстового поля txtYourself и вызывает функцию события txtYourself_TextChanged. В нашем примере для размещения значения, отправленного в текстовое поле txtResponse, создана единственная строка кода:
    this.txtResponse.Text = this.txtYourself.Text;
    Оба текстовых поля воспринимаются как элементы управления или экземпляры классов в обычном программном приложении, полностью абстрагируя программиста от деталей HTML. Так как программист может вставлять элементы управления в представлении Design (Дизайн) и изменять код, связанный с действием элемента управления, щелкнув на этом элементе, он практически полностью избавляется от редактирования кода HTML.

    /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.txtYourself.TextChanged += new System.EventHandler(this.txtYourself_TextChanged);

    this.Load += new System.EventHandler(this.Page_Load); } #endregion private void txtYourself_TextChanged (object sender, System.EventArgs e) { this.txtResponse.Text = this.txtYourself.Text; } } }

    Листинг 2.4. Source Code for the requestSomething.aspx CodeBehind File requestSomething.aspx.cs

    Обработчик события веб-формы вызывается при изменении и отправке на веб-сервер значения txtYourself в форме. После отправки формы серверу файл Codebehind веб-формы requestSomething.aspx определяет, что отправлено значение текстового поля txtYourself и вызывает функцию события txtYourself_TextChanged. В нашем примере для размещения значения, отправленного в текстовое поле txtResponse, создана единственная строка кода:

    this.txtResponse.Text = this.txtYourself.Text;

    Оба текстовых поля воспринимаются как элементы управления или экземпляры классов в обычном программном приложении, полностью абстрагируя программиста от деталей HTML. Так как программист может вставлять элементы управления в представлении Design (Дизайн) и изменять код, связанный с действием элемента управления, щелкнув на этом элементе, он практически полностью избавляется от редактирования кода HTML.

    Файл информации о поиске – vsdisco

    Файл vsdisco определяет пути поиска на сервере разработки, что дает ASP.NET возможность нахождения веб-служб ASP.NET. Файл SimpleWF.vsdisco генерируется для проекта SimpleWF по умолчанию. В листинге 2.7
    приведен исходный код файла SimpleWF.vsdisco. Для упрощения поиска ASP.NET других библиотек в среде разработки следует отредактировать файл vsdisco, указав в нем веб-каталоги, в которых не нужно осуществлять поиск. В версии vsdisco по умолчанию исключаются папки расширения FrontPage, так как обычно библиотеки в этих папках не содержатся.
    Листинг 2.7. Source of SimpleWF.vsdisco (html, txt)

    Файл проекта – csproj

    Файл csproj является файлом XML и содержит информацию о зависимостях проекта и некоторых параметрах компиляции библиотеки. Visual Studio .NET обновляет этот файл по мере добавления или удаления из проекта веб-форм и ссылок. Не следует изменять файл csproj при обычной работе с проектом ASP.NET. При открытии файла в браузере отображается информация обо всех параметрах и элементах, составляющих проект: имена файлов, параметры реализации и ссылки библиотеки и т.д.

    Файл проекта WebInfo – csproj.webinfo

    Файл csproj.webinfo представляет собой файл XML и описывает расположение файла проекта. В листинге 2.6 приведено содержание файла SimpleWF.csproj.webinfo. Он также генерируется и обновляется Visual Studio. .NET, и его не следует редактировать напрямую.
    Листинг 2.6. Contents of File SimpleWF.csproj.webinfo (html, txt)

    Файл веб-формы – ASPX

    Файл ASPX является отображаемым файлом веб-приложения ASP.NET. Конечный пользователь запрашивает его в своем веб-браузере для реализации функциональных возможностей веб-приложения ASP.NET. Если конечному пользователю нужно просмотреть веб-форму этого файла из IIS, необходимо выполнить запрос из веб-браузера по адресу http:///<мой_виртуальный_веб-каталог>/WebForm1.aspx, введя его в адресной строке.
    Создаваемому виртуальному каталогу по умолчанию присваивается имя проекта. Все веб-приложения ASP.NET генерируют виртуальный веб-каталог при установке в IIS. Файлы WebForm1.aspx.cs и WebForm1.aspx.resx используются для создания проектной библиотеки DLL – результата компиляции файла WebForm1.aspx. Файл aspx.cs называется кодом реализации файла ASPX, а файл ASPX – главным файлом. Файл aspx.cs содержит весь код, реализующий ASPX, а aspx.resx представляет собой файл-источник веб-формы.
    В листинге 2.1 показано представление HTML файла ASPX веб-формы ASP.NET. В нем можно изменять код HTML и сценарий javascript клиентской части, однако с помощью элементов управления веб-формы ASP.NET в представлении Design (Дизайн) вы создадите сложную веб-страницу без написания кода HTML. Представление Design (Дизайн) дизайнера веб-форм является редактором типа WYSIWIG ("что вижу на экране, то и получаю при печати"), абстрагирующим разработчика от кода HTML и дающим возможность наглядного построения веб-сраниц (по аналогии со средой IDE для приложений рабочего стола в Visual Basic 6). Если вам больше нравится программировать вручную, используйте область HTML-инструментария для получения элементов HTML.
    Листинг 2.1. HTML View for requestSomething.aspx (html, txt)
    Первая строка requestSomething.aspx определяет файл Codebehind с именем requestSomething.aspx.cs. Global.asax использует такие же правила именования файлов, что и файл requestSomething.aspx, обращаясь к файлу Global.asax.cs. Назначение файла Global.asax такое же, как в ASP – обеспечить место расположения для записи кода, доступное веб-формам рассматриваемого проекта, которое позволит разработчику фиксировать события, связанные с приложением.
    Например, в ASP файл Global.asa обеспечивает запуск и остановку приложения, открытие и закрытие сеанса; файл Global. asax предоставляет класс Global, наследующий System.Web.HttpApplication и содержащий функции, связанные с этими событиями. Кроме того, Global.asax предоставляет события начала и завершения запроса на ресурсы, процесса аутентификации и ошибок приложения.

    Веб-форма requestSomething.aspx содержит три элемента управления. Они добавлены из области Web Forms (Веб-формы). В дизайнере веб-форм можно добавлять элементы управления в веб-форму, как при создании приложения рабочего стола в Visual Basic или в Visual C++. Интерфейс элементов управления практически такой же.

    Разработчики создают код веб-форм так же, как они программируют классы форм в Visual Basic или Visual C++. Представление свойств элемента управления имеет формат XML и располагается в файле ASPX. Технология .NET использует XML для инициализации нужного элемента управления и создания кода HTML, возвращаемого потребителю. Инструментарий Visual Studio .NET позволяет разработчикам выбирать элементы HTML. Например, элементы DataGrid и таблица HTML реализуют отображение таблицы в веб-браузере. Элемент управления веб-формы DataGrid дает более обширное программное управление заполнением и конфигурацией таблицы по сравнению с элементом таблицы HTML. В листингах 2.2 и 2.3 показаны различия между элементом управления веб-формы DataGrid и элементами HTML. В листинге 2.2 приведен код XML, размещенный в файле ASPX и представляющий собой элемент управления DataGrid.

    Листинг 2.2.

    (html, txt)

    В листинге 2.3 показан элемент HTML, созданный при вставке таблицы из области HTML-инструментария в веб-форму.

    Листинг 2.3.

    (html, txt)

    В простейшей веб-форме requestSomething.aspx (см. рис. 2.4) пользователь может ввести некоторую личную информацию и нажать на кнопку Submit (Отправить). После отправки веб-формы он получает ответ в виде содержимого, введенного им в текстовом поле с именем Tell Me About Yourself And Click Submit (Расскажите о себе и нажмите на кнопку Submit [Отправить]), а также в поле You Said (Вы сказали).На рисунке 2.4

    показана форма requestSomething.aspx после отправки информации на сервер.

    Файл веб-формы – ASPX
    Рис. 2.4. 




    Листинг 2.2.

    В листинге 2. 3 показан элемент HTML, созданный при вставке таблицы из области HTML-инструментария в веб-форму.



    Листинг 2.3.

    В простейшей веб-форме requestSomething.aspx (см. рис. 2.4) пользователь может ввести некоторую личную информацию и нажать на кнопку Submit (Отправить). После отправки веб-формы он получает ответ в виде содержимого, введенного им в текстовом поле с именем Tell Me About Yourself And Click Submit (Расскажите о себе и нажмите на кнопку Submit [Отправить]), а также в поле You Said (Вы сказали). На рисунке 2.4

    показана форма requestSomething.aspx после отправки информации на сервер.

    Файл веб-формы – ASPX
    Рис. 2.4. 

    Файл веб-конфигурации – web.config

    Файл web.config представляет собой файл конфигурации IIS. Программист использует его для настройки IIS на определенную работу в процессе разработки. Когда проект ASP.NET готов к реализации, сайт или виртуальный каталог IIS немедленно настраивается согласно этой конфигурации. Параметры файла web.config применяются ко всем папкам каталога, в котором расположен данный файл, если ни в одной из них не содержится другого файла web.config (в веб-приложении их может содержаться несколько). Если файл web.config отсутствует, то по умолчанию используется файл machine.config, расположенный в папке $:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG. Фрагмент пути v1.1.4322 отражает версию технологии .NET, используемой на сервере. В листинге 2.8 приведен файл по умолчанию web.config, созданный в проекте SimpleWF.
    Листинг 2.8. Source Code of web.config file (html, txt)
    Параметры приложения устанавливаются как дочерние элементы элемента appSettings, который, в свою очередь, является дочерним по отношению к элементу configuration. Файл web.config по умолчанию не содержит параметров приложения. Эти параметры обычно включаются динамическими свойствами элементов управления, добавленных в веб-формы в дизайнере веб-форм или введенных вручную. Параметры приложения содержат значения инициализации компонентов приложения. Об использовании файла web.config для хранения и извлечения параметров приложения более подробно рассказывается в лекции 3.
    Элемент system.web имеет дочерние элементы, содержащие параметры управления механизмом самого веб-приложения. При отсутствии дочерних элементов приложение использует параметры файла machine.config. Приведенный ниже список возможных параметров далеко не полон, однако формирующие этот список дочерние элементы элемента system.web по умолчанию присутствуют в файле web.config, созданном Visual Studio .NET:
  • compilation. Определяет параметры компиляции приложения по умолчанию;
  • customErrors. Определяет конфигурацию отчетов об ошибках;
  • authentication. Определяет используемый метод аутентификации;
  • trace. Определяет метод, согласно которому функционирует служба .NET Trace;
  • sessionState. Определяет функционирование сеанса и механизм для управления этим сеансом;
  • globalization. Определяет параметры набора символов, кодировки и настройки, связанные с культурой языка.


  • Параметры приложения содержат значения инициализации компонентов приложения. Об использовании файла web.config для хранения и извлечения параметров приложения более подробно рассказывается в лекции 3.

    Элемент system.web имеет дочерние элементы, содержащие параметры управления механизмом самого веб-приложения. При отсутствии дочерних элементов приложение использует параметры файла machine.config. Приведенный ниже список возможных параметров далеко не полон, однако формирующие этот список дочерние элементы элемента system.web по умолчанию присутствуют в файле web.config, созданном Visual Studio .NET:

  • compilation. Определяет параметры компиляции приложения по умолчанию;
  • customErrors. Определяет конфигурацию отчетов об ошибках;
  • authentication. Определяет используемый метод аутентификации;
  • trace. Определяет метод, согласно которому функционирует служба .NET Trace;
  • sessionState. Определяет функционирование сеанса и механизм для управления этим сеансом;
  • globalization. Определяет параметры набора символов, кодировки и настройки, связанные с культурой языка.


  • Использование классов ADO.NET для заполнения элемента управления DataGrid

    После установки соединения выполняется запрос экземпляра набора данных ADO.NET myDataSet таблицы tblChairs базы данных. Набору данных DataSet при инициализации присваивается имя myChairs. Инициализируется объект ADO.NET Adaptor для заполнения экземпляра myDataSet. После этого инициализируется объект ADO.NET DataView с именем myDataView с использованием первой таблицы набора данных myDataSet. В итоге аргумент DataGrid с именем dg, переданный подпрограмме, устанавливает свойство источника данных на экземпляр DataView с именем myDataView, и вызывает метод DataBind аргумента dg для заполнения экземпляра dg элемента DataGrid данными из таблицы tblChairs.
    Использование класса DataView не является обязательным, если нужно отобразить весь набор данных DataSet. В элементе dg (см. листинге 2.10) отображается весь созданный набор данных DataSet, поэтому можно опустить следующую строку:
    DataView myDataView = new DataView(myDataSet.Tables[0]);
    Свойство DataSource элемента dg установим равным значению Tables[0] свойства набора данных myDataSet. Строку, присваивающую dg.DataSource источнику myDataView, изменим следующим образом:
    dg.DataSource = myDataSet.Tables[0]
    При нажатии на клавишу F5 будет скомпилирована страница showGrid.aspx, затем откроется окно браузера с отображением данных в таблице myChairs (см. рис. 2.6).
    Использование классов ADO.NET для заполнения элемента управления DataGrid
    Рис. 2.6.  Отображение результатов работы showGrid.aspx с использованием DataGrid

    Использование XML

    В веб-формах можно использовать элемент управления XML, реализующий XML, XSL и XSL Transformations (XSLT). Для получения веб-формы, осуществляющей преобразование XML и XSL, создайте новую веб-форму и в представлении Design (Дизайн) вставьте в форму элемент управления XML (см. рис. 2.15). Элемент управления XML предназначен, главным образом, для интеграции веб-форм в приложении, использующем XSL для инкапсуляции логики представления.
    Элемент управления XML настраивается в окне свойств (см. рис. 2.15). В этом окне указывается файл XML или XSLT/XSL, и при открытии страницы осуществляется преобразование XML и XSL в HTML. Если в элементе управления указаны файлы, они должны являться частью проекта, отображаемого в Solution Explorer.
    Использование XML
    увеличить изображение
    Рис. 2.15.  Отображение в представлении Design (Дизайн) формы с элементом управления XML
    Размещение в форме элемента управления XML ограничено: дизайнер веб-форм позволяет располагать его только в левом верхнем углу представления Design (Дизайн) (см. рис. 2.15), хотя некоторые элементы управления размещаются и под элементами управления XML. Дизайнер веб-форм может не воспринять действительную структуру страницы в документе XSL или XSLT, поэтому его возможности по отображению страницы в представлении Design (Дизайн) сильно ограничены.

    Использование XML
    Использование XML
    © 2003-2007 INTUIT.ru. Все права защищены.

    Изменение кода веб-формы, ориентированной на работу с данными

    Чтобы изменить файл Codebehind веб-формы с элементом dgChair, щелкните правой кнопкой мыши на файле веб-формы в Solution Explorer или правой кнопкой мыши на самом файле в представлении Design (Дизайн). Затем выберите View Code (Просмотреть код). По умолчанию Visual Studio .NET отображает в Solution Explorer не все файлы программного решения. Щелкните на значке Show All Files (Показать все файлы) в верхней части Solution Explorer для показа всех файлов, чтобы выбрать файл Codebehind.
    Файл Codebehind отобразится с директивами using для классов, необходимых для функционирования веб-формы, с пространством имен и структурой классов. Пространство имен носит то же имя, что и рассматриваемый проект. Имя класса совпадает с именем веб-формы. В листинге 2.9 приведен исходный код веб-формы showGrid. Веб-форма showGrid демонстрирует элемент управления DataGrid. Дизайнер веб-форм разместил защищенный элемент в классе showGrid, представляющий элемент dgChair, добавленный в веб-форму. Ссылка using System.Data.OleDb добавлена для простоты обращения к классам ADO.NET.
    Листинг 2.9. Source Code for showGrid.aspx.cs after DataGrid Added in Design View (html, txt)
    Если вам нужно заполнить элемент dgChair данными из таблицы базы данных, то требуется получение набора данных ADO.NET DataSet с информацией из базы данных. Набор DataSet используется для заполнения элемента dgChair при запросе веб-страницы с веб-сервера. При загрузке страницы с веб-сервера вызывается событие Load объекта Page. Класс showGrid наследуется из System.Web.UI.Page, как видно из объявления класса в листинге 2.9, поэтому событие Load также наследуется из System.Web.UI.Page. При выполнении события Load происходит получение набора DataSet и заполнения элемента DataGrid. В листинге 2.10
    приведена подпрограмма LoadGrid, реализующая заполнение элемента DataGrid набором DataSet.
    Листинг 2.10. Source Code for Subroutine LoadGrid (html, txt)
    LoadGrid представляет собой функцию, входящую в класс showGrid. Функция вызывается посредством размещения следующего вызова в функции события Page_Load файла showGrid.aspx:
    LoadGrid(dgChair);

    Листинг 2.9. Source Code for showGrid.aspx. cs after DataGrid Added in Design View

    Если вам нужно заполнить элемент dgChair данными из таблицы базы данных, то требуется получение набора данных ADO.NET DataSet с информацией из базы данных. Набор DataSet используется для заполнения элемента dgChair при запросе веб-страницы с веб-сервера. При загрузке страницы с веб-сервера вызывается событие Load объекта Page. Класс showGrid наследуется из System.Web.UI.Page, как видно из объявления класса в листинге 2.9, поэтому событие Load также наследуется из System.Web.UI.Page. При выполнении события Load происходит получение набора DataSet и заполнения элемента DataGrid. В листинге 2.10

    приведена подпрограмма LoadGrid, реализующая заполнение элемента DataGrid набором DataSet.

    private void LoadGrid(DataGrid dg) { //set the connection credentials string DataSetName = "myChairs"; string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=C:\\aspData\\employees.mdb;";

    //make the DB connection OleDbConnection myConn = new OleDbConnection(ConnectionString);

    //make a data set to hold chairs DataSet myDataSet = new DataSet(DataSetName);

    //make a data adaptor OleDbDataAdapter myAdapt = new OleDbDataAdapter("Select * From tblChair", myConn);

    //fill the dataset myAdapt.Fill(myDataSet);

    //get a view in the dataset DataView myDataView = new DataView(myDataSet.Tables[0]);

    //show the data view in the Grid dg.DataSource = myDataView; dg.DataBind(); }

    Листинг 2.10. Source Code for Subroutine LoadGrid

    LoadGrid представляет собой функцию, входящую в класс showGrid. Функция вызывается посредством размещения следующего вызова в функции события Page_Load файла showGrid.aspx:

    LoadGrid(dgChair);

    Мастер форм данных

    Дизайнер веб-форм содержит мастер для создания форм, отображающий наборы данных из источника. Для работы с мастером форм данных (Data From Wizard) выполните следующие действия.
  • В Solution Explorer щелкните правой кнопкой мыши и выберите Add New Item (Добавить новый элемент).
  • В диалоговом окне Add New Item (Добавление нового элемента) вы увидите большое количество типов файлов, которые можно добавить в проект – они отображаются в правой панели. Разверните дерево каталогов слева, и вы увидите дочерние элементы дерева, представляющие собой категории, при выборе которых изменяется набор отображаемых в правой панели элементов.
  • Выберите Data Form Wizard (Мастер форм данных) и введите имя файла (см. рис. 2.8).
    Мастер форм данных
    Рис. 2.8.  Выбор мастера форм данных (Data Form Wizard)
  • Нажмите на кнопку Open (Открыть), и в Visual Studio .NET будет создана новая веб-форма. В нашем примере она называется employees.aspx.
  • Откроется мастер форм данных с окном приветствия, информирующим о предстоящих действиях. Нажмите на кнопку Next (Далее).
  • В окне Choose The Dataset You Want To Use (Выберите нужный набор данных) мастер предложит выбрать имеющийся набор данных либо создать новый набор DataSet. В данном примере создан набор DataSet с именем dsEmps (см. рис. 2.9). Все наборы DataSet, создаваемые в мастере, становятся элементами проекта и могут использоваться другими веб-формами или веб-службами внутри этого проекта. Файл DataSet имеет расширение .xsd.
    Мастер форм данных
    Рис. 2.9.  Окно Choose The Dataset You Want To Use (Выберите нужный набор данных) мастера форм данных (Data Form Wizard)
  • Нажмите на кнопку Next (Далее) для перехода в окно Choose A Data Connection (Выберите подключение к данным) (см. рис. 2.10). В ниспадающем списке показаны соединения, созданные в проекте до этого. Вы можете выбрать имеющееся подключение либо создать новое. В нашем примере выбрано подключение ASPNETExample.
    Мастер форм данных
    Рис. 2.10.  Окно Choose A Data Connection (Выберите подключение к данным) мастера форм данных

  • Нажмите на кнопку New Connection (Новое подключение) для открытия окна Data Link Properties (Свойства подключения к данным), в котором настраивается новое подключение к базе данных.
  • Нажмите на кнопку Next (Далее) для перехода к окну Choose Tables Or Views (Выберите таблицы или образы). Мастер откроет подключение к данным, созданное в предыдущем шаге, и найдет базу данных. Вы можете выбрать таблицы источника данных, к которым должна подключиться веб-форма. Выберите все таблицы и образы, отображаемые в веб-форме; выбор осуществляется в левой области, после чего каждый элемент переносится в правую область окна посредством нажатия на кнопку ">". В нашем примере выбрана таблица tblEmployee (см. рис. 2.11).

    Мастер форм данных
    Рис. 2.11.  Окно Choose Tables Or Views (Выберите таблицы или образы) мастера форм данных

  • Нажмите на кнопку Next (Далее) для перехода к окну Choose Tables And Columns To Display On The Form (Выберите таблицы и столбцы, которые необходимо отобразить в форме). Мастер откроет таблицы или образы, выбранные в шаге 9, и покажет их с соответствующими столбцами, доступными для отображения в двойном списке выбора элементов.


  • Отметьте нужные столбцы для отображения в веб-форме.

    При выборе несколько таблиц появится окно Create A Relationship Between Tables (Создать отношение между таблицами), в котором выбираются ключи и отношения таблиц. В нашем примере для отображения выбраны все столбцы таблицы tblEmployee (см. рис. 2.12).

  • Нажмите на кнопку Finish (Готово). Visual Studio .NET сгенерирует законченную форму с именем employees.aspx со всем необходимым кодом в файле Codebehind и элементами управления, вставленными в форму для отображения данных таблицы tblEmployee.

    Мастер форм данных
    Рис. 2.12.  Выбор таблиц и столбцов для отображения в форме



  • На рисунке 2.13 показана веб-форма employees.aspx, отображенная в представлении Design (Дизайн). Элементы управления можно перемещать для нужной настройки их отображения. Код, лежащий в основе формы, довольно высокого уровня, в нем присутствует даже обработка ошибок!


    Мастер форм данных
    Рис. 2.13.  Результирующая веб-форма, сгенерированная мастером форм данных, отображенная в представлении Design (Дизайн)

    Если employees.aspx установлена в качестве стартовой страницы, то нажмите на клавишу F5 для компиляции employees.aspx, чтобы открыть браузер и отобразить веб-форму. На пустой странице будет показана кнопка Load (Загрузить). Нажмите на кнопку Load (Загрузить), и данные отобразятся в браузере (см. рис. 2.14).

    Мастер форм данных
    Рис. 2.14.  Веб-форма employees.aspx, сгенерированная мастером форм данных и отображающая информацию из таблицы tblEmployee

    Начало работы с Visual Studio .NET

    Откройте Visual Studio .NET. Вы увидите начальную страницу, если ее отображение разрешено. Как и в предыдущей версии Visual Studio, по умолчанию предоставляется шаблон проекта (эту возможность можно отключить). Создадим новый проект веб-форм ASP.NET.
  • Нажмите на кнопку New Project (Создать проект) в окне шаблона проекта, чтобы открыть окно New Project (Создание проекта) с перечнем типов проектов и соответствующими шаблонами.
  • В списке слева выберите Visual C# Projects (Проекты Visual C#) – справа отобразятся шаблоны проектов, соответствующие C#.
  • Выберите шаблон проекта ASP.NET Web Application (Веб-приложение ASP.NET).
  • Введите свое имя проекта, отличное от имени в текстовом поле. Укажите имя сервера, задав URL (см. рис. 2.2) или путь UNC к корневому веб-каталогу. В URL укажите имя сервера по умолчанию localhost, если разрабатываемое программное решение располагается на рабочей станции во время написания кода и модульного тестирования. В нашем примере указано имя SimpleWF.
  • Нажмите на кнопку OK. Vusual Studio .NET подключится к несущему серверу и сгенерирует файлы проекта. Visual Studio.NET вносит изменения на веб-сервере через порт 80, создавая новый виртуальный каталог, связанный с файловым каталогом, в котором находятся файлы проекта веб-формы. Если на порте 80 отсутствует веб-сервер IIS, или если IIS не работает, то Visual Studio .NET не сможет сгенерировать проект веб-приложения.

  • Начало работы с Visual Studio .NET
    Рис. 2.2.  Присвоение имени проекту веб-приложения ASP.NET SimpleWF
    При успешном подключении Visual Studio .NET к серверу, указанному в окне New Project (Создание проекта), по умолчанию генерируются следующие файлы:
  • AssemblyInfo.cs;
  • Global.asax;
  • Global.asax.resx;
  • SimpleWF.csproj;
  • SimpleWF.csproj.webinfo;
  • SimpleWF.vsdisco;
  • Web.Config;
  • WebForm1.aspx;
  • WebForm1.aspx.cs;
  • WebForm1.aspx.resx.

  • После создания веб-формы на узле редактор отобразит пустую веб-форму с именем WebForm1, готовую для редактирования (см. рис. 2.3).
    Для редактирования веб-форм в Visual Studio .NET используется дизайнер веб-форм (Web Forms Designer). Он позволяет переходить из представления формы в представление HTML для отображения кода XML и HTML с помощью кнопки HTML в левом нижнем углу окна веб-формы.
    Начало работы с Visual Studio .NET
    увеличить изображение
    Рис. 2.3.  Веб-форма в представлении Design (Дизайн) дизайнера веб-форм
    Обратное переключение легко осуществляется посредством кнопки Design (Дизайн), расположенной рядом с кнопкой HTML. Дизайнер веб-форм является довольно гибким компонентом и отображает изменения, вносимые вручную в представлении HTML. Файл ASPX редактируется в любом представлении дизайнера веб-форм – все вносимые изменения равнозначны.

    Обзор архитектуры интернет-форм

    Расширением файла страницы веб-формы ASP.NET является .aspx, и в этой лекции такой тип файлов называется ASPX. Каждая веб-форма ASP.NET имеет связанный с ней класс. Классы файла ASPX содержатся в файле кода формы, который называется Codebehind. Имя файла Codebehind указывается следующим образом: <имя_файла>.aspx.<расширение_языка>, где <имя_файла> – имя файла ASPX, <расширение_языка> – двухсимвольное расширение, отражающее язык файла Codebehind. Если файл ASPX называется Webform.aspx, то файл Codebehind имеет вид Webform.aspx.cs для языка C# и Webform.aspx для языка Visual Basic. Файл ASPX содержит визуальные элементы веб-формы, а файл Codebehind содержит логику, согласно которой эта форма функционирует. Все файлы Codebehind компилируются в динамически подключаемые библиотеки (DLL), отгружаемые на сервер вместе с соответствующими страницами ASPX. Библиотеке DLL проекта по умолчанию присваивается имя проекта.
    При запросе ASPX в IIS страница обрабатывается посредством расширения ISAPI ASP.NET aspnet_isapi.dll. Технология .NET генерирует еще одну временную библиотеку DLL на основе ASPX во время первого запроса файла. Эта DLL содержит класс, наследуемый от соответствующего класса веб-формы, сгенерированного в файле Codebehind, и располагается в библиотеке DLL проекта (см. рис. 2.1).
    Такая система существенно обобщает бизнес-логику и логику представления по сравнению с абстракцией, предлагаемой архитектурой ASP. Файл Codebehind содержит бизнес-логику, а ASPX – логику представления веб-формы.
    Обзор архитектуры интернет-форм
    Рис. 2.1.  Обзор архитектуры веб-форм ASP.NET
    Возможности этих двух файлов усиливают уровень абстракции логики представления и бизнес-логики. Файлы ASPX – это файлы XML, содержащие элементы HTML и элементы управления серверной части для создания HTML. Программист может внедрять бизнес-логику в файлы ASPX, но на это ему придется затратить дополнительные усилия. Файлы Codebehind – это файлы с кодом, и разместить в них логику представления гораздо сложнее, чем использовать файлы ASPX. В ASP абстракция бизнес-логики и логики также представляет собой сложный процесс, поэтому в ASP логика представления и бизнес-логика объединяются при разработке программного решения.

    Обзор технологии ADO.NET

    Для заполнения элемента dgChair данными из таблицы базы данных мы будем использовать ADO.NET, поэтому нужно добавить в файл showGrid.aspx пространство имен для классов данных, необходимых для доступа к источнику данных. Веб-формы по умолчанию содержат пространство имен System.Data, являющееся главным пространством имен ADO.NET. Другие пространства имен, подчиненные System.Data, поддерживают определенные типы источников данных. Стандартными пространствами имен, подчиненными System.Data, являются следующие.
    System.Data.Common. System.Data.OleDb. System.Data.SqlClient. System.Data.SqlTypes.
    Пространство имен SqlClient обеспечивает интерфейс к провайдеру SQL Server и наиболее эффективный способ связи с SQL Server 2000. Пространство имен System.Data.OleDb поддерживает интерфейс, аналогичный традиционной технологии ADO; оно неэффективно при подключении к SQL Server 2000. System.Data.Ole.Db рекомендуется для работы с источниками данных, отличными от SQL Server 2000, имеющими провайдера OLE-DB. Пространства имен System.Data.Common и System.Data.SqlTypes обеспечивают интерфейсы для SQL Server и общие интерфейсы между SQL Server и классами OLE-DB.
    ADO.NET поставляется в виде единственной библиотеки – System.Data.dll. Если необходима поддержка источника данных ODBC, Microsoft предлагает другую библиотеку (ее можно загрузить из интернета) для обеспечения пространства имен классов ODBC.
    Поскольку источником данных, рассматриваемым в примерах данной лекции, является Microsoft Acess 2000, то следует использовать пространство имен OleDb. Если источником данных является SQL Server 2000, то используется пространство имен SqlClient – это наиболее эффективный способ установки связи с SQL Server 2000. Вверху файла showGid.aspx необходимо вместе с остальными директивами пространства имен ввести следующую строку кода:
    using System.Data.OleDb; //for the OleDb classes

    Построение веб-форм

    Отображение информации из базы данных в таблице HTML реализуется с помощью элемента управления веб-формы DataGrid. В представлении Design (Дизайн) выберите DataGrid в инструментарии и вставьте этот элемент в веб-форму. При отображении кода HTML вы имеете дело с представлением формы в HTML. На рисунке 2.3 изображена веб-форма в представлении Design (Дизайн).) После добавления в форму элемента DataGrid его можно переименовать в окне свойств. На рисунке 2.5 мы видим, что элементу DataGrid присвоено имя dgChair.
    Построение веб-форм
    Рис. 2.5.  Окно свойств элемента управления DataGrid
    Запуск веб-формы в Visual Studio .NET на данном этапе вызовет компиляцию веб-формы в библиотеку на сервере разработки. В нашем примере сервер разработки, на котором расположена веб-форма, называется amd1700. Для компиляции веб-формы и запуска ее в режиме отладки в Visual Studio .NET нажмите на клавишу F5. Visual Studio .NET скомпилирует веб-форму и перейдет в режим отладки аналогично тому, как это происходило в предыдущих версиях Visual Studio при запуске исполняемого файла Visual Basic или Visual C++.
    После завершения компиляции на рабочей станции откроется браузер с отображением веб-формы. Сервер разработки выполнит действия, необходимые для отображения веб-страницы, и браузер откроет пустую страницу. При закрытии браузера сеанс отладки завершится, и Visual Studio .NET вернется в режим редактирования. В данном упражнении отображается пустая страница, поскольку элемент DataGrid dgChair не содержит никаких данных. Для отображения элементом DataGrid данных нужно создать в файле Codebehind код, реализующий получение элемента DataSet и размещение данных в элементе управления dgChair.

    Применение элемента управления DataList

    Помимо DataGrid для отображения информации из базы данных используются и другие типы элементов управления данными. Элемент управления DataList применяется для отображения данных в формате, отличном от табличной формы. В листинге 2.11 приведен исходный код файла datalist.aspx.cs, представляющий собой веб-форму, в которой элемент управления DataList заполняется данными с помощью набора ADO.NET Dataset.
    Листинг 2.11. Web Form Featuring the Use of the DataList Control (html, txt)
    DataList использует иной механизм построения DataSet, называемый шаблоном. Шаблон описывает способ отображения данных в элементе управления DalaList. Щелкните правой кнопкой мыши на DataList и выберите любую из опций редактирования шаблона в команде Edit Template (Изменить шаблон) контекстного меню. В шаблоне настраиваются заголовки или имена полей, определяющие отображение данных. В DataList присутствуют также верхние, нижние колонтитулы и названия. Для указания данных из определенного набора DataSet необходимо изменить шаблон в представлении HTML. Теги <%# и %> означают присоединение данных в странице веб-формы. В коде шаблона указываются поля присоединения данных. В листинге 2.12 приведен код файла datalist.aspx, отображаемый в представлении HTML.
    Листинг 2.12. HTML for datalist.aspx Featuring Data Binding Expressions (html, txt)
    DataList определяется элементами HTML . Внутри тегов элемента DataList располагаются теги шаблона, определяемые тегом . Свойства шаблона в дизайнере веб-форм генерируют теги внутри тегов , однако их можно отредактировать вручную в представлении HTML. Теги присоединения данных можно стратегически расположить внутри шаблона в тех местах, где должны отображаться соответствующие поля набора данных DataSet. В листинге 2.12 приведены два поля из отображаемого набора DataSet – ID и Color. Тег присоединения для поля ID имеет вид <%#DataBinder.Eval(Container.DataItem, "ID")%>, а тег присоединения поля Color – <%#DataBinder.Eval(Container.DataItem, "Color")%>.
    При запуске datalist.aspx сгенерирован тот же набор DataSet, как в примере с элементом DataGrid (см. рис. 2.6). Однако формат данных отличается от предыдущего примера (см. рис. 2.7), поскольку данные отформатированы по шаблону, приведенному в листинге 2.12.
    Применение элемента управления DataList
    Рис. 2.7. 

    Листинг 2.11. Web Form Featuring the Use of the DataList Control

    DataList использует иной механизм построения DataSet, называемый шаблоном. Шаблон описывает способ отображения данных в элементе управления DalaList. Щелкните правой кнопкой мыши на DataList и выберите любую из опций редактирования шаблона в команде Edit Template (Изменить шаблон) контекстного меню. В шаблоне настраиваются заголовки или имена полей, определяющие отображение данных. В DataList присутствуют также верхние, нижние колонтитулы и названия. Для указания данных из определенного набора DataSet необходимо изменить шаблон в представлении HTML. Теги <%# и %> означают присоединение данных в странице веб-формы. В коде шаблона указываются поля присоединения данных. В листинге 2.12 приведен код файла datalist.aspx, отображаемый в представлении HTML.

    <%@ Page language="c#" Codebehind="datalist.aspx.cs" AutoEventWireup="false" Inherits="SimpleWF.datalist" %> datalist
    ID:
    <%# DataBinder.Eval(Container.DataItem, "ID")%>
    Color:
    <%# DataBinder.Eval(Container.DataItem, "Color")%>



    Листинг 2.12. HTML for datalist.aspx Featuring Data Binding Expressions

    DataList определяется элементами HTML . Внутри тегов элемента DataList располагаются теги шаблона, определяемые тегом . Свойства шаблона в дизайнере веб-форм генерируют теги внутри тегов , однако их можно отредактировать вручную в представлении HTML. Теги присоединения данных можно стратегически расположить внутри шаблона в тех местах, где должны отображаться соответствующие поля набора данных DataSet. В листинге 2.12 приведены два поля из отображаемого набора DataSet – ID и Color. Тег присоединения для поля ID имеет вид <%#DataBinder.Eval(Container.DataItem, "ID")%>, а тег присоединения поля Color – <%#DataBinder.Eval(Container.DataItem, "Color")%>.

    При запуске datalist.aspx сгенерирован тот же набор DataSet, как в примере с элементом DataGrid (см. рис. 2.6). Однако формат данных отличается от предыдущего примера (см. рис. 2.7), поскольку данные отформатированы по шаблону, приведенному в листинге 2.12.

    Применение элемента управления DataList
    Рис. 2.7. 

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

    Архитектура веб-служб

    Служба ASP.NET состоит из библиотеки DLL, файла ASMX и файла Codebehind, который содержит класс, специально созданный для работы с веб-службами. Файл ASMX аналогичен файлу ASPX веб-формы ASP.NET, через него выполняются запросы веб-служб. В данной лекции мы будет считать веб-службу и класс с интегрированным HTTP-интерфейсом равнозначными. В проект можно добавлять другие классы, при этом не нужно создавать другой файл ASMX, так как классы сами по себе не являются веб-службами. При добавлении класса создается только файл для поддержки кода класса с именем <имя_класса>.cs или <имя класса>.<расширение_языка>.
    В проект веб-службы Visual Studio .NET может входить несколько веб-служб. При компиляции проекта результат записывается в одну библиотеку DLL. Она включает классы нескольких файлов ASMX и дополнений к классам, поддерживающим файлы веб-службы ASMX.
    Файл ASMX связан в IIS с расширением ISAPI aspnet_isapi.dll, поэтому при запросе файла ASMX из IIS aspnet_isapi.dll направляет HTTP-запрос нужной DLL-библиотеке веб-службы (см. рис. 3.1). Файл ASMX связан в один момент времени с одной DLL-библиотекой. Как правило, проекты веб-служб Visual Studio .NET располагают DLL в каталоге двоичных файлов внутри папки с файлами ASMX.
    Веб-службы ASP.NET используют те же файлы конфигурации библиотеки и файлы конфигурации реализации IIS, что и веб-формы ASP.NET. Файлы веб-службы ASP.NET, используемые компилятором для создания веб-службы в библиотеке, именуются <имя_веб-службы>.asmx (в отличие от файлов веб-форм ASP.NET с расширением .aspx). Веб-служба ASP.NET имеет ту же самую архитектуру, равно как и типы файлов, связанные с ней внутри проекта. Например, файл ASMX является адресуемой входной точкой веб-службы и как главный файл предоставляет директивы обработки для компиляции веб-службы. Файл ASMX описывает файлы, предназначенные для веб-службы ASP.NET, и сам может содержать в себе код. Код, связанный с веб-службой ASP.NET, обычно располагается в файле Codebehind. Файл Codebehind <моя_служба>.asmx.cs содержит исходный код веб-службы, а файл <моя_служба>.asmx.resx является источником, обслуживающим файл Codebehind.
    Архитектура веб-служб
    Рис. 3.1.  Обзор архитектуры веб-служб
    Примечание. Файл ASMX может включать код вместо файла Codebehind, однако Visual Studio .NET использует файл Codebehind в шаблоне проекта веб-службы по умолчанию. Если файл ASMX не использует Codebehind, то технология .NET компилирует файл и создает DLL автоматически по первому запросу.

    Безопасность приложения

    Запись данных в журнал событий не требует модификации прав, под которыми работает веб-служба. Новыми возможностями IIS6 являются две встроенные учетные записи для рабочих процессов: Network Service (Сетевая служба) и Local Service (Локальная служба). В предыдущих версиях рабочие процессы для IIS выполнялись под учетной записью Local System (Локальная система). Учетная запись Network Service (Сетевая служба) является учетной записью по умолчанию для выполнения рабочих процессов в IIS. Она более ограничительна по сравнению с Local System (Локальная система), а учетная запись Local Service (Локальная службы) – более ограничительна по сравнению с Network Service (Сетевая служба). Можно создать особую учетную запись для обеспечения определенных требований к безопасности приложения.
    Для настройки приложения на работу под другой учетной записью следует создать новый пул приложения и настроить его на работу под аутентификационными данными учетной записи Local System (Локальная система).
  • Откройте консоль MMC Computer Management (Управление компьютером) с помощью команды Start\Administrative Tools (Пуск\Администрирование).
  • Откройте узел Internet Information Services (IIS) Manager (Диспетчер IIS), затем – узел папки Aplication Pools (Пулы приложения). В дереве, расположенном под папкой Application Pools (Пулы приложений), в виде значков отобразятся все пулы приложения. В списке должен присутствовать пул приложения DefaultAppPool. При его развертывании отобразятся веб-сайты, использующие этот элемент (см. рис. 3.12).
  • Веб-сайт по умолчанию Default Web Site, созданный при установке IIS, использует пул DefaultAppPool. Как видно из рисунка 3.12, сайт Default Web Site присутствует в списке многих веб-приложений, использующих DefaultAppPool. Для настройки пула приложения откройте страницу свойств веб-сайта или виртуального каталога, щелкнув правой кнопкой мыши на узле и выбрав команду Properties (Свойства).
    Безопасность приложения
    увеличить изображение
    Рис. 3.12.  Приложения, использующие DefaultAppPool, отображаются в консоли MMC Computer Management (Управление компьютером)



  • Откройте вкладку Home Directory (Домашний каталог) веб- сайта либо вкладку Virutal Directory (Виртуальный каталог) виртуального каталога. Во вкладке Home Directory (Домашний каталог) поле со списком Application Pool (Пул приложения) отображает доступные пулы приложения (см. рис. 3.13).

    Безопасность приложения
    Рис. 3.13.  Вкладка Home Directory (Домашний каталог) окна свойств веб-сайта по умолчанию

    Веб-служба Events работает в виртуальном каталоге myPortal, расположенном на сайте Default Web Site. Виртуальный каталог myPortal настроен на использование пула DefaultAppPool, работающего под аутентификационными данными учетной записи Network Service (Сетевая служба). Когда веб-служба Events попытается записать данные в журнал событий, произойдет ошибка, так как учетная запись Network Service (Сетевая служба) не имеет соответствующих прав. В предыдущей версии IIS запись в журнал приложений веб-службой Events осуществляется без всяких проблем. Для разрешения проблемы доступа создайте новый пул приложения, использующий учетную запись Local System, и настройте myPortal на работу с новым пулом приложения.

  • Щелкните правой кнопкой мыши на значке Application Pools (Пулы приложений) в консоли Computer Management (Управление компьютером) и выберите New\Aplication Pool (Создать\Пул приложения).
  • В диалоговом окне Add New Application Pool (Создание нового пула приложения) (см. рис. 3.14) видно, что идентификатор ID пула приложения равен значению webservice using LocalSystem. В нашем случае используются параметры по умолчанию нового пула приложения.

    Безопасность приложения
    Рис. 3.14.  Диалоговое окно Add New Application Pool (Создание нового пула приложения)

  • Нажмите на кнопку OK.


  • Ниже приведены шаги по смене объекта пула приложения webservice using LocalSystem.

  • Щелкнув правой кнопкой на вновь созданном узле webservice using LocalSystem в консоли MMC Computer Management (Управление компьютером) в узле Application Pools (Пулы приложения) и выберите пункт Properties (Свойства).
  • В окне свойств откройте вкладку Identity (Объект) и в списке учетных записей Predefined security account (Предопределенные учетные записи безопасности) выберите Local System (Локальная система) (см.


    рис. 3.15).

    Безопасность приложения
    Рис. 3.15.  Настройка учетной записи для пула приложения

  • Нажмите на кнопку OK или на кнопку Apply (Применить). Появится окно с предупреждением об опасностях, связанных с работой пула приложений в учетной записи Local System (Локальная система). Вы можете настроить учетную запись в соответствии с требованиями безопасности, чтобы веб-служба осуществляла запись в журнал событий приложения.


  • После создания пула приложения виртуальный каталог myPortal нужно настроить на использование пула приложения webservice using LocalSystem. Откройте окно свойств для myPortal и во вкладке Directory (Каталог) выберите новый пул приложения (см. рис. 3.16).

    Безопасность приложения
    Рис. 3.16.  Выбор нового пула приложения webservice using LocalSystem для myPortal

    Фиксирование данных о состоянии и ошибок в журнале

    Во всех веб-службах на локальном сервере должны фиксироваться данные о состоянии и ошибках. Довольно часто в веб-проектах не предусматривается адекватная система обработки ошибок или предоставление диагностической информации о том, какие действия выполняются в коде. Если в приложении возникают ошибки, а ошибочное условие нельзя продублировать в среде разработки, то выход из положения – разрешить разработчику доступ к среде разработки для диагностирования и отладки кода. Приложение не должно диагностироваться в среде разработки. Поскольку разработчики могут просматривать сообщения, записанные в журнал приложения, и использовать простые методы записи информации в журнал Application, нет причин для выполнения подобных действий при диагностике ошибки. Разрешение доступа к среде разработки является большой ошибкой приложения, и ее легко избежать, обеспечив надежную систему обработки ошибок и ведение журналов диагностики.

    Класс Data Reader

    С учетом псевдонимов, сгенерированных дизайнером компонентов, можно разработать код, устанавливающий параметры и заполняющий объект DataReader. Например, функция Add веб-службы Events использует экземпляр класса команды InsertEvent для добавления нового события. Псевдонимы имен полей таблицы базы данных, определенные при инициализации класса InsertEvent, используются методом Parameters для присвоения значения полю, представляемому псевдонимом в команде Insert SQL, используемой классом InsertEvent для обновления таблицы базы данных. В листинге 3.7 приведен код функции Add.
    Листинг 3.7. Add Function in Events Web Service (html, txt)
    Экземпляр класса SQLDataReader создан для доступа к данным, возвращаемым из экземпляра класса SQLCommand с именем InsertEvent. Экземпляр InsertEvent установлен в качестве свойства объекта SQLDataAdaptor EventsAdaptor и имеет объект подключения servicesDBConn, поэтому он возвращает данные экземпляру объекта SQLDataReader с именем myEvent. Локальный экземпляр anEvent с именем mEvent используется для хранения текущего состояния события веб-службы Events. В листинге 3.8
    приведен исходный код класса anEvent.
    Листинг 3.8. Source Code for Class anEvent (html, txt)
    Как видно из листинга 3.8, класс anEvent содержит данные, формирующие событие Event. Веб-служба Events считывает и записывает значения события в источник базы данных, поэтому для класса Events объявлен и создан локальный экземпляр anEvent.
    Когда функция Add (см. листинг 3.7) устанавливает параметры для Name, Date и Description, она берет соответствующие значения свойств для экземпляра mEvent класса anEvents. Свойства mEvent устанавливаются в веб-службе Events потребителем или извлекаются из базы данных для Event, загружаемой в веб-службу. После установки параметров команды InsertEvent соединение открывается, команда выполняется и происходит считывание результатов в экземпляре myEvent с помощью команды ExecuteReader объекта SQLCommand InsertEvent. Команда Read объекта SQLDataReader выполняет переход к следующей строке набора данных, представляющей первую строку во вновь открытом наборе данных.
    Если считывание myEvent происходит без перехода к первой строке, в ADO.NET возникает ошибка. Локальный экземпляр anEvent обновляется новым ID, так как база данных генерирует ID для конкретного класса anEvent.

    Многие программисты, знакомые с версиями ADO, предшествовавшими технологии ADO.NET, удивятся тому, как используется порядковая позиция поля ID, на которую ссылаются для получения значения ID экземпляра mEvent. Порядковое значение любого поля не должно использоваться для обращения к значению в наборе записей. SQLDataReader похож на набор записей ADO. Если таблица базы данных обновляется с добавлением нового столбца, то набор записей ADO может записать неправильное значение поля. Это зависит от того, в каком месте таблицы добавлен новый столбец. Однако в технологии ADO.NET этой проблемы не существует, так как порядковая позиция определяется в терминах экземпляра адаптера данных. Адаптер данных обеспечивает определенный уровень абстрагирования от уровня данных, поэтому программист может обращаться к порядковой позиции, не опасаясь, что изменения в таблице базы данных повредят программное обеспечение.

    Компонент Data Adaptor

    После установки подключения веб-служба узнает источник данных и аутентификационные данные, необходимые для предоставления этому источнику. Далее веб-служба отправляет запрос источнику данных на получение данных. ADO.NET предлагает для этого еще один компонент – адаптер данных (data adaptor). Версия адаптера данных для SQL Server 2000 использует провайдер SQL Server .NET с именем SQLDataAdaptor. OledbDataAdaptor (версия для OLE-DB) работает с предыдущими версиями SQL Server или базами данных, не имеющих конкретного провайдера. Адаптер данных можно установить, настроить и применить, как и любой другой класс в ADO.NET. ASP.NET содержит в инструментарии альтернативный компонент, который можно использовать в случае необходимости. Адаптер данных добавляется в дизайнере компонентов веб-службы и настраивается в окне свойств.
    При добавлении компонента открывается окно мастера настройки адаптера данных (Data Adaptor Configuration Wizard). Это окно при желании можно закрыть, а свойства настроить вручную.
    Ниже приведены инструкции по работе с мастером настройки адаптера данных.
  • В стартовом окне нажмите на кнопку Next (Далее), чтобы начать настройку адаптера данных, добавленного в веб-службу.
  • В окне Choose Your Data Connection (Выбор подключения к данным) (см. рис. 3.8) в ниспадающем списке выберите подключение к данным, настроенное для проекта. При нажатии на кнопку New Connection (Создать подключение) откроется окно Data Link Properties (Свойства подключения к данным) (см. рис. 3.5) для настройки соединения. В нашем примере выберите ранее созданное подключение.
    Компонент Data Adaptor
    Рис. 3.8.  Мастер настройки адаптера данных: выбор подключения к данным

  • После выбора подключения нажмите на кнопку Next (Далее), и мастер предложит выбрать метод запроса данных из источника в окне Choose A Query Type (Выбор тип запроса) (см. рис. 3.9).
    Компонент Data Adaptor
    Рис. 3.9.  Мастер настройки адаптера данных: выбор типа запроса
    Выберите Use SQL Statements (Использовать операторы SQL), и мастер сгенерирует набор командных объектов (с помощью класса SQLCommand или OledbCommand) в функции InitializeComponent класса веб-службы.
    Командные объекты будут созданы с набором SQL-команд, которые используют псевдонимы каждого имени поля. С помощью ссылки на псевдоним в экземпляре командного объекта можно установить значения рассматриваемого поля.

    Выберите Create New Stored Procedures (Создать новые сохраненные процедуры) или Use Existing Stored Procedures (Использовать имеющиеся сохраненные процедуры), и мастер запросит дополнительную информацию о таблицах данных, необходимую для построения и связи сохраненных процедур.

  • В нашем примере выберите опцию Use SQL Statements.
  • Нажмите на кнопку Next (Далее) для перехода в окно Generate The SQL Statements (Генерация выражений SQL). Введите команду Select SQL для набора данных, используемых адаптером при построении выражений SQL (см. рис. 3.10). SQLDataAdaptor и OledbDataAdaptor поддерживают интерфейс для выполнения операторов Select (Выбор), Insert (Вставка), Delete (Удаление) и Update (Обновление). Мастер генерирует команды SQL для управления данными, устанавливаемыми в адаптере данных. Он запрашивает выражение SQL Select для создания текста команд Select, Insert, Delete и Update.

    Компонент Data Adaptor
    Рис. 3.10.  Мастер настройки адаптера данных: генерация выражений SQL

  • После ввода в поле оператора Select теста select * from tblEvents

    нажмите на кнопку Next (Далее), чтобы отобразить окно подтверждения View Wizard Results (Просмотр результатов работы мастера) (см. рис. 3.11). В этом окне описываются действия, выполненные с кодом веб-службы. При возникновении проблем с анализом выражения SQL, введенного в предыдущем шаге, в этом окне вы не увидите все возможные комментарии SQL, показанные на рис. 3.11. Нажмите на кнопку Back (Назад) и повторите введенную команду SQL или выберите создание сохраненных процедур на сервере базы данных.


  • Компонент Data Adaptor
    Рис. 3.11.  Мастер настройки адаптера данных: просмотр результатов работы

    В нашем примере адаптер данных называется SQLDataAdaptor1, так как дизайнер компонентов присваивает это имя по умолчанию любому компоненту SQLDataAdaptor, добавляемому в представлении Design (Дизайн).


    Это имя можно изменить в любой момент, и сгенерированный мастером код в подпрограмме InitializeComponent веб-службы автоматически обновится. В нашем примере имя SQLDataAdaptor изменено на EventsAdaptor в окне свойств.

    Объектам SQLCommand, сгенерированным мастером настройки адаптера данных, присвоены имена SQLSelectCommand1, SQLDeleteCommand1, SQLInsertCommand1 и SQLUpdateCommand1. Имена командных объектов заменены на SelectEvent, DeleteEvent, InsertEvent и UpdateEvent соответственно. Это было сделано в окне свойств SQLDataAdaptor, т.е. изменено свойство имени, подчиненное динамическим свойствам Dynamic Properties каждого командного объекта. В листинге 3.5 приведен код, сгенерированный дизайнером компонентов для адаптера данных EventsAdaptor и объекта подключения к данным ServicesDBConn.

    Листинг 3.5. Initialization Code Generated by the VS Designer for a Data Adaptor and a Data Connection (html, txt)

    В листинге 3.5 приведена часть подпрограммы InitializeComponent, демонстрирующая компоненты SQLCommand, созданные дизайнером компонентов после переименования. После создания класса AppSettingsReader для получения параметров приложения из файла web.config созданы классы подключения, адаптера данных и команд. После инициализации класса подключения посредством строки подключения, полученной из файла web.config, класс адаптера данных присваивает каждый экземпляр объекта SQLCommand соответствующему свойству команды. Например, экземпляр команды DeleteEvent присваивается свойству DeleteCommand экземпляра SQLDataAdaptor с именем EventsAdaptor.

    Дизайнер компонентов сгенерировал достаточно большой объем кода для настройки текста команд SQL и параметров каждого экземпляра командных объектов (это не отражено в листинге 3.5). Он определил каждое поле в наборе данных посредством псевдонима. Псевдонимы в командном объекте были установлены в качестве параметров. В листинге 3.6 приведен исходный код, реализующий текст команды SQL и параметры командного объекта InsertEvent.

    Листинг 3.6.Initialization Code Generated by the VS Designer for a InsertEvent SQLCommand Object in Subroutine InitializeComponent(); (html, txt)


    После инициализации класса подключения посредством строки подключения, полученной из файла web.config, класс адаптера данных присваивает каждый экземпляр объекта SQLCommand соответствующему свойству команды. Например, экземпляр команды DeleteEvent присваивается свойству DeleteCommand экземпляра SQLDataAdaptor с именем EventsAdaptor.

    Дизайнер компонентов сгенерировал достаточно большой объем кода для настройки текста команд SQL и параметров каждого экземпляра командных объектов (это не отражено в листинге 3.5). Он определил каждое поле в наборе данных посредством псевдонима. Псевдонимы в командном объекте были установлены в качестве параметров. В листинге 3.6 приведен исходный код, реализующий текст команды SQL и параметры командного объекта InsertEvent.

    // // InsertEvent // this.InsertEvent.CommandText = "INSERT INTO tblEvent" + "(Name, StartDate, Description) " + "VALUES (@Name, @StartDate, @Description); "+ "SELECT Name, StartDate, Description, ID " + "FROM tblEvent WHERE (ID = @@IDENTITY)";

    this.InsertEvent.Connection = this.ServicesDBConn;

    this.InsertEvent.Parameters.Add( new System.Data.SqlClient.SqlParameter ("@Name", System.Data.SqlDbType.VarChar, 50, "Name"));

    this.InsertEvent.Parameters.Add( new System.Data.SqlClient.SqlParameter ("@StartDate", System.Data.SqlDbType.DateTime, 8, "StartDate"));

    this.InsertEvent.Parameters.Add( new System.Data.SqlClient.SqlParameter ("@Description", System.Data.SqlDbType.VarChar, 200, "Description"));

    Листинг 3.6. Initialization Code Generated by the VS Designer for a InsertEvent SQLCommand Object in Subroutine InitializeComponent();

    Компонент Event Log

    Весь код взаимодействия с базой данных в листинге 3.7 расположен в секции Try блока Try .. Catch. Если удовлетворяется условие исключения, то выполняется блок Catch. Экземпляр класса System.Exception передается в качестве аргумента функции Catch и содержит информацию об ошибке, возникшей в блоке Try. В листинге 3.7 экземпляр класса System.Exception упорядочен в строку с помощью функции ToString. Функция ToString представляет собой общую функцию, используемую со многими классами, так как она унаследована из класса object. Строковое представление сообщения об ошибке передается функции LogMessage, которая записывает ошибку в журнал Application Log в программе Event Viewer (Просмотр событий), после чего ошибка передается приложению-потребителю.
    Функция LogMessage реализована таким образом, что в журнал Application несущего сервера можно записать любую информацию. Журнал Application поддерживает способ идентификации типа записываемого сообщения. Функция LogMessage записывает сообщения типа error или information в зависимости от переданного значения параметра Error. Если значение параметра Error равняется "истине", LogMessage идентифицирует сообщение в журнале Application как error (ошибка); в противном случае сообщение определяется как information (сведения). В листинге 3.9 приведен код функции LogMessage.
    Листинг 3.9. LogMessage Function of the Events Class (html, txt)
    Экземпляр объекта Log является журналом приложения несущего сервера. Дизайнер компонентов содержит компонент, представляющий журнал несущего сервера в программе Event Viewer (Просмотр событий). Просто вставьте элемент управления в представлении Design (Дизайн) веб-службы, после чего настройте свойства журнала на том узле, куда будут передаваться сообщения. В данном случае подходит журнал Application (Приложение), так как он фиксирует информацию о приложении.

    Настройка компонента подключения к базе данных

    Источником данных для веб-службы Events является база данных SQL Server 2000, поэтому добавим компонент SQLConnection. При поддержке другого типа базы данных используется компонент OleDBConnection. Компонент SQLConnection дает дополнительные возможности по управлению и повышает эффективности работы, в отличие от компонента OleDBConnection, поэтому последний используется только в случае необходимости. Если для источника данных отсутствует провайдер OLE-DB, то загрузите с сайта Microsoft доступен провайдер ODBC, поставляемый в отдельной библиотеке.
    Свойство ConnectionString в окне свойств позволяет выбрать предыдущие подключения, настроенные на рабочей станции, или создать новое подключение. Для нашего примера создадим новое подключение (см. рис. 3.4).
    Настройка компонента подключения к базе данных
    увеличить изображение
    Рис. 3.4.  Выбор нового подключения в свойстве ConnectionString компонента SQLConnection
    После выбора в качестве параметра свойства ConnectionString откроется окно Data Link Properties (Свойства подключения к данным). В этом окне настраиваются все параметры, представленные в строке подключения ADO.NET. Окно свойств подключения к данным – это общее окно Visual Studio для настройки подключения ADO. Для веб-службы Events используется сервер базы данных, расположенный на сервере AMD1700, и база данных ASPNETServices (см. рис. 3.5).
    Настройка компонента подключения к базе данных
    Рис. 3.5.  Настройка нового подключения к данным для веб-службы Events
    Изменим имя компонента по умолчанию SQLConnection1 на более дружественное пользователю ServicesDBConn. После настройки и создания подключение SQLConnection работает в любом месте веб-службы. Класс Events наследуется из System.Web.Services. Класс WebService содержит множество классов и функций для взаимодействия с HTTP-соединением. В листинге 3.2 приведен исходный код, сгенерированный Visual Studio .NET для класса Events.
    Листинг 3.2. Source Code of Class Events after SQLConnection Component Added and Configured (html, txt)
    При работе с элементами управления веб-службы использование дизайнера компонентов не обязательно. Элементы управления добавляются в веб-службу посредством объявления и конструирования в файле Codebehind, как и другие переменные и классы. Например, экземпляр объекта SQLConnection можно создать и инициализировать в конструкторе класса Events. Код, приведенный в листинге 3.3, демонстрирует создание локального экземпляра объекта SQLConnection без использования дизайнера компонентов и компонента SQLConnection.
    Листинг 3.3. Using SQLConnection Object without the Designer and Obtaining Connection String from the web.config File (html, txt)
    В листинге 3.3 экземпляр myConn объявляется локально по отношению к классу Events. Строка подключения извлекается из файла web.config и используется в качестве конструктора экземпляра myConn. После создания экземпляра myConn в конструкторе Events его можно использовать в любом месте класса.

    private System.Data.SqlClient.SqlConnection ServicesDBConn;

    #region Component Designer generated code

    // Required by the Web Services Designer private IContainer components = null;

    /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.ServicesDBConn = new System.Data.SqlClient.SqlConnection(); // // ServicesDBConn // this.ServicesDBConn.ConnectionString = "data source=amd1700;initial catalog=ASPNETServices;" + "integrated security=SSPI;persist security info=False;" + "workstation id=AMD1700;packet size=4096";

    }

    /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if(disposing && components != null) { components.Dispose(); } base.Dispose(disposing); }

    #endregion }

    Листинг 3.2. Source Code of Class Events after SQLConnection Component Added and Configured

    При работе с элементами управления веб-службы использование дизайнера компонентов не обязательно. Элементы управления добавляются в веб-службу посредством объявления и конструирования в файле Codebehind, как и другие переменные и классы. Например, экземпляр объекта SQLConnection можно создать и инициализировать в конструкторе класса Events. Код, приведенный в листинге 3.3, демонстрирует создание локального экземпляра объекта SQLConnection без использования дизайнера компонентов и компонента SQLConnection.

    public class Events : System.Web.Services.WebService { //locals to class private System.Data.SqlClient.SqlConnection myConn;

    public Events() { //CODEGEN: This call is required by the //ASP.NET Web Services Designer InitializeComponent();

    System.Configuration.AppSettingsReader myAppSettings = new System.Configuration.AppSettingsReader();

    //get the connection string from web.config string sConnect = ((string) (myAppSettings.GetValue ("ProductionDB.ConnectionString", typeof(string))));

    Работа с дизайнером компонентов

    Инструментарий предоставляет множество компонентов для добавления в веб-службу. Некоторые из них доступны как в веб-формах, так и в веб-службах, однако в проекте веб-службы недоступны компоненты, предназначенные для создания графического интерфейса для пользователя. Добавление компонентов веб-службы в представлении Design (Дизайн) не влияет на файл Events.asmx. ASMX аналогичен файлу веб-формы ASPX, так как связывает язык, класс, файл Codebehind и файл источника с веб-службой. Отличие заключается в том, что ASMX не содержит другой информации, предназначенной для отображения.
    Содержимое файла Events.asmx приведено в листинге 3.1. Если бы этот код предназначался для веб-формы, он содержал бы больший объем кода XML и HTML, определяющего параметры отображения; но он предназначен для веб-службы и содержит лишь одну строку текста.
    <%@ WebService Language="c#" Codebehind="Events.asmx.cs" Class="myPortal.Events" %>
    Листинг 3.1. Source Code of Web Service Events - File Events.asmx (html, txt)
    При добавлении компонента подключения (или любого другого) в представление Design (Дизайн) в окне свойств настраиваются параметры этого компонента. Для каждого значения, устанавливаемого в этом окне, дизайнер компонентов генерирует код инициализации в файле Codebehind веб-службы и определяет предпроцессорную команду. Предпроцессорные команды в C# аналогичны командам в C++ и C, отличие же заключается в следующем.
  • Предпроцессорные команды языка C# не интерпретируются предпроцессором, отдельным от компилятора. Компилятор и предпроцессор представляют единое целое.
  • Команды предпроцессора C# не могут указывать макросы.

  • Команда #region указывает область, расширяемую или сужаемую в редакторе Visual Studio .NET. Команда #region не оказывает функционального влияния на программное решение.
    В коде, сгенерированном дизайнером компонентов, Visual Studio. NET объявляет три элемента:
  • ссылку на Icontainer с именем components;
  • подпрограмму InitializeComponent;
  • функцию Dispose.

  • Все компоненты, добавленные в представлении Design (Дизайн), инициализируются в подпрограмме InitializeComponent. Вызов подпрограммы InitializeComponent автоматически размещается в конструкторе веб-службы. Все свойства, устанавливаемые в окне свойств (см. рис. 3.3), присваиваются компоненту, которому они принадлежат. Комментарии, размещаемые дизайнером компонентов в данной области, предупреждают о том, что не следует изменять код вручную. Область кода, сгенерированного дизайнером компонентов, отображается в виде секции, взаимодействующей с представлением Design (Дизайн) веб-службы.
    Экземпляр компонента IContainer используется функцией Dispose. Он содержит ссылки на все экземпляры компонентов внутри веб-службы. Метод Dispose предназначен для освобождения любых ресурсов, заявленных контейнером веб-служб.

    Считывание параметров приложения из web.config

    Файл web.config великолепно подходит для получения инициализационных данных, индивидуальных для веб-приложения. Это позволяет создавать решение программно, чтобы получить аргументы, связанных с конкретной реализацией, без внесения изменений в код других реализаций. С помощью класса AppSettingsReader осуществляется считывание данных из секции файла web.config. В листинге 3.4 приведен файл web.config, содержащий строку подключения к базе данных, полученную в листинге 3.3 в конструкторе Events.
    Листинг 3.4. web.config File With Element That Contains Database Connection String (html, txt)
    Дизайнер компонентов содержит механизм, использующий элемент appSettings файла web.config. В окне свойств компонента подключения в представлении Design (Дизайн) рассматриваемой веб-службы можно настроить параметр ConnectionString как набор динамических свойств DynamicProperties (см. рис.3.6).
    Считывание параметров приложения из web.config
    Рис. 3.6.  Свойства компонента подключения, использующие DynamicProperties для получения строки подключения ConnectionString
    По умолчанию свойство ConnectionString не настроено на использование DynamicProperties. Каждое свойство нужно связать с ключом в файле web.config. Ключ представляет собой атрибут с именем key, расположенный в элементе add, подчиненном элементу appSettings (см. рис. 3.4). При нажатии на кнопку "..." в свойстве ConnectionString откроется диалоговое окно для выбора ключа (см. рис. 3.7).
    Считывание параметров приложения из web.config
    Рис. 3.7.  Связывание свойства ConnectionString с ключом в файле конфигурации

    Создание тестовой структуры

    Текущее значение, открытое в методе Open, сохраняется в свойстве Event класса Events. Класс Events предназначен для вызова методов Open или Add и возврата значения, определяющего успех или неудачу вызова. В случае удачного выполнения вызова из свойства Event можно получить данные Event.
    Тестовая структура, предоставляемая технологией .NET, не отображает значения в свойстве веб-службы, и свойство нельзя определить как веб-метод с помощью идентификатора [WebMethod]. Идентификатор WebMethod располагается над всеми общими методами, представляемыми в качестве веб-служб XML. В данном случае нужна тестовая структура, использующая веб-службу и отображающая результаты таким образом, чтобы показать правильное функционирование кода.
    Прекрасным механизмом для реализации тестовой структуры веб-службы являются веб-формы. Для метода Add класса Events была создана форма EventClient.aspx, реализующая добавление события. В веб-форму был добавлен элемент управления датой для фиксирования даты от конечного пользователя, и два текстовых поля для имени и описания события. Для отображения результирующего ID нового события после успешного выполнения функции Add в форму добавлено текстовое поле, отображающее ID, и кнопка Submit (Отправить), после нажатия на которую веб-форма выдает ответ. На рисунке 3.20 показан метод Add элемента управления датой после добавления события.
    Создание тестовой структуры
    Рис. 3.20.  Тестовая структура веб-формы с методом Add
    Код веб-формы EventClient.aspx, приведенный в листинге 3.10, несложен. Как видно из рисунка 3.20, для каждого свойства класса anEvent в форме присутствует элемент управления. Кнопка Submit используется для инициализации вызова события Add. Код веб-формы EventClient.aspx содержит событие нажатия на кнопку элемента управления btnAdd. Веб-форма EventClient.aspx должна выполняться в том же веб-приложении, что и веб-служба. Ее назначением является только модульное тестирование кода, поэтому форма максимально упрощена; она реально обеспечивает разработчика обратной связью, информирующей о производительности веб-службы Events.

    Листинг 3.10. Source Code for Events Add Function Test Harness - Web Form EventClient.aspx (html, txt)

    Дизайнер компонентов автоматически добавил событие Click при двойном щелчке мышью на элементе управления btnAdd. В начале события Click созданы экземпляры класса anEvent и веб-службы Events. Так как эти классы находятся в едином пространстве имен, не нужно обращаться к пространству имен или размещать директиву using вверху исходного кода для пространства имен myPortal. Добавляемое событие представляется экземпляром anEvent с именем myEvent. Экземпляр класса Events называется myEvents. Свойства myEvent извлекаются из календарных элементов управления txtDescription и txtName. При заполнении пользователем экземпляра myEvent данными оно располагается в свойстве event экземпляра myEvents. Вызывается функция Add класса myEvents, и при ее успешной работе в элемент управления lblFeedback записывается сообщение об успехе функции; в противном случае – сообщение об ошибке.

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

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

    Создание веб-службы с помощью Visual Studio .NET

    Для демонстрации процесса создания веб-службы в данной лекции представлено простое приложение для составления расписания по датам. Рассматриваемая система расписания состоит из трех следующих классов.
  • anEvent. Класс представляет событие, происходящее в данный момент времени и день.
  • Events. Класс представляет коллективную группу экземпляров класса anEvent.
  • EventClient. Веб-форма, использующая экземпляры Events и anEvent.

  • Класс Events является веб-службой, класс anEvent – классом, используемым веб-службой Events, а класс EventClient – веб-формой, использующей классы anEvent и Events. Все классы располагаются в едином пространстве имен myPortal. В результате компиляции проекта создается библиотека myPortal.dll. Файл Events.asmx указывает на класс в библиотеке myPortal.dll. Библиотека myPortal.dll также содержит класс веб-формы EventClient и класс anEvent. Файл EventClient.aspx направляет технологию .NET в myPortal.dll как в скомпилированный код, содержащий соответствующий класс.
    Создадим новый проект веб-службы ASP.NET.
  • Откройте Visual Studio .NET. Отобразится начальная страница (если в Visual Studio .NET не отключено отображение начального окна). Как и в предыдущих версиях Visual Basic, предоставляется окно с шаблоном по умолчанию (вы можете его отключить).
  • Выберите File\New Project (Файл\Создать проект) для открытия окна со списком типов проектов и соответствующих шаблонов.
  • В списке слева выберите узел Visual C# Projects (Проекты Visual C#) – справа отобразятся шаблоны проектов для языка C#.
  • Выберите шаблон ASP.NET Web Service (Веб-служба ASP.NET).
  • Новой веб-службе в любом проекте по умолчанию присваивается имя Service1. В нашем примере проект называется myPortal (см. рис. 3.2). Задайте путь к корневому веб-каталогу сервера при помощи адреса URL или UNC. В URL указывается имя сервера по умолчанию localhost, если разрабатываемое программное решение располагается на рабочей станции при написании кода и модульном тестировании.
  • Нажмите на кнопку OK.

  • Visual Studio .NET выполнит подключение к веб-серверу, указанному в диалоговом окне New Project (Новый проект), создаст новый виртуальный каталог и скопирует в него файлы веб-служб по умолчанию.

    После генерации файлов проекта отобразится представление Design (Дизайн) веб-службы Service1, готовое к разработке. Visual Studio .NET присваивает веб-файлам веб-службы имена по умолчанию, поэтому их нужно переименовать.

  • Откройте Solution Explorer в меню View\Solution Explorer (Вид\Диспетчер программы).
  • Щелкните правой кнопкой мыши на файле Service1.asmx и выберите Rename (Переименовать).
  • Удалите имя Service1 и введите имя Events.
  • Нажмите на клавишу Enter, и имена файлов ASMX, Codebehind и файла разрешения сменятся на Events.asmx, Events.asmx.cs и Events.asmx.res соответственно.


  • Класс, обеспечивающий работу веб-службы, будет по-прежнему называться Service1. Веб-служба исправно функционирует с различными именами, но мы все-таки сменим имя класса, присвоив ему имя службы.

  • Выделите файл Events.asmx в диспетчере Solution Explorer и нажмите на кнопку View Designer (Отобразить дизайнер). Файл Events.asmx.cs отобразится в дизайнере компонентов).
  • Щелкните правой кнопкой мыши на файле Events.asmx.cs и выберите Properties (Свойства).
  • В открывшемся окне свойство Name (Имя) содержит значение Service1. Удалите это значение.
  • Введите в свойстве имени значение Events. Дизайнер компонентов автоматически изменит каждый экземпляр имени класса в файле Codebehind.


  • Веб-служба Events выполняет добавление, открытие или удаление экземпляров класса anEvent из портала. Данные экземпляра anEvent сохраняются в базе данных.

    Создание веб-службы с помощью Visual Studio .NET
    Рис. 3.2.  Новый проект myPortal, создаваемый в диалоговом окне New Project (Новый проект)

    Класс Events взаимодействует с базой данных, поэтому при построении веб-службы мы используем компоненты инструментария, реализующие получение и отправку (см. рис. 3.3). Компоненты добавятся в представление Design (Дизайн) веб-службы Events.

    Создание веб-службы с помощью Visual Studio .NET
    увеличить изображение
    Рис. 3.3.  Компоненты дизайнера форм, добавленные в представлении Design (Дизайн) веб-службы Events

    Тестирование веб-службы

    Помимо метода Add (см. листинг 3.7) и функции LogMessage (см. листинг 3.9) служба Events содержит три общих веб-метода: Delete, Open и HelloWorld. Методы Delete и Open аналогичны функции Add, т.е. выполняют чтение и запись отправляемых пользователем данных. HelloWorld является методом по умолчанию, размещаемым дизайнером компонентов во всех новых веб-службах для демонстрации создания метода, доступного из интернета.
    Если файл ASMX веб-службы установлен в качестве стартового файла, веб-службу можно запускать и отлаживать в Visual Studio .NET. Нажмите на клавишу F5 для запуска компилятора; при отсутствии ошибок откроется браузер с отображением тестовой структуры технологии .NET (см. рис. 3.17).
    Щелкните на любом из вызовов метода для открытия новой страницы, отображающей форму записи данных на базе параметров метода. Для описываемого метода под полями записи данных определены и описаны запрос и ответ HTTP и SOAP.
    Тестирование веб-службы
    Рис. 3.17.  Запрос веб-службы с помощью браузера
    Данные, расположенные в текстовых полях на странице тестирования, будут переданы в качестве аргументов параметров метода после нажатия на кнопку Invoke (Запросить). На рисунке 3.18 показана страница тестирования метода Open в браузере.
    Тестирование веб-службы
    Рис. 3.18.  Метод Open веб-службы Events, запрошенный в браузере
    Присвойте ID значение 13 и нажмите на кнопку Invoke (Запросить), в результате чего откроется другое окно браузера с результатом вызова метода Open в формате XML. Метод Open возвращает значение "истина" или "ложь" в случае успеха или неудачи (соответственно) выполняемой функции, поэтому такой ответ неинформативен. Он не позволяет выяснить, правильно ли веб-служба открыла запись; но обратная связь показывает, что веб-служба считает свои действия правильными, так как возвращается значение "истина" (см. рис. 3.19). Нам желательно увидеть данные, извлекаемые из источника данных, поэтому тестовая структура технологии .NET не подходит для модульного тестирования рассматриваемой службы.
    Тестирование веб-службы
    Рис. 3.19.  Ответ метода Open в браузере

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

    DLL-библиотека обработки запросов

    DLL-библиотека обработки запросов, создаваемая мастером проекта сервера ATL, реализуется таким образом, что разработчик изменяет код в файле заголовка, имя которого отражает имя проекта. Прототип класса с именем C<имя_проекта>Handler находится в файле заголовка. В проекте NewSimpleATLServer классу присвоено имя CNewSimpleATLServerHandler. В следующем листинге файла NewSimpleATLServer.h этот класс выполняет роль шлюза между классами, представляющими создаваемое программное обеспечение для интернета, и файлами SRF. Весь код можно разместить в классе обработки, однако это сделает его сложным для чтения и работы. Наилучшей стратегией в данном случае является использование данного класса для поддержки атрибутов тегов замещения файла SRF и для построения классов системы согласно структуре программы.
    Листинг 4.5.
    (html, txt)
    Класс 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.

    DLL-библиотека обработки запросов
    Рис. 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 соответственно.

    DLL-библиотека обработки запросов
    Рис. 4.13.  Результат выполнения проекта NewSompleATLServer после ввода пользователем информации

    Файлы ответа сервера

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

    Обзор архитектуры 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.
    Обзор архитектуры 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 (Домашний каталог) или Virtuel Directory (Виртуальный каталог) соответственно.


    Откроется апплет Application Configuration (Настройка приложения) (см. рис. 4.2).
  • Свяжите файл и путь к нужной DLL- библиотеке расширения ISAPI на сайте. После этого IIS необходимо перезапустить.


  • Обзор архитектуры ATL Server
    Рис. 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

    Вкладка Developer Support Options (Опции поддержки разработчика) мастера проекта сервера ATL содержит три опции (см. рис.4.10).
    Опции поддержки разработчика в мастере проекта сервера ATL
    Рис. 4.10.  Параметры поддержки разработчика в мастере проекта сервера ATL
  • Generate TODO Comments (Генерировать комментарии TODO). Добавляет в код комментарии, сообщающие разработчику о том, что необходимо сделать в рассматриваемой секции.
    Примечание. Комментарии TODO – это инструкции о назначении рассматриваемого фрагмента кода, размещаемые в программе.
  • Attributed Code (Код с атрибутами). Обеспечивает поддержку тегов атрибутов для указания вызовов функции.
  • Custom Assert And Trace Handling Support (Поддержка особых опций отладки). Обеспечивает наличие глобально доступного экземпляра класса CDebugReportHook для фиксирования информации из макроса отладки ATL.

  • Опция Attributed Code (Код с атрибутами) размещает в DLL-библиотеке обработчика запросов уже знакомые нам обработчики тегов для связывания тегов, используемых в SRF-файлах, с ее функциями. В качестве примера рассмотрим демонстрационный метод hello world с кодом с атрибутами:
    [ tag_name("Hello") ] HTTP_CODE OnHello(void) { m_HttpResponse << "Hello World!"; return HTTP_SUCCESS; }
    Код без атрибутов поддерживает имена обработчиков тегов в SRF, связываемые с рассматриваемой функцией. Он используется макрос REPLACEMENT_METHOD_ENTRY для привязки имени тега к имени функции. Отказ от использования атрибутов предпочтителен при решении задачи о присвоении обработчиков тегов функциям в проектах с большим объемом кода. DLL-библиотека обработчика запросов не содержит путаницы тегов, присущей синтаксису тегов в виде скобок; все функции с тегами определяются в одном месте. В следующем листинге приведен фрагмент кода, использующий для функции OnHello обработчики тегов без атрибутов:
    // TODO: Add additional tags to the replacement method map BEGIN_REPLACEMENT_METHOD_MAP(CNonAttributedCodeHandler) REPLACEMENT_METHOD_ENTRY("Hello", OnHello) END_REPLACEMENT_METHOD_MAP()

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

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

    return HTTP_SUCCESS; }

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

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

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

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

    Параметры приложения обычно базируются на особенностях выбранного шаблона проекта (см. рис. 4.9). При создании веб-службы с помощью ATL Server следует отметить опцию Create As Web Service (Создать как веб-службу). Она исключает использование прочих опций вкладки Application Options (Опции приложения). При создании проекта ATL Serverа доступ к этим опциям открыт. Если опция Stencil Processing Support (Поддержка обработки шаблона) не включена, то недоступны два элемента, подчиненные опциям в секции начального файла ответа сервера.
    Параметры приложения в мастере проекта сервера ATL
    Рис. 4.9.  Вкладка Application Options (Параметры приложения) в мастере проекта сервера ATL
    Опция Validation Support (Поддержка подтверждения) обеспечивает функцию ValidateAndExchange в файле заголовка класса обработчика. В других мастерах инициализационный код вставляется в функцию ValidateAndExchange. Эта функция является членом базового класса CRequestHandlerT, предназначенного для замены особым кодом инициализации и подтверждения, связанным с библиотекой DLL веб-приложения. DLL веб-приложения наследуется из класса CRequestHandlerT, и поэтому библиотека DLL веб-приложения также называется DLL-библиотекой обработчика запросов (см. рис. 4.1). CRequestHandlerT осуществляет HTTP-взаимодействия между DLL-библиотекой обработчика запросов и ISAPI, обеспечивая определенный уровень абстракции для ISAPI. Среди прочих возможностей этой библиотеки, наследуемой из класса CRequestHandlerT, можно выделить экземпляры классов m_HttpResponse и m_HttpRequest. Эти классы дают разработчику механизмы чтения и записи запроса или ответа HTTP.
    Опция Stencil Processing Support (Поддержка обработки шаблона) добавляет в код демонстрационную функцию hello world и демонстрационный обработчик этой функции. Доступ к области Options For The Initial Server Response File (Опции начального файла ответа сервера) открывается при включении опции Stencil Processing Support (Поддержка обработки шаблона) и позволяет изменять настройки начального файла SRF, сгенерированном мастером.

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

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

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

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

    Во вкладке Server Options (Параметры сервера) мастера проекта сервера ATL (см. рис. 4.8) устанавливается поддержка дополнительной интеграции со службами узла сервера и управление сеансами. Следует отметить, что сеанс может записываться в источник данных, имеющий провайдера OLE-DB. Это относится к разработке веб-кластера, когда требуется размещение данных сеанса внутри источника данных, если другие серверы, участвующие в поддержке веб-решения, должны иметь доступ к сеансу.
    Параметры сервера в мастере проекта сервера ATL
    Рис. 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 m_spFileCache;
    // Blob cache support // CComPtr m_spBlobCache;
    // Data Source cache support // CComPtr m_spBrowserCaps;
    Примечание. В приведенном коде указатель Browser Capabilities Support (Поддержка возможностей браузера) неправильно определен в комментарии как поддержка кэша источника данных, что привело к незначительной ошибке в шаблоне мастера проекта сервера ATL.
    При использовании указателей на File Cache (Кэш файлов), Blob Cache (Кэш памяти) и Browser Capabilities Support (Поддержка возможностей браузера) с каждого из них нужно снять статус комментария. Указатели инициализируются в общей функции ValidateAndExchange. Она включается в каждый класс обработчика, генерируемый мастером проекта сервера ATL, если отмечена опция Validation Support (Поддержка подтверждения) во вкладке Application Options (Параметры приложения) (см. следующий раздел). С фрагментов кода, отвечающих за инициализацию соответствующего указателя, также нужно снять статус комментария.
    Листинг 4.1.
    (html, txt)
    В ассоциированное расширение ISAPI следует добавить код для поддержки элементов, выбранных во вкладке Server Options (Параметры сервера) мастера. В отличие от кода класса обработчиков код поддержки в расширении ISAPI не является закомментированным, он входит в программное решение независимо от того, используется он или нет. Не включайте поддержку функциональности – это позволит сократить количество ресурсов.
    Поддержка файлового кэширования добавляет указатель класса для поддержки функций управления указателями файлов, относящихся к чтению и записи файлов.


    Если указатель на указатель класса 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 указано следующее:
    Листинг 4.2.
    (html, txt)
    Опция Resource Language (Язык источника) во вкладке Server Options (Параметры сервера) обеспечивает поддержку использования других языков для генерирования текста копии в файлах источников проекта. Необходимо установить Visual Studio .NET с поддержкой языков для нужного ресурса, чтобы открыть доступ к этой опции.


    // Get the IBrowserCapsSvc service from the ISAPI extension // if (FAILED (m_spServiceProvider->QueryService // (__uuidof(IBrowserCapsSvc), // &m_spBrowserCaps))) // return HTTP_FAIL;
    return HTTP_SUCCESS; }
    Листинг 4.1.
    В ассоциированное расширение ISAPI следует добавить код для поддержки элементов, выбранных во вкладке Server Options (Параметры сервера) мастера. В отличие от кода класса обработчиков код поддержки в расширении ISAPI не является закомментированным, он входит в программное решение независимо от того, используется он или нет. Не включайте поддержку функциональности – это позволит сократить количество ресурсов.
    Поддержка файлового кэширования добавляет указатель класса для поддержки функций управления указателями файлов, относящихся к чтению и записи файлов. Непосредственно содержимое файла не хранится в классе кэша; он содержит информацию о расположении файлов, их именах и размерах. При удалении элементов из кэша они удаляются с жесткого диска, поэтому кэширование файлов предназначено только для управления временными файлами.
    Кэш памяти необходим для взаимодействия с фрагментами памяти переменного размера в отличии от других классов кэширования памяти ATL Server, поддерживающих фрагменты памяти определенного размера.
    Кэш источника данных обеспечивает функциональность, присущую и другим классам кэширования, исключая хранение подключений к источникам данных.
    При выборе опции Predefined Performance Counters (Предопределенные счетчики производительности) в расширении ISAPI размещается код, реализующий обновление счетчиков ISAPI для perfmon согласно взаимодействию веб-приложения с IIS. Разработчик не участвует в написании кода, весь код, необходимый для обеспечения функциональности, генерируется мастером в файле реализации расширения ISAPI.
    Предопределенными счетчиками производительности являются следующие.
  • Active Threads (Активные потоки). Активные потоки, используемые процессом веб-приложения.
  • Average Response Time (Среднее время ответа). Усредненное время возврата HTTP-ответа веб-приложением.
  • Current Queued Requests (Текущие запросы в очереди).

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

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

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

    Создадим проект ATL Server.
  • Откройте Visual Studio .NET.
  • Выберите команду File\New\Project (Файл\Создать\Проект) для открытия диалогового окна New Project (Новый проект) (см. рис. 4.3).
    Создание простого проекта ATL Server
    Рис. 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 (Готово) для создания файлов проекта.

  • Создание простого проекта ATL Server
    Рис. 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.

    Создание простого проекта ATL Server
    увеличить изображение
    Рис. 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 и провести пошаговую отладку кода, в результате чего, скорее всего, появится следующее сообщение об ошибке.

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

    Запомните. Имя проекта 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 (Обычная удаленная отладка).

    Создание простого проекта ATL Server
    увеличить изображение
    Рис. 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 или виртуального каталога.

    Теги Handler и Subhandler

    Первым тегом любого файла SRF является тег handler. Тег handler указывает библиотеку DLL, к которой осуществляется доступ при поиске функций, указанных тегами замещения в файле SRF. Также можно указать тег subhandler. В одном файле SRF можно вызвать функции из одной или нескольких DLL-библиотек обработки запросов. В теге handler или subhandler используются псевдонимы, с помощью которых формируются теги замещения для вызова функций из рассматриваемой библиотеки DLL обработчика запросов с применением имени alias.function. Тег handler имеет следующий синтаксис:
    {{handler .dll/Default}}
    По умолчанию Visual Studio .NET записывает файлы DLL в каталог с файлами SRF. Размещение двоичных файлов, как правило, представляет определенный уровень абстракции, отличающийся от кода файлов SRF, поэтому двоичные файлы предпочтительнее записывать в отдельный каталог на сервере. Для этого обычно используется подкаталог корневого веб-каталога или каталог корневого виртуального каталога с именем bin. При использовании подкаталога bin для хранения библиотек DLL тег handler выглядит следующим образом:
    {{handler bin\.dll/Default}}

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

    Файл 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 и поддерживает комментарии в коде.

    Теги замещения

    Тег замещения наиболее часто используется в файле SRF. Теги замещения являются точкой доступа разработчика к функциям DLL-библиотек обработки запросов. Тег замещения осуществляет запрос ответа от библиотеки, содержащей нужную функцию, и вставляет ответ в том месте файла SRF, в котором находится тег замещения. Теги замещения поддерживают инструкции для вызова функций, выполняют передачу аргументов функции в DLL-библиотеку обработки запросов. Например, блок if..else..endif можно реализовать с помощью команды {{if}}, являющейся начальной точкой блока if. Блоки Else и endif обозначаются командами {{else}} и {{endif}} соответственно.
    В проекте NewSimpleATLServer SRF вызывает функцию по имени атрибута HaveNameAndColor, как показано в следующем коде. Если HaveNameAndColor возвращает значение "истина", отображаются имя и любимый цвет, введенные пользователем. Если один из элементов неизвестен, то функция HaveNameAndColor возвращает значение "ложь", и SRF запрашивает у пользователя имя, фамилию и любимый цвет. Теги замещения поддерживают инструкции while..endwhile для реализации циклов.
    Листинг 4.4.
    (html, txt)
    Предупреждение. Теги замещения в файлах 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}}.

    Листинг 4.4.

    Предупреждение. Теги замещения в файлах 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}}.

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

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


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

    Анализ пары "Заголовок-Значение"

    После получения заголовка ALL_HTTP из функции GetServerVariable (см. листинг 5.4) для отображения содержимого в XML необходимо реализовать обработку строки. Заголовки разделяются символами новой строки и возврата каретки. Двоеточие (":") разделяет имя заголовка и его значение. GetHeaderValuePair инициализирует поиск в указанной позиции и возвращает имя и соответствующее ему значение для данного заголовка, а также позицию, в которой прерван поиск заголовков. GetHeaderValuePair единовременно осуществляет поиск одного значения заголовка.
    Как видно из листинга 5.6 функция GetHeaderValuePair осуществляет поиск символа ":" в HTTP-заголовке, начиная с позиции nStart в строке sHeader. Значение nStart – это счетчик (начинается с нуля). Если символ ":" не найден, функция завершает работу с возвращением значения "ложь". При обнаружении символа ":" (т.е. заголовок существует) в sHeader продолжается поиск новой строки, начиная с позиции, в которой обнаружен данный символ. При поиске используется функция find строки Standard Template Library (STL) с символом новой строки \n в качестве аргумента и с указанием в качестве начальной позиции символа ":". Позиция новой строки становится конечной позицией, возвращаемой указателем pnEnd, посредством чего вызывающей функции становится известно, в каком месте остановлен поиск. С помощью всех параметров позиции, выявленных в процессе вызовов функции поиска строки sHeader, имя заголовка и значение извлекаются в место расположения памяти, связанное с указателями psName и psValue.
    Листинг 5.6. Source Code for Function GetHeaderValuePair (html, txt)

    Returns data about the search parameters if found or not. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ bool GetHeaderValuePair(const string &sHeader, const int &nStart, string *psName, string *psValue, int *pnEnd) { const string sColon(":");

    //determine if header is a post header string::size_type idxColonPosition = nStart;

    //start looking at beginning idxColonPosition = sHeader.find(sColon, idxColonPosition);

    if (idxColonPosition == string::npos)//no more headers found return false;//this is failure

    //get the name psName->assign(sHeader.substr (nStart, idxColonPosition - nStart));

    //find next newline string::size_type idxNewLine; idxNewLine = sHeader.find('\n', idxColonPosition);

    //get the end even if it means not found *pnEnd = idxNewLine;

    if (idxNewLine == string::npos) //a newline was not found return true;//not a failure - might be the last header

    //get the value //adjust colon position so we do not assign colon in value idxColonPosition = idxColonPosition +1; psValue->assign(sHeader.substr(idxColonPosition, idxNewLine - idxColonPosition));

    return true;

    Листинг 5.6. Source Code for Function GetHeaderValuePair

    Анатомия URL

    URL представляет собой строку, указывающую конкретный ресурс на сервере в интернете. URL формируется согласно следующему синтаксису:
    <схема>://<пользователь>:<пароль>@<узел>:<порт>//<дополнительная информация>
    Ниже приведен URL, реализующий запрос файла ISAPI DLL с именем SEUX.dll. В URL указаны параметры parm1 и parm2. В таблице 5.1 данный URL разбит на части, чтобы показать, как определяется обычный URL, осуществляющий запрос библиотеки ISAPI DLL.
    http://amd1700v2/simpleisapi/folder1/folder2/SEUX.dll/PATH_INFO? parm1=value1&parm2=value
    Многие компоненты URL используются для описания значений серверных переменных, о которых мы поговорим позже. Обратите внимание, что поля, отсутствующие в примере, редко встречаются в URL. В качестве примера приведен наиболее распространенный общий URL.
    Если ISAPI DLL запрашивается напрямую через ссылку URL, в секции url-путь определяется имя файла библиотеки DLL расширения ISAPI. В секции URL <дополнительная информация> располагаются пары параметр = значение, передаваемые расширению ISAPI с помощью этой секции или посредством отправки данных HTTP из формы HTML.

    Файл экспорта определения

    После добавления в проект файла DEF имя библиотеки в файле будет идентично имени проекта (иначе Visual Studio .NET отобразит предупреждение). В нашем проекте имя выглядит следующим образом:
    LIBRARY HelloWorld
    В файл DEF добавим блок DESCRIPTION для описания назначения библиотеки DLL. Описание заключается в одинарные кавычки. Блок DESCRIPTION не является обязательным в отличие от блока EXPORTS. Имена функций следуют после объявления блока EXPORTS. В листинге 5.1 приведен код файла экспорта определения, использованный в нашем проекте. Функции приводятся в произвольном порядке, однако они должны соответствовать именам в реализации расширения.
    Листинг 5.1. HelloWorld.def Content (html, txt)

    Функция GetExtensionVersion

    Функция GetExtensionVersion использует указатель на структуру HSE_VERSION_INFO в качестве параметра и возвращает значение BOOL в зависимости от того, использует ли IIS расширение ISAPI. Если функция GetExtensionVersion возвращает значение "истина", то расширение ISAPI используется. Функция GetExtensionVersion вызывается при загрузке расширения ISAPI в пространство процесса IIS. После загрузки расширения ISAPI эта функция повторно не вызывается. Она отлично подходит для включения кода, выполняющего проверку ключа лицензии, или для процедур инициализации, проверяющих использование расширения. В листинге 5.2 файла HelloWorld.cpp функция GetExtensionVersion только получает информацию о версии для расширения ISAPI.
    Структура HSE_VERSION_INFO содержит две переменные dwExtensionVersion и lpszExtensionDesc. Этим переменным присваиваются значения при вызове функции GetExtensionVersion. В листинге 5.2 переменной dwExtensionVersion присваивается значение 0,9 типа DWORD, а переменной lpszExtensionDesc – значение HelloWorld. Эта функция всегда возвращает значение "истина", так как в IIS всегда загружается расширение ISAPI. Если расширение ISAPI зависит от наличия действительного файла лицензии, другой программной библиотеки или специальной конфигурации, тогда в функции можно выполнять соответствующую проверку и возвращать значение "ложь" в случае отрицательного результата.

    Функция GetServerVariable

    Функция GetServerVariable возвращает значение "истина" при успешном выполнении и значение "ложь" при возникновении ошибки, как показано в следующем примере:
    BOOL WINAPI GetServerVariable( HCONN hConn, LPSTR lpszVariableName, LPVOID lpvBuffer, LPDWORD lpdwSizeofBuffer );
    Прототип GetServerVariable в данном случае требует передачи четырех параметров.
  • hConn. Поддержка соединения, полученная от ECB.
  • lpszVariableName. Строка с символом конца строки запрашиваемой серверной переменной.
  • lpvBuffer. Пустой указатель на буфер, который заполняется результирующим значением имени переменной и байтом конца строки.
  • lpdwSizeofBuffer. Указатель на значение DWORD, отражающее размер буфера.

  • При успешном выполнении функция GetServerVariable возвращает значение "истина". Указатель lpvBuffer указывает значение запрашиваемой серверной переменной, а lpdwSizeofBuffer – на новое значение DWORD, отражающее текущий размер значения, включая байт конца строки. При неудачном завершении работы функция GetServerValue возвращает значение "ложь". В этом случае вызывается функция GetLastError, которая возвращает значение DWORD, представляющее собой код ошибки. В таблице 5.2 показаны возможные ошибки функции GetServerVariable; это константы, определяемыми во вспомогательном файле заголовка расширения ISAPI.

    Функция HttpExtensionProc

    Функция HttpExtensionProc в качестве параметра использует одну из важнейших структур ISAPI – блок контроля расширения (Extension Control Block, ECB). Эта структура содержит следующие компоненты:
  • данные о запросе HTTP;
  • данные веб-экземпляра IIS, через которое поступил запрос;
  • вспомогательные функции для анализа запроса HTTP;
  • вспомогательные функции для управления ответом HTTP.

  • Изучая код листинга 5.2, следует отметить, что указатель на блок ECB используется только для отправки заголовка ответа клиенту и для отображения клиенту фразы "Hi! Hello World". Код C++ похож на C в структурах и вспомогательных функциях, поскольку ISAPI не сильно изменился со времени выхода первой версии IIS для обеспечения обратной совместимости. Заметным изменениям ISAPI стало добавление новых функциональных возможностей. Трудность работы с ISAPI состоит в том, что некоторые API требуют программирования с использованием решений языка C.
    Первой функцией, вызываемой в блоке ECB расширения HelloWorld, является функция ServerSupportFunction. Она устанавливает заголовок в ответе HTTP для обозначения вида содержимого (текст или HTML) с помощью следующей строки:
    Content-type: text/html\r\n\r\n
    За заголовками ответов HTTP должны следовать две пары символов возврата каретки и перехода на новую строку (/n и /r).
    Следующей функцией, вызываемой с помощью ECB, является функция WriteClient. Фраза "Hi! Hello World" записывается в браузер с помощью данной функции посредством передачи указателя char (char*) строковой переменной, содержащей код HTML и строку "Hi! Hello World". Функции WriteClient нужен пустой указатель (void*), поэтому указатель char приводится к форме пустого указателя с помощью макроса PVOID.

    Главная точка входа расширения ISAPI

    Файл HelloWorld.cpp необходимо настроить на поддержку функций, необходимых для обеспечения работы расширения ISAPI.
  • В Visual Studio .NET откройте файл HelloWorld.cpp для редактирования посредством двойного щелчка на имени файла в окне Solution Explorer.
  • Удалите функцию DLLMain (она не нужна в данном примере).
  • В верхней части файла с кодом добавьте препроцессорную директиву включения для файла заголовка httpext.h и (см. листинг 5.2).
  • Добавьте функцию GetExtensionVersion (см. листинг 5.2).
  • Добавьте функцию HttpExtensionProc (см. листинг 5.2).

  • Листинг 5.2. Source Code for HelloWorld.cpp (html, txt)

    Purpose: main entry point for HTTP request

    the possible return codes are: HSE_STATUS_SUCCESS - everything worked great HSE_STATUS_SUCCESS_AND_KEEP_CONN - same as HSE_STATUS_SUCCESS since IIS 4 HSE_STATUS_PENDING - wait until effort completed HSE_STATUS_ERROR - sends a 500 error code /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB) { //HTTP headers const char* BASIC_HEADER = "Content-type: text/html\r\n\r\n"; //output values const DWORD BUFFER_LENGTH = 4096; TCHAR szTempBuffer[BUFFER_LENGTH]; DWORD dwBufferSize = BUFFER_LENGTH; string sResponse;

    //start our HTML document sResponse = " "; sResponse += "Hi! Hello World"; sResponse += "
    ";

    // set content-type header strcpy(szTempBuffer, BASIC_HEADER); DWORD dwHeaderSize = strlen(szTempBuffer); pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, NULL, &dwHeaderSize, (LPDWORD) szTempBuffer);

    //write value to http response DWORD dwLength=sResponse.length(); pECB->WriteClient( pECB->ConnID, (PVOID)sResponse.c_str(), &dwLength, 0);

    //return a success code return HSE_STATUS_SUCCESS; }

    Листинг 5.2. Source Code for HelloWorld.cpp

    Извлечение информации из IIS

    ECB обычно используется для извлечения информации о запросе HTTP и экземпляре сервера IIS, посредством чего расширение ISAPI выполняет определенные программные действия на основе события запроса. В коде листинга 5.3, взятого из расширения ISAPI SEUX (Простое расширение с использованием XML), функция HttpExtensionProc выполняет следующие задачи.
  • Построение документа XML со множеством общих серверных переменных, получаемых из функции GetServerVariable.
  • Добавление свойств ECB в документ XML.
  • Возврат документа XML запрашивающей стороне.

  • Листинг 5.3. HttpExtensionProc Function Building XML Document in SEUX ISAPI Extension (html, txt)
    Примечание. Исходный код SEUX доступен на веб-сайте автора книги (см. введение).

    // End THE ECBServerVariable VARIABLES sDoc += string(XML_L_END) + string("ECBServerVariable") + string(XML_R) + string(NEW_LINE);

    //START THE ECBProperties sDoc += string(XML_L) + string("ECBProperties") + string(XML_R) + string(NEW_LINE);

    GetElement(string("lpszLogData"), string(pECB->lpszLogData),&sDoc); GetElement(string("lpszMethod"), string(pECB->lpszMethod),&sDoc); GetElement(string("lpszQueryString"), string(pECB->lpszQueryString),&sDoc); GetElement(string("lpszPathInfo"), string(pECB->lpszPathInfo),&sDoc); GetElement(string("lpszContentType"), string(pECB->lpszContentType),&sDoc);

    //end THE ECBProperties sDoc += string(XML_L_END) + string("ECBProperties") + string(XML_R) + string(NEW_LINE);

    //end our XML document sDoc += string(XML_L_END) + string(MAIN_ELEMENT_NAME) + string(XML_R) + string(NEW_LINE);

    //write it! SendResponse(pECB,sDoc);

    return HSE_STATUS_SUCCESS; }

    Листинг 5.3. HttpExtensionProc Function Building XML Document in SEUX ISAPI Extension

    Примечание. Исходный код SEUX доступен на веб-сайте автора книги (см. введение).

    Мастер шаблона проекта ISAPI

    При создании расширения ISAPI с использованием поддержки MFC воспользуйтесь мастером шаблона проекта ISAPI (ISAPI Project Template Wizard). Мастер настроит проект на необходимую поддержку для библиотек ISAPI и создаст класс, унаследованный из CHttpServer. Для ISAPI предоставляются следующие классы MFC.
  • CHttpArgList. Класс, содержащий функции и структуры для анализа URL.
  • CHtmlStream. Класс, управляющий памятью по отношению к данным, предназначенных для передачи клиенту.
  • CHttpFilter. Класс, расширяющий интерфейс IIS для создания фильтра ISAPI. Фильтры представляют собой тип приложения ISAPI, вызываемый при каждом запросе IIS, поэтому они отвечают на события внутри IIS.
  • CHttpFilterContext. Класс, являющийся параметром в функциях класса CHttpFilter, для обработки содержимого данного события HTTP. Служит для обработки связанных с рассматриваемым событием HTTP данных, проходящих через фильтр.
  • CHttpServer. Класс, расширяющий интерфейс IIS для рассматриваемого события HTTP-запроса.
  • ChttpServerContext. Класс, обеспечиваемый классом CHttpServer, содержащий методы управления данными, связанными с рассматриваемым событием HTTP.

  • Классы, предоставляемые в MFC, обеспечивают хороший уровень абстракции для первоначального взаимодействия со структурами ISAPI и функциями, приведенными выше. С помощью MFC разработчик осуществляет доступ к "сырому" ISAPI. Некоторые классы облегчают анализ заголовков и данных HTTP, выполняемый вручную в расширении ISAPI SEUX. Мастер создаст класс, которому будет присвоено имя согласно следующей схеме: C<Имя_проекта>Расширение. Функция с именем Default является главной точкой входа для ISAPI DLL:
    void Default(CHttpServerContext* pCtxt);
    Функция Default заменяет функцию HttpExtensionProc, используемую в расширении ISAPI SEUX в качестве главной точки входа. Указатель на класс CHttpServerContext, передаваемый в функцию Default, обеспечивает функциональность и требования разработчика к управлению данными и HTTP-транзакцией (осуществлялось посредством ECB в расширении ISAPI SEUX).

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

    Приложения ISAPI представляют собой библиотеки DLL, напрямую взаимодействующие с IIS API. Программное обеспечение ISAPI – это расширение или фильтр. Расширения ISAPI являются библиотеками DLL, вызываемыми посредством квалифицированного запроса в IIS. Фильтры ISAPI вызываются независимо от других запросов IIS. Запросы HTTP передаются напрямую расширению ISAPI с помощью ссылки URL или данных, отправляемых из формы HTML. Расширение ISAPI может вызываться косвенно посредством связывания файла с определенным расширением ISAPI в IIS. При установке связей файлов выполняются действия, аналогичные ассоциированию файлов ответа сервера (SRF) с конкретным расширением ISAPI в ATL Server (см. лекцию 4). Можно настроить реагирование фильтров ISAPI на запросы согласно приоритету; это отличает их от других фильтров, загружаемых в IIS. Фильтры используются в специализированных приложениях, связанных с IIS, и обычно выполняют следующие задачи:
  • шифрование;
  • ведение журналов;
  • аутентификация;
  • сжатие данных.

  • Расширения ISAPI – наиболее частый способ применения ISAPI. Фильтры ISAPI довольно сложны в создании, и сфера их использования ограничена. Данная тема выходит за рамки книги и рассматриваться не будет.

    Построение остальных элементов XML

    После обработки функции HttpExtensionProc значения заголовка ALL_HTTP остальные серверные переменные обрабатываются с помощью функции GetECBElement (см. листинг 5.7). Каждая серверная переменная, передаваемая в GetECBElement, извлекается с помощью функции GetServerVariable и записывается в элемент XML, присоединяемый к строке, на которую указывает psElement. Указатель psElement указывает на документ XML, конструируемый в HttpExtensionProc.
    Листинг 5.7. Function GetECBElement (html, txt)
    Функция ValidateValue проверяет, что специальные символы указаны с помощью альтернативных комбинаций символов. Функция применяется к строке, перед тем как строке присваивается статус значения элемента. Для подтверждения значения атрибута можно применять ValidateValue. XML не разрешает использование определенных специальных символов в позиции значения, если они не представлены в альтернативном виде. Как видно из листинга 5.8, символы, используемые для реализации XML-структуры: "=", "?" и "?" – заменяются альтернативными эквивалентами.
    Листинг 5.8. Function ValidateValue (html, txt)
    Функция FindAndReplace представляет собой утилиту для замещения всех вхождений строки. В расширении ISAPI SEUX она является идеальным механизмом для замещения одной фразы внутри строки другой фразой. Аргументы представляют собой указатели на строки:
  • изменяемая строка (контейнер);
  • строка, которую нужно заменить внутри контейнера (цель);
  • строка, заменяющая цель в контейнере (замещение).

  • Строка STL содержит функции find и replace, используемые функцией FindAndReplace для поиска контейнера всех вхождений цели (см. листинг 5.9). Каждый раз при обнаружении цели в контейнере происходит ее замена, и начинается новый поиск. По завершении работы функции FindAndReplace контейнер обновляется замещениями, если таковые имеются.
    Листинг 5.9.
    (html, txt)
    Функция GetElement работает аналогично функции GetECBElement; она вызывается из функции HttpExtensionProc для конкатенации элементов из свойств ECB.
    Свойства извлекаются из ECB, после чего передаются вместе со своими именами и документом XML в функцию GetElement. GetElement размещает свойство ECB и соответствующее значение в XML документе и конкатенирует его с указателем документа XML, переданным функции GetElement. Осуществляется запрос следующих свойств:

  • lpszLogData. Буфер размера HSE_LOG_BUFFER_LEN, используемый для размещения информации, добавляемой в файл журнала для данной транзакции HTTP-запроса.
  • lpszMethod. Строковое значение используемого метода HTTP, например, GET, PUT или HEAD.
  • lpszQueryString. Строковое значение символов в секции дополнительной информации адреса URL, исключая символ "?". Аналогично значению переменной сервера QUERY_STRING.
  • lpszPathInfo. Строковое значение секции URL, находящейся между библиотекой DLL расширения ISAPI и началом секции дополнительной информации URL. Обычно не содержит данных, если запрашивающее ПО не разместило в этом месте определенное значение.
  • lpszContentType. Строковое значение типа содержимого отправленных по HTTP данных. Аналогично значению серверной переменной CONTENT_TYPE.


  • Когда функция HttpExtensionProc завершает получение содержимого всех возможных серверных переменных и свойств ECB, в документе XML указываются закрывающие тегов XML, и он передается функции SendResponse. SendResponse направляет запрашивающей программе строковое значение, переданное в функцию. Заголовок типа содержимого передается запрашивающему клиенту с помощью функции ECB ServerSupportFunction (см. листинг 5.10). Передаваемый заголовок представляется константой BASIC_HEADER, эквивалентной следующей строке: Content-type: text/html\r\n\r\n. За заголовками HTTP следуют два символа возврата каретки и новой строки, поскольку возвращаемые данные представляют собой текст. Можно указать и XML, однако если в запрашивающем браузере в XML зарегистрированы типы Multipurpose Internet Mail Extensions (MIME), то для отображения XML откроется зарегистрированная программа.

    Листинг 5.10. Function SendResponse (html, txt)


    После отправки заголовка возврата отправляется содержимое с помощью функции WriteClient. Как показано в следующем примере, при передаче данных клиенту отправляется идентификатор соединения ConnID. Имеющееся значение, полученное из текущего экземпляра указателя, использовано в листинге 5.10. Содержимое передается функцией WriteClient с помощью пустого указателя в параметре Buffer. Содержимое, на которое ссылается указатель Buffer, должно равняться количеству байт, передаваемому клиенту, и указываться в параметре lpdwBytes. По завершении вызова lpdwBytes содержит количество переданных байт, если запись не осуществлялась асинхронно. Значение параметра dwSync определяет способ передачи данных клиенту. В листинге 5.10 с помощью макроса HSE_IO_SYNC указывается значение 0х00000001, т.е. запись выполняется синхронно, и пространство памяти, на которое ссылается указатель lpdwBytes, обновится по завершении WriteClient количеством байт, переданным клиенту. Если в макросе HSE_IO_ASYNC представлено значение 0х00000002, то данные, отправляемые клиенту, и функция обратной связи зафиксируют события передачи информации клиенту. Асинхронное использование функции WriteClient требует объявления функции обратной связи, а также отправки функцией ServerSupportFunction значения HSE_REQ_IO_COMPLETION для установки с клиентом транзакции асинхронной записи.

    Функция WriteClient является членом ECB. Может показаться странным, что используемое описание ECB передается функции. Поскольку приложение IIS включает несколько нитей, в любой момент времени может потребоваться несколько экземпляров ECB, и вероятно выполнение записи в экземпляре ECB в другой экземпляр ECB. Ниже приведен пример WriteClient:

    BOOL WriteClient( HCONN ConnID, LPVOID Buffer, LPDWORD lpdwBytes, DWORD dwSync );


    Аналогично значению переменной сервера QUERY_STRING.
  • lpszPathInfo. Строковое значение секции URL, находящейся между библиотекой DLL расширения ISAPI и началом секции дополнительной информации URL. Обычно не содержит данных, если запрашивающее ПО не разместило в этом месте определенное значение.
  • lpszContentType. Строковое значение типа содержимого отправленных по HTTP данных. Аналогично значению серверной переменной CONTENT_TYPE.


  • Когда функция HttpExtensionProc завершает получение содержимого всех возможных серверных переменных и свойств ECB, в документе XML указываются закрывающие тегов XML, и он передается функции SendResponse. SendResponse направляет запрашивающей программе строковое значение, переданное в функцию. Заголовок типа содержимого передается запрашивающему клиенту с помощью функции ECB ServerSupportFunction (см. листинг 5.10). Передаваемый заголовок представляется константой BASIC_HEADER, эквивалентной следующей строке: Content-type: text/html\r\n\r\n. За заголовками HTTP следуют два символа возврата каретки и новой строки, поскольку возвращаемые данные представляют собой текст. Можно указать и XML, однако если в запрашивающем браузере в XML зарегистрированы типы Multipurpose Internet Mail Extensions (MIME), то для отображения XML откроется зарегистрированная программа.

    /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Name: SendResponse

    In: pECB - pointer to the extension control block sValue - string reference to the value to be written to the HTTP response

    Out: nothing

    Purpose: writes the intended value to the HTTP response /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ void SendResponse(EXTENSION_CONTROL_BLOCK *pECB, string &sValue) { TCHAR szTempBuffer[BUFFER_LENGTH]; DWORD dwBufferSize = BUFFER_LENGTH;

    // set content-type header strcpy(szTempBuffer, BASIC_HEADER); DWORD dwHeaderSize = strlen(szTempBuffer); pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, NULL, &dwHeaderSize, (LPDWORD) szTempBuffer);


    // write value to http response DWORD dwLength=sValue.length(); pECB->WriteClient( pECB->ConnID, (PVOID)sValue.c_str(), &dwLength, HSE_IO_SYNC); }

    Листинг 5.10. Function SendResponse

    После отправки заголовка возврата отправляется содержимое с помощью функции WriteClient. Как показано в следующем примере, при передаче данных клиенту отправляется идентификатор соединения ConnID. Имеющееся значение, полученное из текущего экземпляра указателя, использовано в листинге 5.10. Содержимое передается функцией WriteClient с помощью пустого указателя в параметре Buffer. Содержимое, на которое ссылается указатель Buffer, должно равняться количеству байт, передаваемому клиенту, и указываться в параметре lpdwBytes. По завершении вызова lpdwBytes содержит количество переданных байт, если запись не осуществлялась асинхронно. Значение параметра dwSync определяет способ передачи данных клиенту. В листинге 5.10 с помощью макроса HSE_IO_SYNC указывается значение 0х00000001, т.е. запись выполняется синхронно, и пространство памяти, на которое ссылается указатель lpdwBytes, обновится по завершении WriteClient количеством байт, переданным клиенту. Если в макросе HSE_IO_ASYNC представлено значение 0х00000002, то данные, отправляемые клиенту, и функция обратной связи зафиксируют события передачи информации клиенту. Асинхронное использование функции WriteClient требует объявления функции обратной связи, а также отправки функцией ServerSupportFunction значения HSE_REQ_IO_COMPLETION для установки с клиентом транзакции асинхронной записи.

    Функция WriteClient является членом ECB. Может показаться странным, что используемое описание ECB передается функции. Поскольку приложение IIS включает несколько нитей, в любой момент времени может потребоваться несколько экземпляров ECB, и вероятно выполнение записи в экземпляре ECB в другой экземпляр ECB. Ниже приведен пример WriteClient:

    BOOL WriteClient( HCONN ConnID, LPVOID Buffer, LPDWORD lpdwBytes, DWORD dwSync );

    Построение простого расширения ISAPI

    Расширения ISAPI имеют такую несложную структуру, что могут создаваться без помощи MFC или ATL. Расширение ISAPI можно написать, используя файл включения расширения httpext.h и файл DLL definition export file (DEF) с экспортом двух следующих функций:
    HttpExtensionProc; GetExtensionVersion.
    Каждое расширение ISAPI должно поддерживать эти функции. Оно может также экспортировать функцию TerminateExtension (это не является обязательным). После настройки проекта DLL расширение нужно применить к IIS. В Visual Studio .NET имеется шаблон проекта ISAPI, запускающий мастер расширения ISAPI. Этот мастер создает класс, названный по имени проекта, наследуемый из класса CHTTPServer и содержащий необходимые функции ISAPI. Мастер расширения ISAPI использует файлы заголовков для поддержки от MFC, ATL и httpext.h для получения классов и структур ISAPI.
    Работа с мастером расширения ISAPI будет описана позже. Рассмотрим метод создания простого расширения ISAPI с минимальной поддержкой MFC и ATL без помощи мастера.
  • В Visual Studio .NET выберите команду File\New\Project (Файл\Создать\Проект) для открытия диалогового окна New Project (Новый проект).

  • В диалоговом окне New Project (Новый проект) щелкните на узле Visual C++ Projects (Проекты Visual C++) в левой части окна и выберите шаблон проекта Win32. Присвойте проекту имя HelloWorld и выберите место расположения создаваемого проекта.
    При нажатии на кнопку More (Больше) диалоговое окно New Project (Новый проект) отобразит дополнительную информацию о том, в каком месте будет создан проект. Название данной кнопки изменится на Less (Меньше). По умолчанию Visual Studio создает каталог с именем, идентичным имени проекта, в папке, указанной в текстовом поле Location (Расположение), в котором располагаются все файлы проекта. На рисунке 5.2 показано, что в текстовом поле Location (Расположение) введено значение C:\bookMaterial\IISBook\17ISAPIExtension\code, а именем проекта является HelloWorld.
    Построение простого расширения ISAPI
    Рис. 5.2.  Диалоговое окно New Project (Новый проект) с выбранным проектом Win32

  • Нажмите на кнопку OK для запуска мастера приложений Win32 (Win32 Application Wizard) (см. рис. 5.3).

    Построение простого расширения ISAPI
    Рис. 5.3.  Обзор в мастере приложения Win32

  • Откройте вкладку Application Settings (Параметры приложения) в левой части мастера приложений Win32.
  • Выберите DLL в качестве типа приложения (см. рис. 5.4).

    Построение простого расширения ISAPI
    Рис. 5.4.  Создание проекта Win32 DLL.

  • Нажмите на кнопку Finish (Готово); Visual Studio создаст каталог C:\bookMaterial\IISBook\17ISAPIExtension\code\HelloWorld и разместит в нем файлы проекта.
  • Выберите команду Project\Properties (Проект\Свойства) для открытия окна свойств страницы.
  • Выберите в левой части окна свойств узел Precompiled Header в узле C/C++ для отображения свойств проекта.
  • Visual Studio .NET не имеет шаблона проекта, который реализуется без заранее скомпилированного заголовка, поэтому выберите шаблон проекта Win32, создайте из проекта библиотеку DLL и удалите параметр заранее скомпилированного заголовка. В ниспадающем списке Create\Use Precompiled Header (Создать\Использовать готовый заголовок) выберите Not Using Precompiled Headers (Не использовать готовые заголовки) в ниспадающем списке Create\Use Precompiled Header (Создать\Использовать готовый заголовок) (см. рис. 5.5).

    Построение простого расширения ISAPI
    увеличить изображение
    Рис. 5.5.  Изменение параметра готового заголовка проекта

  • Нажмите на кнопку OK в окне свойств. Откроется окно Solution Explorer (Обозреватель решения); если это не так, то выберите в меню команду View\Solution Explorer (Вид\Обозреватель решения).
  • Готовый заголовок не используется, поэтому удалите файлы stdafx, созданные Visual Studio .NET для его поддержки. В окне Solution Explorer выделите заголовок stdafx и файлы реализации, щелкните правой кнопкой мыши и выберите Remove (Удалить) (см. рис. 5.6).

    Построение простого расширения ISAPI
    Рис. 5.6.  Удаление файлов stdafx из проекта

  • Теперь нужно добавить в проект DEF. Для этого щелкните правой кнопкой мыши на имени проекта в Solution Explorer и выберите команду Add\Add New Item (Добавить\Добавить новый элемент).
  • В диалоговом окне Add New Item (Добавление нового элемента) выделите DEF File (Файл DEF) и присвойте файлу имя Hello World в соответствии с именем проекта (см.


    рис. 5.7). Имя файла должно соответствовать имени DLL, иначе компилятор C++ отобразит предупреждение о несоответствии имен файлов. Рассматриваемый файл DEF (файл экспорта определения) описывает функции, экспортируемые из DLL, чтобы другое приложение могло загрузить DLL и найти адреса функций.

    Построение простого расширения ISAPI
    Рис. 5.7.  Добавление в проект файла экспорта определения

  • Нажмите на кнопку Open (Открыть) в диалоговом окне Add New Item (Добавить новый элемент) для добавления в проект нового файла DEF.


  • Шаблоны проекта Visual Studio используют встроенный механизм MFC для экспорта функций и использования библиотеки DLL расширения ISAPI программой-потребителем, каковой является IIS. В Visual Studio .NET нет шаблона проекта, создающего конечный продукт без готового заголовка, поэтому следует выбрать шаблон проекта Win32, преобразовать его в DLL, после чего удалить ненужные файлы и настройки. При создании проекта без поддержки MFC иногда возникают некоторые сложности. Однако MFC сами по себе достаточно сложны, поэтому небольшие проекты (как в нашем примере) можно упростить, отказавшись от использования MFC.

    Следующим шагом является настройка файла DEF.

    Построение XML для представления значений серверных переменных

    Первой задачей (см. листинг 5.3) является открытие документа XML посредством присоединения некоторых констант, представляющих собой части документа XML. Построение XML происходит вручную, и константы объявляются для общих частей документа XML, так как они используются во многих местах. Документ XML размещается в строковой переменной с именем sDoc. Ниже приведены константы XML:
    //xml parts const char* MAIN_ELEMENT_NAME = "HTTPRequestRaw"; const char* QUOTE ="\""; const char* XML_L ="<"; const char* XML_R =">"; const char* XML_L_END =""; const char* NEW_LINE ="\n"; const char* HEAD = "";
    Рассматриваемый документ XML достаточно прост, поэтому его построение вручную не вызывает никаких трудностей. Для более сложного документа рекомендуется использовать аналитическую библиотеку XML, такую как MSXML.
    После инициализации документа XML начинается работа по размещению в элементах XML всех серверных переменных. Создаваемый документ XML имеет родительский элемент HTTPRequestRaw. Внутри HTTPRequestRaw содержатся два дочерних элемента с ECBServerVariable и ECBProperties. Для каждого значения серверной переменной, запрашиваемого из ECB, будет создаваться дочерний элемент для элемента ECBServerVariable, независимо от получения значения соответствующей серверной переменной. Для каждого запрошенного свойства ECB создается дочерний элемент под элементом ECBProperties, которое содержит значение независимо от получения значения свойства. При вызове расширения ISAPI SEUX с помощью IE 6.0 отобразится документ XML (см. рис. 5.12). В других версиях браузера XML может отобразится по-другому или не отобразиться вовсе.
    Построение XML для представления значений серверных переменных
    увеличить изображение
    Рис. 5.12.  IE 6.0, отображающий документ XML серверных переменных из расширения SEUX ISAPI

    Расширения ISAPI во взаимодействии с IIS

    Если IIS получает запрос и считает, что необходимо использовать расширение ISAPI (запрошен файл, связанный с расширением ISAPI или само расширение ISAPI), то IIS передает запрос HTTP вместе с расширением ISAPI. Чтобы расширение ISAPI получило запрос HTTP, используется определенный программный интерфейс. Как известно, приложение ISAPI содержит файлы заголовков ISAPI, определяющих структуры и классы. Расширение ISAPI примет запрос посредством используемого интерфейса API, и данные запроса HTTP будут загружены в структуры и классы, являющиеся компонентами ISAPI.

    Таблица 5.1. Компоненты URLКомпонент URLЗначение из примера
    схемаhttp
    пользовательОтсутствует в демонстрационном URL
    парольОтсутствует в демонстрационном URL
    узелamd1700v2
    портОтсутствует в демонстрационном URL (подразумевается значение 80)
    url-путьsimpleisapi/folder1/folder2/SEUX.dll/PATH_INFO
    дополнительная информация?parm1=value1&parm2=value

    Расширение ISAPI анализирует данные HTTP-запроса и направляет вызовы другому программному обеспечению, например, программе бизнес-уровня (см. рис. 5.1). Ответы этой программы формируются в виде HTTP-ответов и возвращаются в IIS. IIS возвращает ответ расширения ISAPI веб-пользователю, направившему изначальный запрос.
    Расширения ISAPI во взаимодействии с IIS
    Рис. 5.1.  Обзор архитектуры расширения ISAPI
    Архитектура, показанная на рисунке 5.1, позволяет использовать расширения ISAPI двумя возможными способами, но не является единственным вариантом технологии. Единственным ограничением является вызов расширения ISAPI при HTTP-запросе и наличие структур и классов, содержащих HTTP-запрос и поддерживающих программное взаимодействие с ответом HTTP и запросом HTTP. Построение абстракции логики – задача разработчика. Направление вызовов библиотеке бизнес-логики необязательно, если бизнес-логика заключена в самом расширении ISAPI. Так как ISAPI напрямую записывает данные в HTTP-запрос, следует создавать архитектуру, абстрагирующую логику представления для исключения повторной компиляции ISAPI DLL при изменении логики представления.

    Реализация ISAPI "HelloWorld"

    После успешной компиляции DLL расширение ISAPI можно отгружать на веб-сервер. Если в качестве расположения конечного файла DLL указан экземпляр веб-сервера или корень виртуального каталога, можно немедленно запросить файл из IIS. При выполнении отладки Visual Studio .NET браузер не откроется, и автоматического запроса ISAPI DLL из IIS (как при отладке веб-службы ASP.NET) не произойдет. Visual Studio считает проект библиотекой DLL, поэтому выдаст запрос на присвоение исполняемого файла, который использует данную библиотеку.
    Запомните. Если разработчик осуществляет построение библиотеки DLL расширения ISAPI и затем тестирует DLL посредством ее запроса через IIS, при втором построении ISAPI DLL в Visual Studio .NET, скорее всего, не удастся создать DLL. IIS блокирует библиотеку DLL расширения ISAPI при ее запросе из IIS, поскольку DLL загружается в пространство процесса IIS. Для разблокирования ISAPI DLL необходимо выгрузить экземпляр веб-сайта или виртуального каталога либо заново запустить приложение. После разблокирования ISAPI DLL поверх нее в процессе построения осуществляется запись.
    При первом запросе ISAPI DLL из IIS 6 в операционной системе Windows Server 2003, скорее всего, возвратится ошибка 404. В WS03 и IIS6 существует новая возможность, ограничивающая по умолчанию всякую программную поддержку серверной части, если она не включена вручную. В предыдущих версиях Windows Server компонент IIS поставлялся с включенной программной поддержкой серверной части (ASP). Эта функция включается в окне Web Service Extensions (Расширения веб-служб) консоли MMC Computer Management (Управление компьютером) (см. рис. 5.8).
    Реализация ISAPI
    увеличить изображение
    Рис. 5.8.  Включение программной функциональности серверной части в окне Web Service Extensions (Расширения веб-служб)
    Настроим IIS на разрешение запросов расширения ISAPI HelloWorld.
  • В окне администрирования расширения веб-служб щелкните на ссылке Add A New Web Service Extension (Добавить новое расширение веб-службы).
    Откроется диалоговое окно New Web Service Extension (Новое расширение веб-службы).
  • В текстовом поле Extension Name (Имя расширения) введите имя, которое будет отображаться в окне администрирования расширения веб-служб. В нашем примере это имя HelloWorld (см. рис. 5.9).

    Реализация ISAPI
    Рис. 5.9.  Диалоговое окно New Web Service Extension (Новое расширение веб-службы)

  • Нажмите на кнопку Add (Добавить), чтобы указать путь к файлу расширения ISAPI. Откроется диалоговое окно Add File (Добавление файла), в котором вручную вводится путь к файлу, либо укажите его расположение в окне Open File (Открыть файл) после нажатия на кнопку Browse (Обзор).
  • Установите путь к файлу расширения ISAPI, затем нажмите на кнопку OK в диалоговом окне Add File (Добавление файла). Файла расширения ISAPI отобразится в диалоговом окне New Web Service Extension (Новое расширение веб-службы).
  • Отметьте опцию Set Extension Status To Allowed (Разрешить использование расширения), после чего нажмите на кнопку OK.


  • Расширение HelloWorld появится в окне администрирования расширения веб-служб консоли Copmuter Management (Управление компьютером), и в поле Status (Состояние) отобразится значение Allowed (Разрешено).

    В качестве альтернативы установите Allowed (Разрешено) для расширения веб-службы All Unknown ISAPI Extensions (Все неизвестные расширения ISAPI). Данный параметр разрешает выполнение любого запроса относительно любого расширения ISAPI.

    Включение данной настройки нарушает безопасность сервера, поэтому используйте этот параметр только в изолированных средах, таких как среда разработки.

    Разрешения на выполнение веб-экземпляра IIS или виртуального каталога устанавливаются на разрешение выполнения библиотек ISAPI DLL. По умолчанию параметр Execute Permissions (Разрешения на выполнение) в окне свойства веб-экземпляра IIS или виртуального каталога не позволяет выполнять сценарии и исполняемые файлы.

  • Откройте оснастку IIS MMC Computer Management (Управление компьютером) и щелкните правой кнопкой мыши на веб-экземпляре или виртуальном каталоге для отображения контекстного меню.
  • Выберите Properties (Свойства) для открытия окна свойств веб-экземпляра или виртуального каталога.
  • Во вкладке Virtual Directory (Виртуальный каталог) окна свойств виртуального каталога или во вкладке Home Directory (Домашний каталог) веб-экземпляра расположено поле со списком Execute Permissions (Разрешения на выполнение) (см.рис. 5.10). Убедитесь, что отмечена опция Scripts And Executables (Сценарии и исполняемые файлы).


  • Реализация ISAPI
    Рис. 5.10.  Установка разрешений для виртуального каталога

    Если в IIS все настроено должным образом, ISAPI Hello World будет функционировать. Запросите библиотеку ISAPI DLL в адресе URL из браузера, как если бы это был файл HTML – и DLL выполнится (см. рис. 5.11).

    Реализация ISAPI
    Рис. 5.11.  Выполнение расширения ISAPI HelloWorld

    Создание расширения ISAPI в Visual Studio .NET

    Для создания расширения ISAPI с помощью шаблона проекта Vusal Studio .NET откройте Visual Studio .NET и выберите File\New\Project (Файл\Создать\Проект). Откроется диалоговое окно New Project (Новый проект) (см. рис. 5.13). Выберите шаблон проекта MFC ISAPI Extension DLL, введите имя проекта и нажмите на кнопку OK.
    Создание расширения ISAPI в Visual Studio .NET
    Рис. 5.13.  Выбор шаблона проекта MFC ISAPI Extension DLL в Visual Studio .NET
    Примечание. Диалоговое окно (см. рис. 5.13) отображает значки, отличающиеся от тех, которые показаны на рис. 5.2. В обоих случаях использованы одинаковые версии Visual Studio .NET. Рисунок 5.2 получен при нажатии на кнопку Large Icons (Большие значки) в правом верхнем углу, рисунок 5.13 – при нажатии на кнопку Small Icons (Мелкие значки). Кнопки Large Icons (Большие значки) и Small Icons (Мелкие значки) являются взаимоисключающими, и они влияют на отображение значков проекта в правой части диалогового окна New Project (Новый проект).
    По аналогии с мастером проекта сервера ATL (см. лекцию 4) работа мастера расширения ISAPI выполняется в одном окне, и его работа завершается после нажатия на кнопку Finish (Готово) (см. рис. 5.14). Мастер приводит обзор параметров проекта в области Overview (Обзор). Типом создаваемого проекта по умолчанию является библиотека DLL расширения ISAPI с MFC в общей DLL. Данные настройки подходят для большинства проектов ISAPI. Эти параметры можно изменить в области Object Settings (Параметры объекта).
    Создание расширения ISAPI в Visual Studio .NET
    Рис. 5.14.  Область Overview (Обзор) мастера расширения ISAPI с проектом ISAPI по умолчанию
    В области Object Settings (Параметры объекта) настраиваются имена классов, сгенерированных мастером, содержатся опции, позволяющие расширению ISAPI подключаться к MFC статически или динамически. Выбор опции Use MFC In A Shared DLL (Использовать MFC в общей DLL) (см. рис. 5.15) определяет динамическое подключение MFC в ISAPI DLL, генерируемой во время компиляции. Подразумевается, что MFC существует в среде разработки, что достигается исключением содержимого из ISAPI DLL.

    Создание расширения ISAPI в Visual Studio .NET
    Рис. 5.15.  Область Object Settings ( Параметры объекта) мастера расширения ISAPI с проектом ISAPI по умолчанию.

    При выборе опции Use MFC In A Static Library (Использовать MFC в статической библиотеке) компоненты MFC компилируются в DLL и подключаются статически. В этом случае подразумевается, что MFC не существует в среде разработки. Размер библиотеки при статическом подключении больше, чем при динамическом подключении. В большинстве случаев MFC располагаются в целевой среде, так как речь идет о сервере Windows. Для WS03 используйте динамическое подключение, поскольку MFC находятся на сервере.

    Можно сгенерировать объект фильтра, включив опцию Generate A Filter Object (Генерировать объект фильтра). Фильтры загружаются в IIS для обработки каждого запроса, имеющего место в IIS. Они работают по аналогии с расширением ISAPI, как если бы оно было связано с каждым файлом корневого веб-каталога. Фильтр и расширение не являются взаимоисключающими функциями. Одна библиотека DLL может содержать как расширение, так и фильтр, что позволяет каждому из этих объектов использовать состояние посредством глобальных переменных.

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

    После нажатия на кнопку Finish (Готово) и завершения мастером генерации файлов проект можно скомпилировать и запустить, как только библиотека DLL будет отгружена на сервер. Если все выполнится правильно, вы увидите в браузере сообщение, имя класса в котором соответствует выбранному имени класса:

    This default message was produced by the Internet Server DLL Wizard. Edit your CMFCISAPIExtension::Default() implementation to change it.

    Специальный случай серверной переменной ALL_HTTP

    Первой серверной переменной, для которой получается значение, является переменная ALL_HTTP, представляющая собой все заголовки HTTP, переданные в запросе HTTP. Результатом остальных запрошенных серверных переменных является число или строка, легко согласуемая с XML, однако ALL_HTTP возвращает все заголовки в одну и ту же серверную переменную.
    Заголовки в значении, возвращаемом из ALL_HTTP, ограничены символами новой строки, поэтому требуется дополнительный анализ для размещения каждого заголовка в элементе XML в качестве атрибута. Функция GetALLHTTPHeader выполняет данную задачу с помощью функции ECB GetServerVariable (см. листинг 5.4).
    Листинг 5.4. GetALLHTTPHeader Function Building XML Element in SEUX ISAPI Extension (html, txt)

    Сравнение ISAPI с сервером ATL

    При сравнении ATL Server и ISAPI основным различием является то, что ISAPI в меньшей степени поддерживает инфраструктуру и наличие архитектуры. ISAPI для расширений (в отличие от фильтров) состоит из функций API и структур и классов, являющихся параметрами функций API. ATL Server представляет много новых вспомогательных классов, макросов и функций и выполняет по отношению к ISAPI задачи, аналогичные классам Microsoft Foundation Classes (MFC) применительно к Windows API. ATL Server является дополнительным уровнем программирования, позволяющим оптимально использовать технологии. ATL Server поддерживает разработчика, который создает взаимодействующий с ISAPI программный продукт, предоставляя ему соответствующие методы и вспомогательное программное обеспечение. Разработчик может выбирать используемое ПО (иногда это является сложной задачей). В подобных обстоятельствах ISAPI послужит удобной альтернативой. В отличие от ATL Server ISAPI не предлагает никакой абстракции типа логики, и, кроме этого, имеется не очень много информации об ISAPI. Можно использовать классы ATL Server в приложении ISAPI без применения шаблона проекта ATL Server. В качестве альтернативы шаблон проекта ATL Server настраивается на использование одной библиотеки DLL без каких-либо опций, что создает структуру проекта, похожую на проект ISAPI.

    Значения серверных переменных

    Возможные значения запрашиваемых серверных переменных приведены в листинге 5.3 в коде функции HttpExtensionProc в расширении ISAPI SEUX; они являются аргументами в вызовах GetECBElement. Значения серверных переменных могут изменяться в процессе текущего события запроса HTTP в IIS, и зачастую переменной не присваивается значение. Серверные переменные содержат значения только при определенных настройках IIS. В таблице 5.2 приведены серверные переменные, запрашиваемые с помощью функции GetServerVariable.

    Таблица 5.2. Обзор переменных сервера, запрашиваемых функцией GetServerVariableКонстанта ошибкиОписание ошибки
    ERROR_INVALID_PARAMETERЗначение hConn является некорректным или закрытым, либо неверны параметры серверной переменной.
    ERROR_INVALID_INDEXЗапрашиваемая серверная переменная не поддерживается.
    ERROR_INSUFFICIENT_BUFFERРазмер lpdwSizeofBuffer слишком мал для содержания значения запрашиваемой серверной переменной.
    ERROR_NO_DATAЗапрашиваемая серверная переменная недоступна.
    ALL_HTTPВсе HTTP-заголовки (разделены символами новой строки), переданные в запросе HTTP в строке с символом конца строки. Заголовки имеют вид <имя заголовка> : <значение>.
    ALL_RAWВсе заголовки HTTP в том виде, в котором они были отправлены запрашивающей HTTP-стороной.
    APPL_MD_PATHПуть метабазы веб-приложения. Например, /LMW3SVC/1/Root/SimpleISAPI.
    APPL_PHYSICAL_PATHФизический путь корневого веб-каталога для веб-приложения. Например: C:\ISAPI\.
    AUTH_PASSWORDПароль, вводимый веб-пользователем в диалоговом окне аутентификации браузера, если установлена базовая аутентификация.
    AUTH_TYPEИспользуемый тип аутентификации. Пустое значение при отсутствии аутентификации либо значение, соответствующее Kerberos, пользовательской аутентификации, SSL/PCT, базовой или интегрированной аутентификации Windows.
    AUTH_USERИмя пользователя, вводимое пользователем в диалоговом окне аутентификации браузера в случае, если установлена базовая аутентификация.
    CERT_COOKIEУникальный идентификатор сертификата клиента.
    CERT_FLAGSБитовые флаги бюро сертификатов (CA) сертификата клиента. Если bit0 равен 1, то CA отсутствует в списке распознаваемых бюро сертификатов данного сервера и признается недействительным.
    CERT_ISSUERСодержит имя сертификата клиента. Например, O=Schmidlaps, OU=House, CN= имя пользователя, C=USA.
    CERT_KEYSIZEРазмер ключа в битах при соединении SSL.
    CERT_SERCRETKEYSIZEРазмер секретного ключа сертификата сервера в битах.
    CERT_SERIALNUMBERСерийный номер сертификата клиента.
    CERT_SERVER_ISSUERПодробное имя издателя сертификата сервера.
    CERT_SERVER_SUBJECTПодробное имя субъекта сертификата сервера.
    CERT_SUBJECTСубъект сертификата клиента.
    CONTENT_LENGTHКоличество байт, исключая заголовки HTTP-запроса.
    LOGON_USERЕсли конечный пользователь успешно аутентифицировался в Windows, используется учетная запись входа в систему.
    HTTPSВозвращает значение off, если в HTTPS не используется SSL, в противном случае возвращается значение on.
    HTTPS_KEYSIZEРазмер ключа SSL-соединения в битах.
    HTTP_SECRETKEYSIZEРазмер секретного ключа сертификата сервера в битах.
    HTTPS_SERVER_ISSUERПодробное имя издателя сертификата сервера.
    HTTPS_SERVER_SUBJECTПодробное имя субъекта сертификата сервера.
    INSTANCE_IDНомер экземпляра сервера. Значения идентификатора сервера в метабазе, например, 1.
    INSTANCE_META_PATHПуть веб- экземпляра в метабазе, например: LM/W3SVC/1.
    PATH_INFOЧасть URL, расположенная между ISAPI DLL и началом секции с дополнительной информацией в URL. Как правило, в этом месте нет никаких данных, если запрашивающее ПО не добавляет свое значение.
    PATH_TRANSLATEDЧасть веб-экземпляра, связанная с физическим жестким диском, с конкатенацией значения PATH_INFO.
    QUERY_STRINGСтрока символов, следующих за символом "?" в секции дополнительной информации URL.
    REMOTE_ADDRIP-адрес хоста или шлюза запрашивающего ПО.
    REMOTE_HOSTИмя узла или шлюза запрашивающего ПО, если включен обратный поиск DNS; иначе возвращается значение IP-адреса узла или шлюза запрашивающего ПО.
    REMOTE_USERИмя пользователя, осуществляющего HTTP-запрос и аутентифицируемого несущим сервером. Представляет собой пустую строку для анонимного пользователя.
    REQUEST_METHODКоманда метода HTTP-запроса.
    SCRIPT_NAMEИмя исполняемого двоичного файла, например, имя ISAPI DLL или исполняемого файла CGI.
    SERVER_NAMEИмя узла сервера или IP-адрес.
    SERVER_PORTПорт TCP/IP, по которому получен запрос.
    SERVER_PORT_SECUREЗначение 0 или 1. Запросы по безопасному порту возвращают 1; иначе возвращается 0.
    SERVER_PROTOCOLИмя и версия протокола запроса, например, HTTP 1.1.
    SERVER_SOFTWAREИмя и версия IIS, под которой выполняется программа DLL расширения ISAPI, например, Microsoft-IIS/6.0.
    URLЗначение части url-путь адреса URL, исключая значение PATH_INFO. Например: /simpleisapi/folder1/folder2/SEUX.dll.
    <
    Для демонстрации значений таблицы 5.2 в листинге 5. 5 приведен документ XML, созданный из расширения ISAPI SEUX.DLL. В данном примере несущий сервер и IIS настроены таким образом, что многие значения серверных переменных получаются в процессе HTTP-запроса. Имя несущего узла – amd1700v2. IIS 6 на amd1700v2 настроен с использованием следующих значений параметров и файловых расположений.

  • Физическое расположение расширения ISAPI SEUX.DLL.

    C:\ISAPI\папка1\папка2\SEUX.dll.
  • Корень веб- экземпляра. C:\inetpub\wwwroot.
  • Связанный виртуальный каталог. C:\ISAPI.
  • Анонимный доступ. Не включен для виртуального каталога.
  • Базовая аутентификация. Включена для виртуального каталога.


  • Расширение ISAPI SEUX.dll запрошено с amd1700v2 с помощью следующих данных браузера, расположенного на отдельном компьютере.

  • Пользователь, осуществивший вход на веб-сайт под именем normaluser.
  • Пользователь, осуществивший вход на веб-сайт с использованием пароля normaluser.
  • URL в браузере: http://amd1700v2/simpleisapi/folder1/folder2/SEUX.dll/PATH_INFO?parm1=value1&parm2=value


  • Листинг 5.5. SEUX.DLL Output from http://amd1700v2/simpleisapi/folder1/folder2/SEUX.dll/PATH_INFO? parm1=value1&parm2=value (html, txt)

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

    Адаптация унифицированного процесса

    Унифицированный процесс представляет собой обобщенную методологию разработки программного обеспечения любого типа, поэтому в данной лекции представлен конкретный вариант процесса, базирующийся на унифицированном процессе, используемом для разработки программного обеспечения интернет-портала. Этот процесс основывается на личном опыте автора книги, и приводится лишь в качестве варианта унифицированного процесса. Этот процесс можно модифицировать в соответствии с определенными условиями, в зависимости от требований сторон-участников проекта.
    В начале работы над любым проектом определяется область, представляющая собой обзор или описание желаемого результата. Если все участники проекта согласны с определенной областью, то далее следует сбор требований, результатом которого является функциональный проект. По завершении сбора требований разрабатывается технический проект, определяющий построение программного решения; результатом является техническая спецификация. Функциональный проект отвечает на вопрос "что", а технический проект – на вопрос "как". После описания решение передается в разработку для реализации построения и тестирования согласно технической спецификации. По завершении процесса разработки программное решение тестируется согласно функциональной спецификации. После прохождения всех необходимых тестов осуществляется публикация программы или ее доставка клиенту, и проект считается завершенным. На рисунке 6.1 показан общий процесс построения веб-сайта.
    Адаптация унифицированного процесса
    Рис. 6.1.  Общий процесс построения веб-сайта
    Многие новые методологии, например, Extreme Programming и Agile, усложняют и расширяют унифицированный процесс. Они предлагают разработчикам возможности по оптимизации процесса создания программного продукта.
    Extreme Programming предлагает такие подходы, как исключение документации, уменьшение времени цикла разработки и программирование парами. Элементы Extreme Programming представлены в методологии, обсуждаемой в данной лекции, так как они эффективны при разработке решений для интернета.

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

    Примечание. Примеры документов, описываемых в данной лекции, доступны на веб-сайте автора книги.

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

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


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

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

    Кто-то поспешит заметить, что требования устанавливаются владельцем, а не командой разработки. Уменьшение времени на разработку программного продукта приведет к успеху только при сужении области разработки или расширении штата разработчиков. Естественно, что требования устанавливаются владельцем, поэтому при "урезке" требуемой функциональности владелец удовлетворен не будет. Наилучший способ решить данную проблему – сузить область, т.е. разбить проект на более мелкие. В данном случае владельцу можно предоставить план работы над проектом. Согласно унифицированному процессу такие мелкие проекты называются итерациями. По завершении работы над всеми итерациями осуществляется реализация готового продукта. Предпочтительно разрабатывать программный продукт с использованием большего числа итераций. Одну большую задачу труднее выполнить, она сопряжена с большим риском, чем решение последовательных мелких задач, приводящих к получению такого же продукта.

    Что такое диаграмма Ганта?

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

  • Диаграмма Ганта отражает видение предстоящего процесса. Диаграмма Ганта не поможет точно предсказать будущее, однако обеспечит простоту восприятия предположений другими людьми.
    Диаграммы Ганта создаются c помощью программного обеспечения по управлению проектом, например, Microsoft Project или Visio. Диаграмма (см. рис. 6.3) разработана с помощью Microsoft Project.
    Что такое диаграмма Ганта?
    увеличить изображение
    Рис. 6.3.  Диаграмма Ганта плана демонстрационного проекта, созданная на этапе определения области работы
    Проект области дает начальное понимание объема работ. Если предположения оценки области правильны, и план показал, что работу нельзя завершить в установленные сроки, следует адаптировать стратегию. Это потребует от владельца принятия альтернативной области работы, применения этапного подхода к разработке программного решения за счет увеличения числа итераций либо перехода команды разработки к альтернативному варианту проекта.
    После разработки плана и создания всех документов, связанных с перспективным планированием, план представляется владельцу. После принятия плана владельцем проект возвращается менеджеру проекта для утверждения. При несогласии владельца с перспективным планом менеджеру по счетам необходимо предоставить другие варианты документа, определяющего область работ, а также план проекта.

    Что такое фасад?

    Фасад в данном контексте не является объектно-ориентированным методом программирования. Этот элемент можно назвать ограниченным прототипом или креативной экспериментальной моделью с небольшой степенью реальности. Определение фасада позволяет владельцу представить себе программное решение перед получением окончательного продукта. Фасад демонстрирует программное решение в действии в окне браузера.
    Моделирование решения происходит по окончании сбора требований и отражения их в функциональной спецификации. На данном этапе предполагается, что владелец точно представляет себе конечный результат, и что это нашло свое отражения в документе. Тем не менее, в реальной жизни после просмотра предварительного варианта проекта владелец может добавить в него что-нибудь.
    Во многих интернет-проектах владелец сконцентрирован на том, как конечный пользователь будет взаимодействовать с программой. В процессе создания модели и построения решения фасад подтверждает внешний вид и функции программного обеспечения. Проекты веб-порталов обычно включают в себя следующие промежуточные результаты.
  • Конфигурации и сценарии источников данных.
  • Файлы двоичного кода и сценариев, получающие данные и применяющие правила функционирования.
  • Файлы сценариев, используемые для применения логики представления.

  • Почему бы не реализовать логику представления перед построением прочих элементов? Если программное решение поддерживает абстракцию от бизнес-логики и логики представления, то в первую очередь можно заняться логикой представления. Технологией, поддерживающей такую абстракцию, является язык XML. В рамках данной лекции мы будем работать с форматом XML.
    Совместные усилия по программированию правил функционирования, сценариев и источников данных приводят к созданию документов XML, необходимых логике представления для получения конечного результата. Перед построением источников данных или программы разработчик создает техническую спецификацию, устанавливающую метод, согласно которому функционируют данные элементы, включая создаваемый код XML.
    Это означает, что код XML моделируется перед построением программы. Следует проверить модель XML перед построением источника данных или программы, применяющей правила функционирования. Необходимо написать файлы сценариев, используемые для применения логики представления, и это можно сделать перед созданием программы поддержки (или после). При изменении требований корректировка файла сценария логики представления потребует меньших усилий, чем изменение скомпилированного кода бизнес-объекта. Если логика представления оформлена в виде XSL, XSLT или другой технологии представления (например, веб-форм ASP.NET), то для тестирования файла сценария логики представления используются статические документы XML.

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

  • Создание документа XML для каждого рассматриваемого события решения, имеющего место в проекте портала.
  • Построение логики представления.
  • Визуальная демонстрация функционирования продукта и подтверждение корректности его функционирования..


  • По завершении работы над фасадом можно выполнять оставшуюся часть работы по созданию кода правил функционирования и источника данных. Фасадную часть также можно продемонстрировать владельцу. Хотя она и не является полнофункциональной, но все-таки отражает процесс работы и показывает, что все идет по плану. Владелец чувствует себя непосредственным участником процесса и берет на себя некоторую ответственность за конечный результат разработки.

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

    Демонстрационная постановка задачи

    Владельцу нужен веб-сайт, на котором менеджер сможет публиковать рецепты. Сотрудники, подчиненные менеджеру, должны размещать свои комментарии относительно рецептов. Каждый может читать комментарии для рецептов, опубликованных соответствующим менеджером.
    Владельцу требуется узел для приложения.
    Владелец желает получить завершенный проект через три недели, к 22 июня, на которое назначена презентация пивоваренных достижений.

    Диаграмма данных

  • Описание контейнера или таблиц.
  • Описание всех полей или атрибутов в таблице или контейнере.
  • Описание ключей, используемых в таблицах.

  • В данном разделе представляется описание слоя данных или способа хранения данных в системе. Классовая диаграмма является хранилищем данных внутри памяти, а диаграмма данных – аппаратной системой хранения информации. В этом разделе приводится описание модели базы данных, а также файлов и элементов каталогов.

    Диаграмма классов

  • Описание назначения каждого класса.M
  • Взаимоотношения с другими классами (наследование, композиция и накопление).
  • Функции в объекте (предназначение, описание интерфейса, параметры, типы данных).
  • Параметры состояния инициализации, применяемые к решению и связанным с ним объектам.
  • Псевдокод функций.

  • Данный раздел содержит код, обеспечивающий поддержку экземпляров объектов, описанных в объектной модели. Эти два раздела кажутся аналогичными, однако различие заключается в том, что определенные классы могут представлять несколько экземпляров объектов. Модель класса обеспечивает абстракцию от объектов реального мира к структурам кода, представляющим эти объекты.

    Допущения

  • Указывать любую новую информацию, которая поможет разобраться в деталях программного продукта, влияющих на вынесение решения.

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

    Функциональная спецификация

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

    Таблица 6.2. Обзор промежуточных результатов для этапа определения функциональностиПорядок выполненияПромежуточный результатОтветственная сторонаM
    1Функциональная спецификацияБизнес-аналитик.
    2Квалифицированная оценка функциональных требованийРазработчики.
    3Квалифицированный план проекта для функциональных требованийМенеджер проекта.
    4Согласие владельца с определенными функциональными требованиями, даты окончания работ в планеМенеджер проекта.

    Функциональная спецификация занимает объем не более 30 страниц и состоит из следующих элементов.
  • Определение каждого функционального требования; это нужно, чтобы специалисты по разработке и контролю качества могли определенным образом называть компоненты спецификации в технической спецификации и сценариях тестирования.
  • Рисунки или диаграммы каждого окна, связанного с результатом проекта или представляемого конечному пользователю.
  • Запись контроля за изменениями.
  • Содержание.
  • Титульная страница с именем владельца и названием проекта.
  • Нижний колонтитул с именем компании разработки, сведениями о конфиденциальности информации и датой печати документа.
  • Идентификация проекта запоминающимся именем.

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

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

    Функциональная спецификация
    Рис. 6.4.  Уникально определенные с помощью иерархической нумерации функциональные требования

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

    Разработка всегда осуществляется согласно функциональным требованиям. Итерации уменьшают цикл разработки и снижают вероятность получения некорректного результата. Чем больше в проекте итераций, тем больше промежуточных результатов, с которыми нужно ознакомить владельца. Ему будет намного спокойнее наблюдать за успешным выполнением промежуточных этапов проекта, чем находиться в томительном ожидании конечного результата. Выполнение проекта с итерациями будет "занимать" голову владельца позитивными событиями, связанными с проектом. Если владелец не может видеть или понять промежуточные результаты, или если между ними проходит длинный промежуток времени, то он начинает отрицательно судить о ходе выполнения проекта.

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


    Нижний колонтитул сообщает о компании, издавшей данный документ, о дате издания и конфиденциальности документа.

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

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

    Примечание. Многие текстовые процессоры, такие как Microsoft Word и Word Perfect, автоматически создают оглавление. Для правильной работы генератора оглавления необходимо, чтобы в тексте использовались определенные стили. Например, оглавление на рисунке 6.5 сгенерировано с использованием стилей Heading 1 (Заголовок 1) и Heading 2 (Заголовок 2). Многие авторы спецификаций допускают ошибку, создавая весь документ в текстовом процессоре и игнорируя форматирование текста.

    Примечание. Документ Word, использованный в качестве демонстрационной функциональной спецификации, доступен с исходным кодом на веб-сайте автора книги.

    Функциональная спецификация
    увеличить изображение
    Рис. 6.5.  Титульная страница демонстрационной функциональной спецификации

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

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

    Если функциональная спецификация изменяется в каждом проекте, то следует изменить шаблон документа. Ниже приведены основные положения, которыми следует руководствоваться при составлении функциональной спецификации.

    Функциональные задачи

  • Перечислить все возможности сайта (избегайте слишком подробного описания).
  • Указать получаемые результаты в терминах бизнес-логики.

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

    Модульное тестирование

  • Описание тестовой структуры решения.
  • Данные "крайнего случая", используемые при модульном тестировании кода.

  • В данном разделе приводится описание возможностей программного решения, если оно создано правильно. Здесь можно привести тест или набор тестов, которые нужно создать для проверки программного решения и заключения о правильности функционирования решения в процессе тестирования. В данном разделе необходимо описать данные, обеспечивающие условия "крайнего случая" для модульного тестирования. "Крайний случай" обычно представляет собой обработку строк, содержащих специальные символы, таких как ~ ` ! @ # $ % ^ & * ( ) _ + - { } [ ] \ | ; : ' " < > ? / . ,.
    Данные "крайнего случая" позволяют определить время выполнения при обработке большего объема данных по сравнению с обычным, с которым чаще всего взаимодействует решение.

    Объектная модель

  • Результаты работы над фасадной частью.

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

    Области функциональных задач

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

  • Для каждой функциональной задачи, определенной в области Functional Objectives (Функциональные задачи), должна присутствовать область функциональной задачи. Эта область подробно описывает функциональную задачу: бизнес-логику, которой она принадлежит, способ функционирования (с точки зрения владельца) компонентов решения, относящихся к задаче. Следует определить и обрисовать экранные и системные процессы, привести структуру каждого окна, определить сценарии для успешных и неудачных операций. Общей ошибкой в функциональных задачах является отсутствие описания того, что происходит в случае успешных и неудачных событий. Явное описание разрешенных и запланированных событий конечного пользователя и ожидаемых результатов позволит избежать ошибок при определении функциональности. Например, можно составить таблицу, описывающую события и соответствующие ожидаемые ответы программного решения (см. рис. 6.6).
    Области функциональных задач
    Рис. 6.6.  Демонстрационные сценарии и исключения функциональной спецификации

    Оценка области

    Целью оценки области является создание основы для определения времени разработки проекта. Разработчики создают оценку области для информирования команды разработки о необходимых технических ресурсах. Тезисы оценки предоставляют дополнительную информацию о том, что, по мнению самих разработчиков, хочет получить в итоге заказчик. В оценке описывается реализация отдельных аспектов проекта. Многие программисты считают предоставление оценки области задачей рискованной и сложной, так как на данном этапе еще не определены требования к проекту. Разумеется, приведенная демонстрационная постановка задачи не совсем точна, и на получение программного решения может потребоваться от трех недель до трех лет в зависимости от требований к проекту.
    Эффективной стратегией по оценке области является определение всех промежуточных результатов, необходимых для создания программного решения. Промежуточные результаты уточняются в рамках допущений, связанных с их получением и сопутствующим риском. Промежуточные результаты следует определять по возможности самым широким образом в отношении требований, которым они должны удовлетворять. Сотрудники, участвующие в оценке, рассматривают тезисы разработчика как контрпродуктивные меры, используемые разработчиками для собственной защиты. Уточненные тезисы являются начальным эскизом, описывающим функционирование программного решения. Разработчики должны подробнейшим образом описать ключевые моменты для информирования команды об аспектах, влияющих на объем ресурсов, необходимых для разработки программного решения. На рисунке 6.2 в качестве основы для веб-сайта, на котором публикуются рецепты пивоварения, использована демонстрационная оценка, приведенная выше.
    Оценка области
    увеличить изображение
    Рис. 6.2.  Пример оценки области, представленный в виде электронной таблицы

    Окна программного решения

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

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

    Определение функциональности

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

  • Как говорилось выше, способ существования программного решения и его функции составляют функциональное требование к программному решению. Фразу "способ существования и функционирования решения" можно интерпретировать очень вольно, поэтому следует сузить область функциональности в контексте программного решения. Задайте владельцу следующие вопросы и получите ответы, уточняющие функциональные требования, предъявляемые к программному решению для интернета.
  • Где будет расположено программное решение в процессе функционирования?
    Решение можно разместить на сайте владельца либо на сайте сторонней организации. Платформу (операционная система, веб-сервер или другой продукт, предназначенный для оптимизации работы) можно выбрать заранее и оговорить для совместного использования с разрабатываемым решением. Если владелец не знает ответа на данный вопрос, тогда специалист предоставляет свои рекомендации.
  • Каких клиентов будет обслуживать программное решение? Интернет-решения не всегда поддерживают клиент браузера. Иногда требуются другие способы поддержки программных решений, расположенных в различных местах интернета, с данными, которые нужно обрабатывать перед предоставлением конечному пользователю. Специалист определяет всех потребителей данных и функциональных возможностей.
  • Что требуется для работы программного решения? Интернет-решения могут обслуживать и другие серверы, расположенные в интернете.
    В решении можно предусмотреть получение данных из другой системы перед обработкой информации. Специалист определяет всех поставщиков данных и функциональных возможностей.
  • Кто взаимодействует с системой? Выявляются конечные пользователи, действия, которые они выполняют в программном решении, и их требования к решению. Каковы роли, существующие в технологическом процессе, и какова ответственность, связанная с этими ролями?
  • Какие сущности реального мира представляются в программном решении?

    Выявляется и документируется объектная модель программного решения. Необходимо определить и смоделировать объекты в системе и их атрибуты, абстрагируясь от технических ограничений системы. Определяются объекты, описывающие действия, выполняемые программным решением.
  • Что именно выполняет программное решение? В конечном счете программа производит над данными определенные действия перед доставкой клиенту. Для определяемых объектов моделируются и документируются соответствующие взаимодействия и описываются выполняемые действия.


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

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

    План проекта с основными этапами и датами является частью функциональной спецификации. Владелец должен ознакомиться с функциональной спецификацией и оценкой. Работу не следует начинать, пока он письменно виде не подтвердит функциональность, описанную в спецификации. В таблице 6.2 приведены промежуточные результаты, необходимые для выполнения этапа определения функциональности.

    Определение модели

    Моделью называется инструкция по построению программного решения. Она объясняет способы размещения программного решения на узле и определяет задачи, необходимые для построения решения. Промежуточные результаты процесса построения также выявляются в модели. В идеальном случае модель содержит достаточное количество информации, чтобы программист создал программное решение.
    Модель состоит из диаграмм, текста, рисунков, псевдокода и других элементов, определяющих технические особенности. Промежуточные результаты процесса разработки модели носят следующие названия: фасад, сценарии функционального тестирования и техническая спецификация (см. табл. 6.3).

    Таблица 6.3. Обзор промежуточных результатов этапа определения моделиПорядок выполненияПромежуточный результатОтветственная сторона
    1ФасадБизнес-аналитик и разработчики.
    2Техническая спецификацияРазработчики.
    3Сценарии функционального тестирования.Контроль качества.


    Определение области проекта

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

  • Поскольку нет уверенности в том, что владелец согласится выделить средства на весь проект, менеджер проекта определяет, какие элементы необходимо включить в перспективный план. Работа по подготовке перспективного плана проводится в соответствии с отношениями между организацией-разработчиком и потенциальным владельцем. Например, владелец может принять предложение по перспективному плану, если ему предоставят определенную информацию. В этом случае нужно приложить максимум усилий, поскольку вероятность этого достаточна велика. В другой ситуации мнение владельца о предлагаемом проекте неизвестно, поэтому приложенные усилия и временные затраты могут не привести к положительному результату, особенно при наличии конкурентов, предлагающих свои собственные решения.
    Следует иметь в виду риск наложения ответственности на организацию разработки при неясности некоторых фактов. При отсутствии возможности сверки с расписанием после проведения сбора требований действия, осуществляемые на этапе определения функциональности, должны выполняться на этапе определения области. Владельца нужно предупредить о сложностях, связанных с реализацией плана, а также дать понять, что задачи, выходящие за рамки рассматриваемого уровня сложности, приведут к увеличению стоимости проекта и временных затрат.
    После того как менеджер по счетам ставит задачу проекта, команда разрабатывает калькуляцию. Затем менеджер проекта проектирует план и определяет затраты времени на проект, промежуточные результаты и ключевые моменты.
    Предположим, что после представления перспективного плана владелец согласился с поставленными условиями. Начинается следующий этап процесса – определение функциональности. В таблице 6.1 приведены промежуточные результаты работы на этапе определения области с указанием стороны, ответственной за их получение.

    Таблица 6.1. Обзор промежуточных результатов этапа определения областиПорядок выполненияПромежуточный результатОтветственная сторона
    1Описание требований владельца – постановка задачиМенеджер по счетам.
    2Квалифицированная оценка областиРазработчики.
    3Квалифицированный план проекта относительно областиМенеджер проекта.
    4Согласие владельца относительно области и предлагаемое время завершения работы над проектомМенеджер проекта.

    Определения и сокращения

  • Определить любые потенциально непонятные термины, используемые в данном документе или в сфере деятельности владельца.
  • Определить сокращения, используемые в любых местах документа и в сфере деятельности владельца.

  • Данная область определяет термины для предотвращения путаницы, она также фиксирует номенклатуру проекта. Приводимые здесь названия используются для описания сущностей и предотвращают применение нескольких терминов к одной и той же концепции.

    Определения терминов

    В данной лекции используется ряд специальных терминов, определения которых приводятся ниже.
    Под владельцем подразумевается получатель веб-сайта. Термин клиент
    обозначает пользователя сервера. Данное разграничение предотвращает путаницу, возникающую при равнозначном использовании этих терминов. Владельцем является начальник, сотрудник отдела продаж или рекламный представитель. Несмотря на то, что мотивы каждого владельца различны, все они выступают в роли заменителей конечных пользователей. Владелец всегда требует от сайта выполнения определенной задачи с наименьшими затратами ресурсов.
    Термин конечный пользователь обозначает лицо, потребляющее некоторое программное обеспечение. Это может быть человек, использующий браузер для просмотра веб-сайтов или получающий файл по электронной почте с сервера SMTP. Конечный пользователь взаимодействует с программным решением.
    Термины программное решение, автоматизированное решение и решение
    являются взаимозаменяемыми. В данной лекции все они объединены в термин "решение". Решением называется комбинация программного и аппаратного обеспечения, необходимого для выполнения определенной работы.
    Менеджером проекта является лицо, осуществляющее контроль над проектом с момента выделения владельцем средств на создание решения до получения клиентом готового продукта. Менеджер проекта выполняет работу по управлению требованиями клиента и отвечает за соблюдение временных рамок проекта. Если проект является долгосрочным, менеджер проекта выступает в роли ответственного за прибыль проекта.
    Бизнес-аналитик является официальным адвокатом владельца и определяет, каким образом должно функционировать решение. Данное лицо, как правило, владеет функциональной спецификацией. Эту роль могут выполнять и другие лица, например, менеджеры проекта и разработчики.
    Команда разработки – группа разработчиков, ведущих специалистов, менеджеров по разработке и системных архитекторов. В разных организациях должности и роли различаются. В общем случае команда разработчиков занимается написанием кода, но не осуществляет контроль над кодом и настройку оборудования.
    Системные специалисты занимаются управлением оборудованием. Они отвечают за аппаратную часть, управляя, настраивая и поддерживая аппаратное обеспечение и операционную систему. Лица данной категории производят настройку решений, но не занимаются написанием кода.
    Разработчик пользовательских интерфейсов занимается реализацией логики представления для конкретного программного решения. Разработчик объектов отвечает за создание кода бизнес-логики и логики данных.
    UML – аббревиатура от Unified Modeling Language (Унифицированный язык моделирования). Этот язык применяется для документирования любых процессов. Для документирования программного обеспечения используются рисунки.
    Use case – описание бизнес-события или процесса, осуществляемого программой.
    QA – аббревиатура от Quality Assurance (Контроль качества). Обозначает членов команды разработки ПО, ответственных за тестирование программного обеспечения.

    План проекта области

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

    После завершения проекта

    После завершения проекта следует провести анализ для определения того, насколько методология процесса приемлема для организации. Процесс, представленный в данной лекции, появился в результате такого анализа. Был добавлен этап работы над фасадной частью, так как сотрудники отдела рекламы и продаж не понимали функциональную спецификацию и должны были увидеть решение на экране монитора. Циклы разработки обычно длились около шести месяцев, однако организация нуждалась в более частом усовершенствовании своего сайта. В результате разработчики сократили цикл до трех месяцев и выяснили, что усовершенствования можно проводить с большей степенью надежности из-за снижения объема выполняемых работ.
    Анализ должен ответить на следующие вопросы.
  • Каковы различия между действительными и запланированными датами окончания этапов разработки? Этот вопрос помогает оптимизировать процесс оценки при работе над следующим проектом. Большие различия говорят о невозможности предугадать или измерить ресурсы организации.
  • Потребовался ли в процессе разработки промежуточных результатов больший объем ресурсов, нежели запланированный в процессе оценки? Этот вопрос позволяет оптимизировать процесс оценки для использования в следующем проекте.
  • Удовлетворен ли владелец решением? При отрицательном ответе потребуется внесение улучшений в стратегию разработки.
  • Удовлетворен ли владелец методом доставки решения? Моменты, связанные с доставкой решения, часто опускаются при сборе требований. При отрицательном ответе потребуются дополнительные усилия для предотвращения такого финала в будущем.
  • Какие ошибки обнаружены и каковы их причины? Являлись проблемы аномальными или систематическими, требуется ли внесение соответствующих изменений в процесс?
  • Выгоден ли проект? Ответ на этот вопрос позволит принять решение о том, стоит ли заниматься подобными проектами в будущем.
  • Можно ли базировать на данном решении другие продукты, которые могут заинтересовать других клиентов? Многие компании-производители ПО находят свою нишу на рынке посредством поиска ответа на данный вопрос. Если один владелец желает заполучить программное решение, то, скорее всего, найдутся и другие, готовые заплатить за решение.
  • Можно ли реализовать повторяемый и выгодный бизнес-процесс? Если владелец обращается к компании с новым заказом, то возможна продажа автоматизированного решения для снижения стоимости работ.


  • После завершения проекта
    После завершения проекта
    © 2003-2007 INTUIT.ru. Все права защищены.

    Постановка задачи

    В начале работы по созданию программного продукта владелец видит перед собой некоторый идеал, о котором он сообщает организации, занимающейся работой над проектом. Владелец или менеджер определяют результат работы (постановка задачи). Постановку задачи можно сделать после 15-минутного телефонного разговора, зафиксировать на паре листов бумаги или подытожить в предложении из 15 слов. Ниже приведен пример постановки задачи на выполнение работы.

    Построение решения

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

    Таблица 6.4. Обзор промежуточных результатов этапа построения решенияПорядок выполненияПромежуточный результатОтветственная сторона
    1КодРазработчики.
    2ДокументацияРазработчики.

    При написании кода разработчик руководствуется технической и функциональной спецификацией. Если в процессе программирования возникают трудности, связанные с техническим или функциональным проектом, о них нужно сообщить ответственному за соответствующий документ – разработчику (для технической спецификации) или бизнес-аналитику (для функциональной спецификации). При возникновении проблем разработчик должен описать причину для внесения корректив в структуру решения. Разработчик предлагает рекомендации по решению возникающих проблем, что поддерживает ответственность за программное решение всех участников проекта. Обязанности разработчика при написании кода заключаются в следующем.
  • Создание кода, отвечающего требованиям технической спецификации.
  • Проверка кода в системе хранения и контроля кода по процедурам.
  • Модульное тестирование кода.
  • Комплексное тестирование кода.

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

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

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

    При переносе решения с одной среды тестирования на другую необходимо внимательно управлять этими средами. В среде разработки для интернета существуют следующие среды.

  • Рабочая станция разработчика.
  • Разработчики.
  • Контроль качества.
  • Подготовка.
  • Производство.


  • Рабочая станция разработчика обеспечивает самую неконтролируемую среду. Она предназначена для создания кода и модульного тестирования, проведения анализа, экспериментов и диагностики. Среда разработки представляет собой среду сервера, дающую разработчикам доступ к установке решений для их тестирования. Она должна удовлетворять требованиям, связанным с тестированием. Установку дополнительного программного обеспечения необходимо запретить. Здесь должны находиться только те программы, которые будут присутствовать в среде, где планируется развертывание решения. Рассматриваемая среда должна ограничивать доступ в интернет и из него, поскольку она является незащищенной, и высока возможность нападения хакера. Производительность данной среды не играет особой роли, поэтому не следует выделять для нее дополнительные ресурсы.

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


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

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

  • Рекламная демонстрация и обучение.
  • Резервное копирование готового решения.
  • Тестирование производительности.


  • Среду подготовки нужно полностью закрыть для доступа разработчиками. Ее изменения должны контролироваться системным администратором.

    Среда функционирования – это узел, на котором располагается доступный клиенту продукт. Главным потребителем в среде функционирования является конечный пользователь. В данной среде важен уровень производительности. Управление средой функционирования осуществляется только системным персоналом.

    Представление фасадной части

    Представление фасада разработчику требует возможности отображения окна в браузере. Microsoft Internet Explorer версии 5.5 и выше преобразует XML в HTML при помощи XSL и XSLT. IE является самой подходящей платформой для представления фасадной части на компьютере с любой версией операционной системы Windows. Представление фасадной части происходит обычно на рабочем месте владельца, где возможно отсутствие связи интернетом. Фасадную часть можно установить на сервере, преобразующим XML и XSL/XSLT, однако использование браузера для выполнения преобразования всегда позволит просмотреть результат работы.
    Для осуществления преобразования XML в HTML с помощью XSL или XSLT в IE добавьте инструкцию обработки (см. листинг 6.1) над остальным кодом XML. Документ XML, содержащий инструкцию обработки, будет преобразован с помощью таблицы XSL с именем MyXSLSheet.xsl. При поступлении документа XML от веб-сервера указанная таблица XSL должна поступать оттуда же. В листинге 6.1 показано, что файл MyXSLSheet.xsl располагается в том же каталоге, что и сам файл XML.

    Листинг 6.1. Processing Instruction to Transform XML into HTML (html, txt)
    Представление фасадной части показывает владельцу окна его будущего программного решения в браузере. Переход от одних окон к другим реализуется посредством сценариев. После первого ознакомления с фасадной частью владелец обычно вносит свои коррективы и предложения.
    В результате демонстрации фасадной части, как правило, изменяется область работы. При этом работы над проектом может сильно усложниться ввиду установленных сроков сдачи проекта. Причиной изменения области работы является то, что решение в браузере выглядит иначе, чем в функциональной спецификации. Владелец должен знать, что любое изменение сдвигает срок окончания проекта. Если владелец не согласен с изменением сроков доставки, фасадная часть упростит продажу готового решения, ведь члены команды разработки отразили в ней все требования владельца. В этом случае можно сделать следующее.
  • Внести несложные изменения в текущее решение на ранней стадии процесса.
  • Немедленно предложить дополнительные услуги относительно текущего программного решения.
  • Начать сбор требований для второго этапа проекта.


  • Представить другую полезную информацию, связанную

  • Представить use-case документацию.
  • Представить другую полезную информацию, связанную с функциональностью проекта.

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

    Разработка фасада

    Построение фасадной части требует взаимодействия лиц, участвующих в определении и построении решения: бизнес-аналитика, разработчика, программирующего логику представления, и разработчика бизнес-логики или логики данных. Разработчика логики представления будем называть разработчиком пользовательского интерфейса, а разработчика кода бизнес-логики и логики данных – разработчиком объектов.
    Процесс работы над фасадом начинается с определения окон интерфейса (это отражено в функциональной спецификации и документе XML). Каждое окно, определенное в функциональной спецификации, находит отражение в документе XML. Разработчик пользовательского интерфейса и разработчик объектов работают совместно для разработки документов XML "крайнего случая". Документы XML "крайнего случая" представляют собой сценарии, указываемые в функциональной спецификации. Целью этих документов является выбор набора тестовых данных, моделирующих самые плохие ситуации, что позволяет увеличить надежность кода. После создания документа XML "крайнего случая" разработчик логики представления создает функционирующий код логики представления в соответствии с этим документом.
    Примечание. Многие объекты в .NET автоматически фиксируют состояние объекта в XML. Эта функциональность заменяет определение объектов для использования в решении, что является большим преимуществом, поскольку в конечном итоге нужно создать объекты, реализующие XML. ASP.NET предоставляет множество способов разработки и отображения XML (см. лекции 2 и 3).
    Для любой фасадной части необходимо получить следующие промежуточные результаты.
  • Одна или несколько спецификаций XML "крайнего случая" для каждого окна, определенного в функциональной спецификации.
  • Код логики представления для каждого окна функциональной спецификации.

  • Разработчик пользовательского интерфейса выполняет большую часть работы, напрямую связанную с этим этапом, создавая требуемый пользовательский интерфейс, указанный в функциональной спецификации. На данном этапе бизнес-аналитик выполняет минимальный объем работы. Роль аналитика заключается в уточнении спецификации и ее проверке. Разработчик объектов проверяет существующее решение на наличие источников XML, несущих в себе объекты или данные, определяемые как содержимое документа XML "крайнего случая". В этот поиск можно включить классы .NET Framework, если технология .NET Framework входит в программное решение. Если разработчик пользовательского интерфейса хорошо знаком с результирующими XML, то можно начать создание основного кодf или провести анализ выполняемости компонентов нового решения.
    Фасадная часть считается завершенной, если в браузере отображаются окна с помощью документов XML "крайнего случая", при этом, как правило, невозможен переход от одного окна фасада к другому, и отсутствуют ссылки. Перед непосредственной разработкой возможна настройка логики представления.

    Реализация решения

    Последним шагом является реализация решения. Как правило, речь идет об установке системным администратором программы на веб-сервер и другие необходимые узлы. Установка по возможности проводится с помощью программного обеспечения, в автоматизированном режиме, без ручного копирования файлов.
    Некоторые программные пакеты служат для построения программ установки. Это, например, шаблоны проекта программы установки Visual Studio .NET InstallShield или Wyse. Построение программы установки может показаться лишним, но оно позволяет избежать ошибок установки. Программа установки является частью решения и проходит соответствующие тесты. При установке должен проводиться тест для подтверждения правильности инсталляции решения, чтобы установщик знал о возникновении любых неполадок. В программное решение также следует включить сценарий деинсталляции.
    Еще одним действием при производстве программного продукта является реклама и информирование конечных пользователей о появлении нового решения. Эти действия требуют строгого соблюдения сроков сдачи проекта, и реализация в этом случае должна происходить точно по назначенному расписанию.

    Реализация

  • Диаграмма реализации.
  • Описание данных на узле (библиотеки, версии).
  • Сценарий реализации (необходимые шаги, порядок выполнения, конфигурация узла).
  • Подтверждение успешного проведения реализации.
  • Шаги по деинсталляции.

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

    Сбор функциональных требований

    Для написания функциональной спецификации ее автор должен знать функциональные требования. Он должен выполнить сбор функциональных требований, консультируясь с бизнес-аналитиком, обсудившим функциональность программного решения с владельцем. Успех данного исследования зависит от места расположения владельца, который либо доступен для беседы с аналитиком, либо не может предоставить необходимую информацию. Бизнес-аналитик помогает владельцу сосредоточиться на важной и полезной для проекта информации, исключая технические детали построения проекта.
    Бизнес-аналитик обдумывает информацию, предоставленную владельцем, и создает подробную функциональную спецификацию, после чего команда разработки эффективно разрабатывает программное решение. Аналитик идентифицирует все требования программного решения, начиная с документов, описывающих область работы.
    Затем с помощью UML составляются диаграммы use-case бизнес-процессов. Как и многие другие задачи, диаграммы use-case создаются с максимальном количеством деталей для более точного описания бизнес-процессов. Диаграммы UML упрощают документацию use-case и облегчают ее понимание и сверку.
    После сбора аналитиком всей необходимой информации use-case она документируется в виде формы или таблицы. Шаблон или форма для документирования информации use-case включает в себя следующие элементы.
  • Имя use-case. Короткое информативное имя.
  • Идентификатор use-case. Уникальный буквенно-цифровой код.
  • Действующие лица. Все конечные пользователи, принимающие участие в use case.
  • Предварительные условия. Часть среды, присутствующая в реализации use-case.
  • Процесс. Что происходит в процессе use-case.
  • Последующие условия. Что представляет собой среда после выполнения use-case.

  • Например:
    Имя: Поиск рецепта. Идентификатор: UC001. Действующие лица: Пользователь. Предварительные условия: Пользователь должен осуществить успешный вход на сайт.
    Процесс:
  • Пользователь щелкает на ссылке "Поиск рецепта".
  • В окне браузера открывается окно "Поиск рецепта".
  • Пользователь вводит в диалоговом окне ключевое слово, которое присутствует в искомом рецепте.
  • Пользователь нажимает на клавишу Enter.
  • Окно обновляется с отображением результатов поиска.
  • Если пользователь получает искомое имя рецепта:
  • Пользователь щелкает на ссылке для получения рецепта.
  • Рецепт отображается в окне браузера.
  • Если пользователь не получает искомого имени рецепта:
  • Пользователь вводит новый критерий поиска рецепта в диалоговом окне ввода ключевого слова.
  • Пользователь осуществляет поиск, до тех пор пока рецепт не будет найден.




  • Последующие условия: пользователю в окне браузера отображается нужный рецепт.

    Такой тип анализа помогает при разработке решений. Шаблон use-case соответствует шаблону функционирования самого кода программы. Секция "Процесс" последовательности use-case является алгоритмом, который является частью создаваемого программного решения.

    После проверки и подтверждения владельцем задокументированных последовательностей use-case их связывают с требованиями, определенными владельцем. Если use-case-не соответствуют этим требованиям, то они либо отбрасываются, либо определяются другие требования.

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

    Сценарии функционального тестирования

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

  • Сценарий тестирования оформляется в виде таблицы со следующими полями.
  • Последовательный номер. Номер, уникально идентифицирующий шаг в сценарии.
  • Элемент действия. Название или имя этапа; рекомендуется использовать имя, соответствующее началу действия или наличию раздела, в котором выполняется действие.
  • Действия пользователя. Описание действий по тестированию решения.
  • Входные данные. Описание действий для получения отклика от решения.
  • Ожидаемые результаты. Результаты работы решения.
  • Действительные результаты. Действительные результаты работы решения.
  • Успех или неудача тестирования. Значение типа boolean, отражающее успешное или неудачное прохождение теста.


  • Шаблон технической спецификации

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

    Создание технической спецификации

    После представления фасадной части в функциональную спецификацию вносятся изменения (если это необходимо), и, в случае одобрения владельцем, процесс моделирования считается завершенным. Документ XML "крайнего случая", созданный при моделировании фасадной части, определяет модель данных программного решения. Элементы XML внутри спецификаций XML представляют собой экземпляры объектов в формате языка XML. Заключительным действием этапа моделирования является описание способов конфигурирования имеющегося решения или создание нового решения, представляющего определенные в ходе фасадного моделирования объекты в виде XML.
    Техническая спецификация должна быть достаточно подробной, чтобы команда разработки разработала необходимое программное решение согласно указанным позициям. В этом случае помогает документирование, когда разработчика излагает свои соображения на бумаге. Техническая спецификация дополняет функциональную спецификацию планом построения программного обеспечения. Техническая спецификация включает в себя следующие элементы.
  • Определение каждого технического требования, чтобы разработчики соответствующим образом называли компоненты спецификации.
  • Запись контроля за изменениями.
  • Оглавление.
  • Титульная страница с именем владельца и названием проекта.
  • Нижний колонтитул с именем организации, сведениями о конфиденциальности и номером версии, использованными в функциональной спецификации.

  • При построении технической спецификации следует руководствоваться той же стратегией нумерации, что и в функциональной спецификации (см. рис. 6.4) Лицевая страница технической спецификации во многом похожа на титульную страницу функциональной спецификации.

    Стиль сайта

  • Описать внешний вид и стиль (шрифт, использование браузера и расположение окна) всего сайта в целом.

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

    Тестирование решения

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

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

    Таблица 6.5. Обзор промежуточных результатов этапа тестированияПорядок выполненияПромежуточный результатОтветственная сторона
    1Выполнение сценария тестированияКонтроль качества.
    2Описание ошибкиТестировщик.
    3Устранение ошибкиРазработчики.

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

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

    Унифицированный процесс

    В унифицированном процессе выделяются четыре этапа и пять технологических процессов, составляющих процедуру разработки. Итерация включает следующие этапы.
  • Отправная точка. Определение требований, которым должно удовлетворять ПО, и задач, которые оно должно выполнять.
  • Тщательная разработка. Создание решения, выполняющего поставленные задачи.
  • Конструирование. Программирование, документирование и настройка программного обеспечения.
  • Сдача работы. Выпуск программы или ее доставка заказчику.

  • Технологические процессы являются составными частями этапов. Каждый этап должен содержать все эти процессы.
  • Сбор требований. Выполнение исследований для определения требований и задач.
  • Анализ. Изучение собранных данных для выяснения конкретных целей создания программы.
  • Создание. Создание решения.
  • Применение. Переход к среде, в которой будет выполняться программное решение.
  • Тестирование. Проверка соответствия решения определенным требованиям.


  • Вне области

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

  • Данную область противопоставляют области функциональных задач, так как она содержит функциональные задачи, не включенные в рассматриваемое программное решение. Она уточняет представление всех участников проекта о том, что отсутствует в данном решении. Функциональные задачи, приведенные в предыдущей области, по-разному воспринимаются различными читателями. Если читатель не полностью ознакомился со всей функциональной спецификацией, он не поймет, что означает конкретная функциональная задача.

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

    Добавление пользователя в группу

  • В консоли MMC откройте запись Groups (Группы) в пункте Local Users and Groups (Локальные пользователи и группы).
  • Дважды щелкните на группе BeerBrewers Newsletter Group.
  • Нажмите на кнопку Add (Добавить).
  • Выберите учетную запись пользователя, которую следует добавить в данную группу.
  • Нажмите на кнопку OK два раза.


  • Добавление веб-сайтов в IIS

    Создадим на рассматриваемом сервере тестовый сайт. Необходимо иметь место для тестирования кода перед его окончательной реализацией. Тестовый сайт будет располагаться на том же сервере в только что созданном каталоге.
  • В консоли IIS MMC выделите Web Sites (Веб-узлы).
  • Выберите команду Action\New\Web Site (Действие\Создать\Веб-сайт).
  • Откроется мастер веб-сайта (Web Site Creation Wizard). Нажмите на кнопку Next (Далее).
  • Введите описание (beer-brewers.com test site).
  • Нажмите на кнопку Next (Далее).
  • В окне IP addresses and Port Settings (IP-адреса и параметры порта) в ниспадающем списке выберите IP-адрес.
  • Нажмите на кнопку Next (Далее).
  • В окне Web Site Home Directory (Домашний каталог веб-сайта) перейдите к папке тестового сайта и выделите ее.
  • Дважды нажмите на кнопку Next (Далее), после чего нажмите на кнопку Finish (Готово).

  • Повторите эти шаги для создания функционирующего веб-сайта.

    Написание кода

    Данный код реализует простой веб-сайт со страницей по умолчанию и меню, расположенным вверху страницы и содержащим три ссылки: Home, About Us и ссылку на страницу регистрации. Страница регистрации содержит форму, предназначенную для заполнения, которая передает информацию в базу данных для обеспечения ежемесячной отправки новостей. Данный сайт состоит из шести файлов (см. рис. 7.5).
    Написание кода
    Рис. 7.5.  Перечень файлов в каталоге
    Ниже приведен демонстрационный код каждого файла.
    Листинг 7.1. Default.htm (html, txt)
    Листинг 7.2. HomePage.htm (html, txt)
    Листинг 7.3. SignUp.htm (html, txt)
    Листинг 7.4. SignUpPost.asp (html, txt)
    Листинг 7.5. Top.htm (html, txt)
    Листинг 7.6. UnderConstruction.htm (html, txt)
    Данный код применяется к функционирующему сайту. Данные для функционирующего и тестового сайтов одинаковы, за исключением имени таблиц базы данных и URL тестового сайта. Один набор этих файлов располагается в каталоге функционирующего сайта, а другой – в каталоге тестирования. Страница newsletter.htm представляет собой лишь новостное письмо, и с ней не связан какой-либо код, поэтому здесь она не приводится.

    Листинг 7.3. SignUp.htm

    Server <% ' Set up and open the database using the DSN

    Set conn = Server.CreateObject("ADODB.Connection") Set rs = Server.CreateObject("ADODB.Recordset") conn.open "DSN=BeerBrewersDSN;" rs.open "BeerBrewersTable", conn, 2, 3

    ' Add a new record using all the fields in the form rs.addnew rs("FirstName") = request("FirstName") rs("LastName") = request("LastName") rs("Address") = request("Address") rs("City") = request("City") rs("State") = request("State") rs("Zip") = request("Zip") rs("Country") = request("Country") rs("Email") = request("Email")

    ' Update the records and close the connection rs.update rs.close conn.close

    ' Always close out the objects to eliminate memory leaks SET conn = Nothing SET rs = Nothing %>

    Your information has been updated. You will receive the newsletter in 4-6 weeks

    Thanks!



    Листинг 7.4. SignUpPost.asp

    Home

    Sign up for the newsletter

    Current Newsletter

    About Us



    Листинг 7.5. Top.htm

    Under Construction This page is under construction. Please come back later.

    Листинг 7.6. UnderConstruction.htm

    Данный код применяется к функционирующему сайту. Данные для функционирующего и тестового сайтов одинаковы, за исключением имени таблиц базы данных и URL тестового сайта. Один набор этих файлов располагается в каталоге функционирующего сайта, а другой – в каталоге тестирования. Страница newsletter.htm представляет собой лишь новостное письмо, и с ней не связан какой-либо код, поэтому здесь она не приводится.

    Настройка безопасности веб-сайта

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

    Настройка DNS

    После регистрации доменного имени необходимо создать зону и настроить записи DNS для сервера. Мы будем использовать сервер Microsoft DNS, входящий в комплект WS03. (Для получения инструкций по установке сервера DNS обратитесь к лекции 8 курса "Администрирование web-серверов в IIS".)
    Для создания зоны прямого поиска выполните следующие шаги.
  • Откройте консоль MMC DNS с помощью команды Start\Administrative Tools\DNS.
  • Щелкните правой кнопкой мыши на записи Forward Lookup Zones (Зоны прямого поиска) и выберите Select New Zone (Выбрать новую зону).
  • Откроется мастер новой зоны (New Zone Wizard). Нажмите на кнопку Next (Далее).
  • В нашем случае создается главная зона, поэтому выберите соответствующую опцию и нажмите на кнопку Next (Далее).
  • Введите имя зоны (beer-brewers.com). Наш сервер DNS не является контроллером домена, и мы не будет хранить его в Active Directory.
  • Имя файла зоны по умолчанию нам подходит, поэтому нажмите на кнопку Next (Далее).
  • Укажите, следует ли разрешить динамические обновления. Не обязательно обеспечивать динамическое обновление записей, так как изменяться они будут нечасто. Выберите опцию запрета динамических обновлений, после чего нажмите на кнопку Next (Далее).
  • Нажмите на кнопку Finish (Готово).

  • Настройка DNS
    Рис. 7.1.  Рассматриваемая зона DNS
    Теперь давайте создадим записи DNS. Мы видим? что уже имеются записи Start of Authority (SOA) и Name Server (NS) (см. рис. 7.1). Следует добавить две записи типа "А", чтобы пользователи осуществляли доступ к сайтам www.beer-brewers.com и test.beer-brewers.com.
  • Щелкните правой кнопкой мыши на зоне beer-brewers.com в области слева и выберите команду New Host (A) (Создать узел А).
  • Именем нашего узла является "www", так как оно используется всеми пользователями сети интернет. Введите в поле имени www (см. рис. 7.2).
    Настройка DNS
    Рис. 7.2.  Окно New Host (Новый узел) зоны www.beer-brewers.com
  • Введите IP-адрес рассматриваемого сайта (это IP-адрес, присвоенный серверу с IIS, выбранный ранее). Данный IP-адрес будет присвоен веб-сайту. Для записи WWW следует использовать IP-адрес сайта функционирования.
  • Для этой записи не будет создаваться Pointer Resource Record (PTR) (запись ресурса указателя), поскольку для блока IP не реализуется зона обратного поиска. Позже для добавления записи обратной зоны можно будет отправить IP-адрес и имя записи PTR поставщику услуг интернета.
  • Нажмите на кнопку Add Host (Добавить узел).
  • Нажмите на кнопку Done (Готово).
  • Повторите эти шаги для создания еще одной записи "А" для тестового сайта. Имя записи Host Record тестового сайта – test.

  • Мы создали в нашей зоне запись "А", позволяющую клиентам использовать www в имени хоста. Теперь при вводе пользователем вводить в адресной строке браузера адреса http://www.beer-brewers.com
    произойдет подключение к DNS-серверу, использующему IP-адрес, связанный с данным URL.

    Настройка параметров аутентификации

    После установки разрешений NTFS следует настроить в IIS параметры безопасности. Эти разрешения необходимо установить как для тестового, так и для функционирующего сайта (выполнить процедуру дважды).
  • Откройте консоль MMC IIS и найдите файл newsletter.htm.
  • Щелкните на файле правой кнопкой мыши и выберите Proeprties (Свойства).
  • Откройте вкладку File Security (Безопасность файлов).
  • Нажмите на кнопку Edit (Изменить) в области Authentication And Access Control (Аутентификация и контроль доступа).
  • Отключите опцию Enable Anonymous Access (Включить анонимный доступ).
  • Для сайта будет использоваться только базовая аутентификация, поэтому следует отметить опцию Basic Authentication (Базовая аутентификация) и отключить опцию Integrated Windows Authentication (Интегрированная аутентификация Windows).
  • Нажмите на OK один раз; вкладка File Security (Безопасность файлов) останется открытой.

  • Стоп!
    Читатель: Минуточку, разве базовая аутентификация рекомендуется к использованию, ведь в процессе ее работы пароль передается открытым текстом?
    Автор: Как правило, да. Но у нас есть сертификат! Весь трафик, связанный с данной страницей, будет зашифрованным.
    Читатель: Хорошо, у нас есть сертификат, но как заставить всех его использовать?
    Автор: Об этом рассказывается ниже.
    Принудительное использование SSL для обхода передачи паролей в открытом виде через интернет реализуется следующим образом.
  • Нажмите на кнопку Edit (Изменить) в области Secure Communications (Безопасные соединения).
  • Включите опцию Require Secure Channel (SSL).
  • При желании затребуйте 128-битное шифрование, однако в этом случае браузеры, в которых не установлена поддержка 128-битного шифрования, не смогут осуществлять доступ к сайту.
  • Нажмите на OK.два раза.

  • Теперь рассматриваемый файл защищен паролем, причем пароль также защищен.

    Настройка пула приложения

    После создания сайтов настало время заняться настройкой пула приложения. С тестовым сайтом связано небольшое количество трафика, поэтому он может оставаться в своем собственном пуле. Для функционирующего сайта мы создадим пул приложения. На данный момент он не особо нужен, так как наш сайт представляет собой лишь форму ASP, однако по мере его роста и применения более сложных компонентов (например, библиотек DLL ActiveX) потребность в рециркуляции рабочих процессов возрастет. Это также отделит процесс нашего функционирующего сайта от всех других сайтов.
    Для создания пула приложения для рассматриваемого сайта выполните следующие шаги.
  • В консоли IIS MMC выделите Application Pools (Пулы приложения).
  • Выберите команду Action\New\Application Pool (Действие\Создать\Пул приложения).
  • В окне Add New Application Pool (Добавление нового пула приложения) введите имя пула приложения (beer-brewers app pool).
  • Нажмите на кнопку OK.

  • На данный момент настройки по умолчанию данного пула приложения нас устраивают.
    Теперь присвоим данный пул приложения сайту:
  • В консоли IIS MMC выделите конечный сайт.
  • Выберите команду Action\Properties (Действие\Свойства).
  • В окне cвойств веб-сайта откройте вкладку Home Directory (Домашний каталог).
  • В ниспадающем списке Application Pool (Пул приложения) выберите новый пул приложения.
  • Нажмите на кнопку OK.


  • Обеспечение безопасности разрешений NTFS сайта

    При создании и форматировании нового устройства с использованием файловой системы NTFS ему присваиваются следующие разрешения.
    Учетная запись безопасностиРазрешения
    Группа локального администрированияПолный контроль.
    SYSTEMПолный контроль.
    CREATOR OWNER (Создатель-владелец)Полный контроль.
    Users (Пользователи)Чтение и выполнение, создание папок/присоединение данных, создание файлов/запись данных.
    Everyone (Все)Чтение и выполнение.

    Эти разрешения позволяют выполнять действия, выходящие за рамки того, что требуется для рассматриваемого сайта. Кроме того, Internet Guest Account (гостевая учетная запись интернета) не содержит легко контролируемых прав для данной папки, а только разрешения групп Everyone (Все) и Users (Пользователи). Не рекомендуется напрямую присваивать ресурсы определенной учетной записи, может потребоваться более высокий уровень контроля над тем, что доступно учетной записи анонимного пользователя. Выходом из данной ситуации является создание локальной группы, присвоение этой группе прав NTFS и включение в нее анонимного пользователя. Таким образом, для предоставления разрешения другой учетной записи пользователя ее нужно лишь добавить в эту группу.
    Разрешения папки настраиваются следующим образом.
  • Откройте консоль MMC Computer Management (Управление компьютером) с помощью команды Star\Administrative Tools\Computer Management (Пуск\Администрирование\Управление компьютером).
  • Разверните пункт Local Users and Groups (Локальные пользователи и группы).
  • Щелкните на контейнере Groups (Группы).
  • Создайте новую группу, выбрав команду Action\New Group (Действие\Создать группу). Отобразится окно New Group (Новая группа).
  • Укажите имя группы Anonymous Access for BeerBrewers Site. Это имя подходит также и для описания (см. рис. 7.3).
    Обеспечение безопасности разрешений NTFS сайта
    Рис. 7.3.  Группа Anonymous Access for BeerBrewers Site
  • Присвойте рассматриваемому сайту учетную запись Internet Guest Account (Гостевая учетная запись интернета), нажав на кнопку Add (Добавить) и введя имя учетной записи Internet Guest Account в окне Select Users.
    Как было сказано в лекцию 2 курса "Администрирование web-серверов в IIS", эта учетная запись создается при установке IIS, и ей присваивается имя IUSR_имя-компьютера. В нашем примере учетной записи присваивается имя IUSR_MYCOMPUTER.
  • Нажмите на кнопку OK, чтобы добавить учетную запись в область Members (Члены) группы.
  • Нажмите на кнопку Create (Создать) для завершения создания группы, затем нажмите на кнопку Close (Закрыть) для закрытия окна New group (Новая группа).


  • После создания группы ее можно включить в разрешения безопасности папки, в которой располагается веб-сайт. Создаваемый сайт является совершенно новым, поэтому сначала необходимо создать папку.

  • Создайте соответствующую папку на диске E: с помощью Проводника Windows (Windows Explorer) и назовите ее BeerBrewers Site.
  • Откройте окно свойств этой папки, щелкнув на ней правой кнопкой мыши и выбрав команду Properties (Свойства).
  • Откройте вкладку Security (Безопасность) папки (см. рис. 7.4). Первое, что необходимо сделать – отключить наследование разрешений. Нажмите на кнопку Advanced (Дополнительно) и отключите опцию Allow Inheritable Permissions From The Parent To Propogate To This Object And All Child Objects (Разрешить распространение наследуемых разрешений родительского объекта на данный объект и все дочерние объекты).
  • При отключении опции откроется диалоговое окно Security (Безопасность), предлагающее скопировать или удалить разрешения. Нажмите на кнопку Copy (Копировать), чтобы скопировать разрешения.
  • Нажмите на кнопку OK для выхода из окна Advanced Security Settings (Дополнительные настройки безопасности).
  • Удалите объекты Creator Owner (Создатель-владелец) и Users (Пользователи) из списка Group Or User Names (Группы или имена пользователей), щелкая на имени и нажимая на кнопку Remove (Удалить).
  • Рассматриваемая группа Anonymous (Анонимные пользователи) будет по умолчанию иметь разрешения Read & Execute (Чтение и выполнение), List Folder Contents (Просмотр содержимого папки) и Read (Чтение) (см.рис. 7.4). Эти параметры приемлемы для рассматриваемого сайта.


  • Обеспечение безопасности разрешений NTFS сайта
    Рис. 7.4.  Вкладка окна Site Properties (Свойства сайта)

    Мы создали папку, управление которой осуществляют группы Administrators (Администраторы) и Operating System (Операционная система), а чтение и выполнение – все остальные лица. Повторите шаги 1-7 для создания среды разработки для разрабатываемого веб-сайта BeerBrewers Test Site. Для разрешений используйте одну и ту же группу (на самом деле такой подход даже лучше).

    Перенос сайта в среду функционирования

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

    Перенос сайта в среду функционирования
    Перенос сайта в среду функционирования
    © 2003-2007 INTUIT.ru. Все права защищены.

    Подготовка сервера

    Данный процесс включает в себя:
  • проверку устойчивости сервера;
  • создание каталога для веб-сайта;
  • обеспечение безопасности разрешений файловой системы NTFS для сайта.


  • Получение доменного имени

    Первым шагом является выбор и получение доменного имени. В большинстве случаев сначала нужно определить, свободно ли доменное имя, после чего зарегистрировать его в режиме онлайн. Многие имена доменов уже заняты, но, тем не менее, имеются и свободные имена (добавьте в имя дополнительные символы или слова). Например, если имя beerbrewers.com уже занято, выберите другое имя: beer-brewers.com, sudsbrewers.com или berbrewerz.com. Выберите другое расширение: beerbrewers.org или beerbrewers.biz. Некоторые регистраторы имен доменов налагают ограничения на использование доменов верхнего уровня (TLD); чтобы выяснить это, посетите веб-сайт компании-регистратора.
    Остановимся на имени beer-brewers.com (предположим, что оно свободно). После выбора имени домена его необходимо зарегистрировать. Каждая компания-регистратор предусматривает свой процесс регистрации, поэтому в данном случае также следует посетить ее сайт. В большинстве компаний запрашивается следующая информация.
  • Имя.
  • Адрес.
  • Телефон/факс.
  • Техническая контактная информация.
  • Административная контактная информация.
  • Имя пользователя и пароль регистрируемого сайта.
  • Имя и IP-адрес сервера службы DNS, на котором располагаются записи.
  • Информация об оплате.

  • Регистраторы сохраняют только информацию о сервере DNS, на котором располагаются записи домена; они не хранят информацию о записях A в зонах, созданных клиентом в данном домене. Следовательно, нужно предоставить только имена первичного и вторичного серверов DNS, на которых расположены записи рассматриваемого домена. После настройки этих параметров рекомендуется реализовать хостинг записей сайта на раздельных серверах DNS. Нередко при использовании высокоскоростного подключения (не ниже T1) поставщик услуг интернета (ISP) выступает в роли вторичного сервера DNS для компании-регистратора.
    Примечание. Как говорилось в лекции 8 курса "Администрирование web-серверов в IIS", зона "A" является частью домена DNS. Термин "зона" обычно используется для обозначения части домена по отношению к серверу DNS. Поддоменом называется часть домена, входящая в состав зоны. Если в домене существует только одна зона, то используется любой из этих терминов. Запись "А" представляет собой запись DNS Address. Этот тип записи идентифицирует запись несущего ресурса и связывает доменное имя DNS с 32-битным адресом IPv4.

    Получение IP-адреса

    Следующим шагом является получение двух IP-адресов от поставщика услуг интернета (или выбор адресов из блока доступных). После этого адреса можно присвоить серверу: один IP-адрес – для тестового сайта, а другой – для функционирующего. Необходимы статические неизменные IP-адреса; их изменение сделает веб-сайт недоступным, до тех пор пока не будет обновлен DNS.
    После получения статических IP-адресов они присваиваются серверу следующим образом.
  • В Control Panel (Панель управления) откройте Network Connections (Сетевые подключения).
  • Дважды щелкните на соединении, которое будет использовать данный IP-адрес. В зависимости от конфигурации компьютера в окне присутствует одно или несколько подключений.
  • В появившемся диалоговом окне Status (Состояние) нажмите на кнопку Properties (Свойства).
  • Отобразится окно свойств для рассматриваемого соединения. Выберите Internet Protocol (TCP/IP), после чего нажмите на кнопку Properties (Свойства).
  • Нажмите на кнопку Advanced (Дополнительно) в появившемся окне свойств для открытия окна Advanced TCP/IP Settings (Дополнительные параметры TCP/IP).
  • В области IP-адреса вкладки IP Settings (Настройка IP) (вкладка по умолчанию) нажмите на кнопку Add (Добавить).
  • Введите IP-адрес и маску подсети тестового сайта в окне TCP/IP Address (Адрес TCP/IP), после чего нажмите на кнопку Add (Добавить).
  • Повторите шаги 6 и 7 для присвоения IP-адреса функционирующему сайту.
  • Присвойте рассматриваемому соединению шлюз по умолчанию, если таковой отсутствует.
  • Нажмите дважды на кнопку OK, после чего нажмите на кнопку Close (Закрыть).

  • Одному интерфейсу можно присвоить несколько IP-адресов. Запомните их, так как они потребуются в дальнейшем.
    Примечание. У пользователя может возникнуть вопрос: "А как же заголовки узла? Ведь они позволяют иметь несколько веб-сайтов на сервере?". Это хороший вопрос. Обычно заголовки узлов используются, поскольку с их помощью реализуется экономия IP-адресов. К сожалению, протокол защищенных сокетов SSL и заголовки узлов несовместимы друг с другом. Информация заголовка шифруется при передаче через SSL, поэтому ее сложно расшифровывать. Поэтому в нашем примере используется IP-адрес.

    Получение сертификата для функционирующего сайта

    Для функционирующего сайта, необходимо получить коммерческий сертификат, особенно, если сайт взаимодействует с большим количеством пользователей. В интрасети можно получить сертификат из собственного бюро сертификатов, так как это бюро можно установить в браузерах всех клиентов. Но это нельзя реализовать в интернете. Вы сможете получить сертификат в своем собственном бюро сертификатов, но оно будет генерировать сообщение с предупреждением всех клиентов при их доступе к любым сайтам через SSL, что отобьет их желание посещать такой сайт. Выпуск собственного сертификата с помощью своего CA является рискованной операцией, особенно, если корневые CA были когда-то доступны посторонним. По этим причинам для публично доступных сайтов рекомендуется использовать коммерческое бюро сертификатов.
    Процесс получения сертификата функционирующего сайта аналогичен случаю с тестовым сайтом, за исключением того, что коммерческий сертификат запрашивается у коммерческого CA, и отправляется файл запроса.
  • Запросите сертификат в консоли IIS MMC.
  • Откройте сайт коммерческого бюро сертификатов и запросите сертификат.
  • Отправьте в онлайн-бюро файл запроса, сгенерированный в IIS.
  • Обработайте запрос посредством установки файла ответа CA.

  • Каждое коммерческое бюро сертификатов имеет свой процесс получения сертификата. Важно помнить, что информация запроса на сертификат должна соответствовать информации, используемой в запрашивающей организации. Для больших компаний большое значение имеет номер D-U-N-S. В нашем случае не идет речь о корпорации, поэтому идентификация рассматриваемой компании осуществляется отправкой письма от президента клуба на официальном бланке компании. В остальном же для установки сертификата необходимо выполнить такие же шаги, как и для тестового сайта.
    Примечание. Обратитесь к лекции 10 курса "Администрирование web-серверов в IIS" для получения дополнительной информации, связанной с сертификатами.

    Получение сертификата для тестового сайта

    Так как рассматриваемый сайт осуществляет сбор имен, адресов и другой личной информации, следует применить шифрование интернет-трафика. Кроме того, подлинность сайта в интернете будет доказываться сертификатом, за счет чего пользователи будут относиться к сайту с большим доверием. Для тестового сайта подойдет "доморощенный" сертификат. Для основного функционирующего сайта потребуется коммерческий сертификат.
    Как говорилось в лекции 10 курса "Администрирование web-серверов в IIS", свое собственное бюро сертификатов (CA) рекомендуется сделать автономным корневым бюро сертификатов, после чего делегировать сертификат подчиненному CA. Затем можно использовать подчиненное бюро сертификатов для выпуска сертификатов без опасности проникновения злоумышленника во всю систему сертификации. Так как рассматриваемый сертификат предназначается для тестового сайта, который не будет отображаться конечным пользователям, нам проще создать CA и выпустить с его помощью сертификат. По-прежнему рекомендуется выпускать сертификат с другого компьютера. Кроме всего прочего, мы используем тестовый сертификат лишь для того, чтобы убедиться в корректной настройке кода SSL.
    Получение и установка тестового сертификата состоит из трех шагов.
  • Запрос сертификата в IIS MMC.
  • Создание запроса на сертификат, генерация сертификата в CA MMC и экспорт сертификата.
  • Обработка запроса и установка экспортированного сертификата обратно в IIS MMC.

  • Запрос на сертификат осуществляется следующим образом.
  • Установите Certificate Services (Службы сертификатов) на другой компьютер.
  • Откройте окно Properties (Свойства) для тестового веб-сайта.
  • На вкладке Directory Security (Безопасность каталога) нажмите на кнопку Server Certificate (Сертификат сервера).
  • Отобразится мастер сертификата веб-сервера (Web Server Certificate Wizard). Нажмите на кнопку Next (Далее).
  • Выберите создание нового сертификата, после чего нажмите на Next (Далее).
  • Выберите опцию Prepare The Request Now, But Send It Later (Подготовить запрос сейчас, но отправить его позже) и нажмите на Next (Далее).
  • Введите имя сертификата: beer-brewers.com test site.
  • Выберите число бит; в нашем случае достаточно 1024.
  • Нажмите на кнопку Next (Далее).
  • Введите название организации: beer-brewers.com.
  • Отдел организации относится к тем организациям, в которых имеется несколько отделов или подразделений. В нашем случае просто укажите beer-brewers.com.
  • Нажмите на кнопку Next (Далее).
  • Общее имя является важным параметром, оно представляет собой имя DNS сайта. Поэтому для нашего сайта мы будем использовать имя test.beer-brewers.com.
  • Нажмите на кнопку Next (Далее).
  • Выберите Country/Region (Страна/регион), State/Province (Штат/область) и City/Locality (Город/Район). Сокращения здесь использовать не следует.
  • Нажмите на кнопку Next (Далее).
  • Укажите имя для запроса на сертификат. Запомните это имя и расположение; файл запроса понадобится нам в следующем разделе.
  • Нажмите на кнопку Next (Далее) дважды.
  • Нажмите на кнопку Finish (Готово).


  • После создания запроса на сертификат можно выпустить сам сертификат.

  • Откройте консоль MMC Certification Authority (Бюро сертификатов).
  • Выделите имя CA, после чего выберите Action\All Tasks\Submit New Request (Действие\Все задачи\Отправить новый запрос).
  • Перейдите к расположению запроса на сертификат. Если он расположен на компьютере, не доступном через сеть, придется скопировать запрос на гибкий диск и перенести его на этот компьютер.
  • Выделите файл и нажмите на кнопку Open (Открыть).
  • Запрос на сертификат теперь расположен в папке Pending Requests. Далее необходимо выпустить сертификат. Выделите запрос в папке Pending Requests, после чего выберите команду Action\All Tasks\Issue (Действие\Все задачи\Выпустить).
  • После этого сертификат будет перемещен в папку Issued Certificates (папка изданных сертификатов). Теперь сертификат можно экспортировать для отправки на веб-сервер. Выделите сертификат в папке Issued Certificates и выполните команду Action\All Tasks\Export Binary Data (Действие\Все задачи\Экспорт двоичных данных).
  • Выберите экспорт Binary Certificate (Двоичный сертификат) и сохраните двоичные данные в файле.
  • Нажмите на кнопку OK.
  • Выберите имя для данного сертификата. Запомните имя и расположение; этот файл понадобится в следующем разделе. Рекомендуется использовать расширение .cer.


  • Теперь можно вернуться в IIS и обработать запрос для использования.

  • В консоли MMC запустите мастер сертификатов веб-сервера (Web Server Certificate Wizard).
  • Нажмите на кнопку Next (Далее).
  • Выберите обработку запроса в ожидании, после чего нажмите на кнопку Next (Далее).
  • Выберите файл сертификата, после чего нажмите на кнопку Next (Далее).
  • Выберите порт SSL, используемый для данного сертификата. Значение по умолчанию 443 нам подойдет. Нажмите на кнопку Next (Далее).
  • Нажмите на Next (Далее), после чего нажмите на кнопку Finish (Готово).


  • Теперь у нас есть полностью установленный сертификат тестового сайта, и его можно использовать при тестировании кода. По окончании работы не забудьте удалить как файл запроса, так и экспортированный файл сертификата. Заполучив эти файлы, кто-то сможет осуществить несанкционированный доступ к сертификату.

    Проверка устойчивости сервера

    Если сервер находится в среде интернета, важно обеспечить его безопасность. В лекции 6 подробно описан процесс разработки методологии безопасности. В нашем случае используется базовый контрольный перечень мероприятий по обеспечению безопасности.
  • Установлены все необходимые надстройки операционной системы и приложений, особенно надстройки безопасности?
  • Включен на рассматриваемом сервере аудит в локальной политике безопасности?
  • Все учетные записи данного сервера имеют сложный пароль?
  • Включены в IIS только необходимые опции?
  • Используется файловая система NTFS, и являются разрешения безопасными?
  • Используются для каких-либо компонентов повышенные привилегии?
  • Существует постоянная оценка и обновление безопасности на данном сервере?


  • Создание базы данных

    База данных будет содержать всю информацию, используемую для отправки новостных писем. Нам понадобится идентифицировать все поля базы данных, чтобы сконструировать ее. Ниже приведен список полей базы данных.
    ИнформацияИмя поляТип поляДлина поля
    ИмяFirstNameText255
    ФамилияLastNameText255
    АдресAddressText255
    ГородCityText255
    РегионStateText255
    Почтовый кодZipText255
    СтранаCountryText255
    Адрес электронной почтыEmailText255

    Следующим шагом будет создание базы данных. База данных должна иметь разрешение на запись для анонимного пользователя, поэтому нужно добавить соответствующее разрешение в список разрешений NTFS. По этой причине рекомендуется располагать базу данных в другом каталоге, чем папка с веб-сайтом. Если сайт и база данных находятся в одном каталоге, поэтому легко изменить разрешения таким образом, что никто не сможет осуществить запись в базу данных, или, что еще хуже, открыть разрешения для всего каталога. При открытии файла в программе Microsoft Access создается файл .LDB, являющийся файлом блокировки. Если анонимный пользователь не сможет создавать и уничтожать файлы в каталоге с базой данных, то возникнут определенные проблемы.
    Давайте создадим каталог на диске E: и присвоим ему имя Databases. Убедитесь, что группа доступа Anonymous (Анонимные пользователи) имеет права на изменение данного каталога.
    Для создания базы данных используйте либо графический интерфейс пользователя в Microsoft Access, либо выражение SQL. Присвоим базе данных имя BeerBrewersDB.mdb, а таблицу назовем BeerBrewersTable. Графический интерфейс пользователя достаточно информативен; ниже приводится выражение SQL, использующееся для создания таблицы:
    create table BeerBrewersTable ( FirstName varchar(255), LastName varchar(255), Address varchar(255), City varchar(255), State varchar(255), Zip varchar(255), Country varchar(255), Email varchar(255) )
    После создания базы данных создадим для нее DSN.
  • Выберите команду Start\Administrative Tools\Data Sources (ODBC) (Пуск\Администрирование\Источники данных ODBC).
  • В окне Data Sources Administrator (Администратор источников данных) откройте вкладку System DSN (Системное DSN).
  • Нажмите на кнопку Add (Добавить) для добавления нового источника данных.
  • В окне Create New Data Source (Создание нового источника данных) выберите опцию Microsoft Access Driver (*.mdb) (Драйвер Microsoft Access).
  • Нажмите на кнопку Finish (Готово).
  • Введите имя источника данных: BeerBrewersDSN.
  • Нажмите на кнопку кнопку Select (Выбрать) и перейдите к базе данных Access, созданной ранее (E:\Databases\BeerBrewersDB.mdb).
  • После выбора базы данных Access нажмите на кнопку OK несколько раз, чтобы закрыть окно ODBC Administrator (Администратор ODBC).

  • Выполните те же шаги для тестовой базы данных, предназначенной для тестового веб-сайта. При желании можно создать в базе данных BeerBrewersDB.mdb еще одну таблицу. Таким образом, исчезнет необходимость в создании каталога или нового DSN, и можно будет просто вставить новую таблицу с теми же параметрами.
    Совет. Если для создания таблицы используется Microsoft Access, то убедитесь в том, что все поля установлены равными значению Allow Zero Length = Yes (Разрешить нулевую длину = Да). Значением по умолчанию является No (Нет), но в этом случае возникнет ошибка, если не все поля будут заполнены.

    Создание группы

  • Откройте консоль MMC Computer Management (Управление компьютером).
  • Выделите в пункте Local Users and Groups (Локальные пользователи и группы) запись Groups (Группы).
  • Выберите команду Action\New Group (Действие\Создать группу).
  • Введите имя группы: BeerBrewers Newsletter Group.
  • Нажмите на кнопку Create (Создать).


  • Создание каталога для веб-сайта

    По умолчанию IIS устанавливается в каталог C:\Inetpub. Вероятно, потребуется отделить файлы операционной системы от файлов приложений, установленных на рассматриваемом компьютере. Веб-сайта можно записать на другое устройство (например, на D:) либо создать папку Web Site на диске E: и записать в нее файлы веб-сайта. Так обеспечивается безопасность с наследованием разрешений. Кроме того, обновление, форматирование или повреждение устройства C: не влияет на данные, хранящиеся на диске D: или E:.

    Создание пользователей

  • В консоли MMC выделите в пункте Local Users and Groups (Локальные пользователи и группы) запись Users (Пользователи).
  • Выберите команду Action\New User (Действие\Создать пользователя).
  • Введите имя пользователя и пароль нового пользователя.
  • Отключите опцию User Must Change Password At Next Logon (Пользователь должен изменить пароль при следующем входе).
  • Нажмите на кнопку Create (Создать).


  • Создание учетной записи пользователя

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

    Тестирование кода

    Протестируем наш код перед включением его в работу. Сначала создайте детальный план, проверочный перечень действий, который будет выглядеть примерно так.
  • Проверено правильное функционирование каждой страницы?
  • Все ссылки сайта функционируют?
  • Присутствуют поврежденные или ненужные ссылки?
  • Установлен и работает ли DSN?
  • Генерируется сообщение об ошибке при незаполнении полей?
  • Является конфигурация безопасности излишней, недостаточной или подходящей?
  • Правильно функционирует SSL?
  • Присутствуют на данном компьютере двоичные файлы сертификата и запроса?
  • Правильно настроены разрешения файловой системы?
  • Возможно вызвать сбой в системе посредством ввода некорректных данных?

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

    Установка разрешений NTFS

    После создания группы ей нужно присвоить права файловой системы. До этого мы присвоили права анонимной группе; теперь настало время добавить в список группу сайта BeerBrewers. Группу следует связывать только с тем файлом (файлами), который должен быть защищен. В данном случае речь идет о файле newsletter.htm.
  • В Windows Explorer (Проводник Windows) найдите файл newsletter.htm.
  • Щелкните на файле правой кнопкой мыши и выберите Properties (Свойства).
  • Откройте вкладку Security (Безопасность).
  • Нажмите на кнопку Add (Добавить).
  • Найдите группу BeerBrewers Newsletter Group.
  • Нажмите на OK.
  • Наделите группу BeerBrewers Newsletter Group правами чтения и выполнения файла.
  • Нажмите на OK.


  • Включение ASP

    При первой установке веб-сервера страницы ASP отключены согласно политике Microsoft "отключения по умолчанию". Из этого следует, что их нужно включить для рассматриваемого веб-сервера.
  • В консоли IIS MMC щелкните на пункте Service Extensions (Расширения служб), чтобы развернуть папку.
  • Выделите пункт Active Server Pages (ASP), после чего нажмите на Allow (Разрешить).

  • Все довольно просто. Теперь технология ASP включена для всех сайтов на данном сервере.

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

    Динамическое веб-содержимое

    Если возникли проблемы с динамическим содержимым, помните, что по умолчанию IIS обслуживает только статическое содержимое. Все динамическое содержимое должно активизироваться в области Web Service Extensions (Расширения веб-службы) консоли MMC IIS. Если используется, но не включена, технология ASP, то при попытке клиентов доступа к файлу ASP они получат сообщение об ошибке 404. При использовании расширенного журнала в нем будет содержаться ошибка 404.2 ("Файл или каталог не найден: политика блокировки запрещает данный запрос".
    Чтобы включить динамическое содержимое, перейдите в секцию Web Service Extensions (Расширения веб-службы) консоли MMC IIS. Здесь можно добавить расширения веб-службы и разрешить их выполнение.
    Следующие расширения веб-служб являются предопределенными:
  • все неизвестные расширения ISAPI;
  • все неизвестные расширения CGI;
  • страницы Active Server Pages;
  • серверные расширения BITS (если установлены);
  • серверные расширения FrontPage Server Extensions 2002 (если установлены);
  • Internet Data Connector;
  • интернет-печать;
  • включения серверной части;
  • WebDAV.

  • Чтобы включить расширение службы, выделите его в консоли MMC и нажмите на кнопку Allow (Разрешить). Если нужного расширения нет в списке, то его можно добавить, а затем нажать на кнопку Allow (Разрешить).
    Примечание. Прекрасным средством для решения проблем с расширениями веб-служб является гиперссылка Allow All Web Service Extensions For A Specific Application (Разрешить все расширения веб-служб для определенного приложения). Она используется для включения всех расширений, от которых зависит работа одного конкретного расширения.

    Файлы журналов

    Стоит ли говорить, насколько сильно изучение файлов журналов помогает при разрешении проблем, связанных с сервером IIS. Двумя главными файлами журналов, с которыми следует работать, являются файл журнала IIS (рекомендуется формат W3C) и Windows Event Viewer (Просмотр событий Windows).

    Использование оповещений в Performance Monitor

    Программа Performance Monitor (Индикатор производительности) имеет настраиваемые пороговые значения, по достижении которых инициируются действия по обработке. Это позволяет отслеживать состояние сервера и обнаруживать неполадки.
    Ниже приведены инструкции по созданию оповещения.
  • В левой области Performance Logs (Журналы производительности) щелкните на записи Alerts (Оповещения).
  • Выберите команду Action\New Alert Settings (Действие\Параметры нового оповещения).
  • В окне New Alert Settings (Параметры нового оповещения) введите имя нового оповещения.
  • Нажмите на клавишу OK.
  • В открывшемся окне свойств с помощью вкладок General (Общие), Action (Действие) и Schedule (Расписание) произведите настройку создаваемых оповещений.


  • Мониторинг производительности

    Необходимо осуществлять мониторинг производительности сервера IIS. Можно иметь программу, написанную лучшими специалистами в мире, однако если сервер, на котором располагается эта программа, будет обладать недостаточно высокой мощностью, то могут возникнуть проблемы, связанные с производительностью. Программа Windows Performance Monitor (Индикатор производительности Windows) (см. рис. 8.2) позволяет фиксировать данные в файле, после чего проверять эти данные на наличие проблем с производительностью. В ОС Windows имеется более 50 объектов производительности, которые можно отслеживать. Программа Performance Monitor (Индикатор производительности) позволяет отслеживать систему в реальном времени, генерировать журналы для дальнейшего просмотра, а также генерировать оповещения, выдаваемые при возникновении настраиваемых условий. Ниже описываются счетчики, которые представляют наибольший интерес при ведении журнала на сервере IIS.
    Мониторинг производительности
    увеличить изображение
    Рис. 8.2.  Индикатор производительности
  • Active Server Pages (ASP). Фиксируют ошибки в сценариях ASP, кэшах шаблонов, статистические данные, связанные с запросами и многое другое.
  • FTP Service (Служба FTP). Отслеживают полное количество байт, соединений, прерванных пользователями и операциями входа, а также передачи файлов. Internet Information Services Global.Отслеживают большие двоичные объекты (BLOB), а также статистическую информацию о файлах и кэшировании URI.
  • Memory (Память). Фиксируют данные об использовании памяти, а также о качестве страничной организации памяти.
  • Network Interface (Сетевой интерфейс). Фиксируют переданные байты, использованную полосу пропускания, а также качество передачи пакетов, включая возникшие ошибки.
  • NNTP Commands (Команды NNTP). Ведут статистику того, сколько команд каждого типа NNTP принимается сервером.
  • NNTP Server (Сервер NNTP). Отслеживают количество байт, пользователей, соединений и поступления данных.
  • Physical Disk (Физический диск). Записывают информацию о передаче данных физическим диском.
    Это позволяет определить достижение сервером предела ввода/вывода информации.
  • Processor (Процессор). Записывают процентные значения времени, в течение которого процессор обрабатывает команды, а также состояние процессора.
  • Server (Сервер). Ведут статистику о страничном файле, трафике входа в систему, ошибках и пр.
  • SMTP NTFS Store Driver (Драйвер хранения SMTP NTFS). Отслеживает количество расположенных на сервере сообщений, удаленных сообщений, пронумерованных сообщений и сообщений, находящихся в очереди.
  • SMTP Server (Сервер SMTP). Содержит более 100 счетчиков, предназначенных для фиксирования дополнительной информации о сообщениях.
  • Web Service (Веб-служба). Содержит около 85 счетчиков, отслеживающих различные типы запросов HTTP и ошибок, запросов CGI/ISAPI и информацию о подключениях.
  • Web Service Cache (Кэш веб-службы). Фиксируют статистические данные о компоненте веб-сервера, включая успешное и неудачное выполнение операций для различных элементов, используемых веб-службой. Большая часть счетчиков взаимодействует с кэшированием URI.


  • Мониторинг в реальном масштабе времени

    С помощью System Monitor (Системного индикатора) осуществляется мониторинг сервера в реальном времени.
  • Откройте консоль MMC Performance (Производительность), выбрав команду Start\Administrative Tools\Performance (Пуск\Администрирование\Производительность).
  • Щелкните на System Monitor (Системный индикатор) (этот элемент выделен по умолчанию).
  • На панели инструментов вверху индикатора щелкните на значке "+".
  • В диалоговом окне Add Counters (Добавить счетчики) укажите, какой компьютер необходимо отслеживать; по умолчанию выбран рассматриваемый компьютер.
  • Из ниспадающего списка выберите объект Performance (Производительность), который необходимо использовать.
  • Выберите из списка отдельный счетчик.
  • При наличии нескольких процессоров выберите тот процессор, для которого выполняется мониторинг, либо выберите значение Total (Все).
  • Нажмите на кнопку Add (Добавить). Счетчик будет добавлен, но окно Add Counters (Добавление счетчиков) останется активным.
  • Повторите шаги 3-7 для каждого счетчика, который необходимо добавить.
  • После добавления всех соответствующих счетчиков нажмите на кнопку Close (Закрыть).

  • Эта операция поможет выполнять мониторинг в режиме реального времени, однако обеспечит долгосрочного фиксирования информации. Для этого предназначены журналы счетчиков.

    О ведении журнала W3C

    Так как журнал W3C содержит наиболее полный набор полей, в которые записываются данные, данный журнал наиболее полезен при разрешении проблем. Если журнал W3C Extended не используется, можно временно сменить тип журнала в процессе отслеживания проблем, но только в том случае, если данные журнала сайта не используются для каких-либо других важных целей. Журнал W3C Extended может содержать очень большой объем информации о сайте.
    Какая учетная запись используется клиентом для доступа к сайту?
    Если разрешаются проблемы, связанные с разрешениями, то полезно знать, какую учетную запись использует клиент для доступа к сайту. Если в системе установлена интегрированная аутентификация Windows, браузер не запрашивает у пользователя аутентификационные данные, поэтому в данном случае трудно определить, какую учетную запись они используют. К счастью, здесь помогает файл журнала.
    Какой браузер используется клиентом для доступа к сайту?
    Некоторые браузеры не поддерживают определенные возможности. Например, проверка подлинности в интегрированной аутентификации Windows поддерживается только браузерами Internet Explorer. Если анонимный доступ отключен, и у клиента нет другого выбора, нежели использование интегрированной аутентификации Windows, доступ к сайту смогут получить только пользователи браузера Internet Explorer. Посредством изучения файлов журналов, можно выяснить, какие браузеры используются для доступа к сайту.
    Какие передаются коды состояния?
    Когда IIS передает сообщение об ошибке, на самом деле не отправляется конкретное сообщение об ошибке; вместо этого генерируется общая ошибка. Это означает, что клиент не получает код подсостояния. Если политика блокировки запрещает клиенту доступ к файлу, клиент получает характерную ошибку "404 not found", в то время как расширенный файл журнала будет содержать полную информацию об ошибке 404.2. В дополнение к этому, коды stats находятся в одной строке с временем/датой, пользователем, Internet Protocol (IP), браузером и т.д., поэтому гораздо легче связать сообщение об ошибке с конкретным клиентом.

    Базовый перечень кодов состояния HTTP определен RFC 2616. Эти коды являются расширяемыми, поэтому дополнять этот список могут различные организации. Microsoft добавила свою реализацию кодов подсостояния. В таблице 8.1 приведены оба набора кодов и их базовые значения.

    Таблица 8.1. Коды состояния HTTP и их значенияКодЗначение
    100Продолжение.
    101Переключение протоколов.
    200OK.
    201Создано.
    202Принято.
    203Неавторитетная информация.
    204Нет содержимого.
    205Сброс содержимого.
    206Частичное содержимое.
    300Несколько вариантов.
    301Удалено окончательно.
    302Найдено.
    303Смотреть другие.
    304Не изменено.
    305Использовать proxy.
    307Временное перенаправление.
    400Некорректный запрос.
    401Неавторизованный доступ.
    401.1Неавторизованный доступ: Доступ запрещен по причине неверных аутентификационных данных.
    401.2Неавторизованный доступ: Доступ запрещен по причине использования сервером другого метода аутентификации.
    401.3Неавторизованный доступ: доступ запрещен согласно списку контроля доступа (ACL), установленному на запрашиваемом ресурсе.
    401.4Неавторизованный доступ: аутентификация отклонена фильтром, установленным на веб-сервере.
    401.5Неавторизованный доступ: аутентификация отклонена приложением Internet Server Application Programming Interface/Common Gateway Interface (ISAPI/CGI).
    401.7Неавторизованный доступ: доступ запрещен согласно политике авторизации URL на веб-сервере.
    402Необходим платеж.
    403Доступ запрещен.
    403.1Доступ запрещен: в доступе на выполнение отказано.
    403.2Доступ запрещен: в доступе на чтение отказано.
    403.3Доступ запрещен: в доступе на запись отказано.
    403.4Доступ запрещен: для просмотра данного ресурса требуется протокол SSL.
    403.5Доступ запрещен: для просмотра данного ресурса требуется SSL 128.
    403.6Доступ запрещен: IP-адрес клиента отклонен.
    403.7Доступ запрещен: требуется сертификат клиента SSL.
    403.8Доступ запрещен: имя системы имен доменов (DNS) клиента отклонено.
    403.9Доступ запрещен: слишком много клиентов пытаются подключиться к веб-серверу.
    403.10Доступ запрещен: веб-сервер настроен на отказ в доступе на выполнение.
    403.11Доступ запрещен: пароль был изменен.
    403.12Доступ запрещен: сертификат клиента отклонен связями сертификата сервера.
    403.13Доступ запрещен: сертификат клиента был аннулирован на веб-сервере.
    403.14Доступ запрещен: перечень каталогов отклонен на веб-сервере.
    403.15Доступ запрещен: права доступа клиента превысили предельно допустимые на сервере.
    403.16Доступ запрещен: сертификат клиента некорректен или не пользуется доверием веб-сервера.
    403.17Доступ запрещен: сертификат клиента просрочен или еще не вступил в силу.
    403.18Доступ запрещен: Невозможно выполнить запрошенный URL в текущем пуле приложения.
    403.19Доступ запрещен: невозможно выполнить CGI для клиента в данном пуле приложения.
    403.20Доступ запрещен: доступ по паспорту не удался.
    404Не найден.
    404.1Файл или каталог не найден: веб-сайт недоступен через запрашиваемый порт.
    404.2Файл или каталог не найден: политика блокировки запрещает данный запрос.
    404.3Файл или каталог не найден: политика связей Multipurpose Internet Mail Extensions (MIME) запрещает данный запрос.
    405Метод запрещен.
    406Неприемлемо.
    407Требуется аутентификация proxy.
    408Время запроса истекло.
    409Конфликт.
    410Утеряно.
    411Требуется значение длины.
    412Предварительное условие не прошло.
    413Запрос слишком велик.
    414Идентификатор URI слишком велик.
    415Неподдерживаемый тип носителя.
    416Запрошенный диапазон не удовлетворителен.
    417Предположение неверно.
    500Внутренняя ошибка сервера.
    500.11Ошибка сервера: приложение завершает работу на веб-сервере.
    500.12Ошибка сервера: приложение перезапускается на веб-сервере.
    500.13Ошибка сервера: веб-сервер занят.
    500.14Ошибка сервера: неверная конфигурация приложения на веб-сервере.
    500.15Ошибка сервера: прямые запросы GLOBAL.ASA не разрешены.
    500.16Ошибка сервера: неверные аутентификационные данные UNC.
    500.17Ошибка сервера: хранилище авторизации URL не может быть найдено.
    500.18Ошибка сервера: хранилище авторизации URL не может быть открыто.
    500.19Ошибка сервера: данные для этого файла в метабазе сконфигурированы неверно.
    500.20Ошибка сервера: область авторизации URL не может быть найдена.
    500.100Внутренняя ошибка сервера: ошибка ASP.
    501Не применено.
    502Неисправный шлюз.
    503Служба недоступна.
    504Истек период ожидания шлюза.
    505Версия HTTP не поддерживается.

    Отключение веб-службы

    В некоторых случаях клиент получает сообщение об ошибке HTTP 503. При появлении ошибок 503 события записываются в журнал событий Windows. В этом случае следует открыть Event Viewer (Просмотр событий) и проверить, где возникла ошибка – в файле HTTP.sys или в службе WWW. Если ошибка возникла в HTTP.sys, проверьте длину очереди пула приложения. Ошибка могла возникнуть из-за получения слишком большого количества запросов. Очередь пула приложения можно изменить вручную.
  • В консоли MMC IIS выделите пул приложения, который необходимо изменить.
  • Выберите команду Action\Propеrties (Действие\Свойства), после чего откройте вкладку Performance (Производительность).
  • В области Request Queue Limit (Предел очереди запроса) увеличьте значение количества запросов.
  • Нажмите на кнопку OK.

  • Если ошибка возникла в службе WWW, возможно, что IIS обнаружила несколько ошибок в рабочих процессах и инициировала оперативную защиту от ошибок. Это вызвало прекращение обработки запросов "пострадавшим" пулом приложения; такая система безопасности защищает сервер от повреждения неправильно функционирующими приложениями. Если такие обстоятельства возникнут единожды, это может свидетельствовать о наличии какой-либо аномалии. Если же это происходит часто, то следует проверить конфигурацию приложения, так как это говорит о неверных настройках. Можно увеличить допустимое число ошибок и интервал времени, однако это не устранит источник проблемы.
    Настройка параметров системы быстрого обнаружения ошибок производится следующим образом:
  • В консоли MMC IIS выделите пул приложения, в который следует внести изменения.
  • Выберите команду Action\Properties (Действие\Свойства) и откройте вкладку Health (Состояние).
  • Увеличьте значения параметров для ошибок и/или интервала времени, в течение которого IIS отслеживает ошибки рабочих процессов.
  • Нажмите на кнопку OK.


  • Проблемы, связанные с разрешениями

    Неверная установка разрешений файловой системы NT File System (NTFS) может разрушительно сказаться на веб-сайте. Необходимо не только помнить о разрешениях на сайте, но и обеспечить доступность любых используемых COM-объектов. Разрешения на сайте довольно просты и понятны, однако большинство динамически подсоединяемых библиотек (DLL) находятся в каталоге System32. В этом-то и заключается сложность.
    Если рабочий процесс IIS не может получить доступ к DLL-библиотеке ISAPI со списком ACL, то все запросы на эту библиотеку будут завершаться ошибкой 503. Необходимо, чтобы рабочий процесс мог загрузить все библиотеки DLL, используемые на сайте.
    При устранении проблем с разрешениями (особенно если вы не уверены, что проблема связана именно с разрешениями), самым простым способом выявить проблему является расширение разрешений. Если доступ к сайту выполнен под аутентификационными данными администратора, но проблема по-прежнему не устранена, то дело, скорее всего, не в разрешениях. Если невозможен доступ под учетной записью Internet Guest (Гостевая учетная запись интернета), то проблема определенно заключается в разрешениях.
    Предупреждение. В данный момент читатель может задаваться вопросом: "В этой книге не меньше 30 раз говорилось о том, что нельзя использовать расширенные разрешения, так в чем же дело?". Это справедливый вопрос, однако данный подход помогает определить, связана ли проблема с разрешениями. Расширенные полномочия требуют строжайшего контроля. Определенно не стоит использовать данный подход в тот момент, когда сайт находится в состоянии функционирования. Необходимо оградить сайт от доступа посторонних лиц, а затем протестировать его. По окончании этого процесса необходимо вернуть разрешениям соответствующие значения. Нельзя же допустить, чтобы с сайтом все работали на правах администраторов!

    Программа просмотра событий Event Viewer

    Программа Event Viewer (Просмотр событий) может фиксировать события, связанные с IIS. Event Viewer состоит из трех (или четырех, если установлена DNS) компонентов:
  • Журнал приложения. Содержит информацию о приложениях, выполняющихся на сервере. Большинство объектов COM передают информационные сообщения и сообщения об ошибках в журнал приложений.
  • Журнал безопасности. Содержит всю собираемую сервером информацию об аудите. Данный журнал будет настроен чуть позже.
  • Системный журнал. Содержит информацию о самой операционной системе. В системный журнал передают информацию службы.
  • Журнал сервера DNS. Существует только в том случае, если установлен компонент Microsoft DNS Server, и содержит события, связанные в сервером DNS.

  • Примечание. Приложения также могут вести свои собственные журналы. Перечень имеющихся журналов может варьироваться, в зависимости от того, какие установлены приложения. Например, журнал сервера DNS существует только в том случае, если установлен компонент сервера DNS.
    Ниже приведены некоторые сообщения программы Event Viewer (Просмотр событий):
  • запуск и остановка службы;
  • ошибки приложений;
  • активность COM-объекта;
  • ошибки служб;
  • ошибки пула приложений;
  • информация о новостях.

  • Также можно настроить аудит и просмотр информации в журнале Security (Безопасность). Аудит настраивается в политике безопасности и в окне Group Policy Objects (Объекты политики группы). Ниже приведены указания по настройке аудита в локальной политике безопасности для отдельного сервера.
  • Выберите команду Start\Administrative Tools\Local Security Policy (Пуск\Администрирование\Локальная политика безопасности).
  • В окне Local Security Settings (Параметры локальной безопасности) (см. рис. 8.1) выберите Local Policies (Локальные политики), после чего выберите Audit Policy (Политика аудита).
  • Чтобы включить аудит для элемента, дважды щелкните на элементе в правой области.
  • Выберите нужный аудит: Success (Успех), Failure (Ошибка) или обе опции.
  • Нажмите OK.

  • Программа просмотра событий Event Viewer
    Рис. 8.1.  Политика аудита в окне Local Security Settings (Параметры локальной безопасности)

    Рабочие процессы

    В IIS 5 приложения выполнялись внутри процесса с использованием по умолчанию учетной записи LocalSystem. Эта учетная запись имеет более высокий уровень прав, нежели рабочие процессы IIS 6, так как они работают как сетевые службы. Если приложение, правильно работающее в среде IIS 5, вызывает проблемы при работе с IIS 6, можно проверить следующие настройки.

    Работа с журналами счетчиков

    Журналы счетчиков позволяют производить мониторинг системы в течение длительного времени и хранить данные в журналах, которые можно будет проанализировать в будущем. Это делает журналы счетчиков незаменимыми при выявлении периодически возникающих проблем, связанных с производительностью. Ниже приведены шаги по настройке журнала счетчика:
  • В консоли MMC Performance (Производительность) выделите Counter Logs (Счетчики журналов) в пункте Performance Logs and Alerts (Журналы и оповещения производительности).
  • Выберите команду Action\New Log Settings (Действие\Параметры нового журнала).
  • В окне New Log Settings (Параметры нового журнала) введите имя создаваемого журнала.
  • Нажмите на кнопку OK. Откроется окно свойств.

  • В окне свойств для рассматриваемого журнала вы увидите три вкладки: General (Общие), Log Files (Файлы журнала) и Schedule (Расписание).

    Рециркуляция рабочих процессов

    Не все приложения совместимы с рециркуляцией рабочих процессов. Большинство приложений являются таковыми, однако в некоторых могут возникать проблемы. Ниже приведены причины возникновения проблем в приложении, работающем в режиме изоляции приложения.
  • Мульти-объектные ISAPI, предназначенные для многоразового единовременного использования различными процессами.
  • Фильтры чтения исходных данных, которые пытаются захватить все данные перед тем, как они достигнут веб-сайта.
  • Внутрипроцессные сеансовые переменные состояния, т.к. они уничтожаются при каждой рециркуляции рабочего процесса.
  • Приложения, передающие работу для выполнения своим собственным рабочим процессам.


  • Связи MIME

    Если возникла проблема со статическими файлами, следует проверить зарегистрированные типы MIME. По умолчанию IIS обслуживает только файлы HTML и текстовые файлы. Если запрашивается файл неизвестного типа, IIS передает клиенту ошибку 404 и фиксирует в журнала формата W3C Extended ошибку 404.3. Если возникла такая проблема, проверьте журнал IIS, и при обнаружении кода 404.3, добавьте в список связь MIME:
  • Откройте консоль MMC IIS с помощью команды Start\Administrative Tools\Internet Information Services (IIS) Manager (Пуск\Администрирование\Диспетчер IIS).
  • Щелкните правой кнопкой мыши на компоненте (на глобальном уровне, на уровне сайта или уровне каталога), для которого следует изменить типы MIME, и выберите Propеrties (Свойства).
  • Откройте вкладку HTTP Headers (Заголовки HTTP), после чего нажмите на кнопку MIME Types (Типы MIME) в области MIME Types.
  • В появившемся окне типов MIME нажмите на кнопку New (Создать).
  • В текстовом поле Extension (Расширение) введите расширение файла, которое нужно добавить.
  • В соответствующем текстовом поле укажите тип MIME.
  • Нажмите на кнопку OK. Расширение будет добавлено в перечень зарегистрированных типов MIME.
  • Нажмите на кнопку OK еще два раза.

  • Если тип MIME настроен неправильно, но расширение отображается в списке Registered MIME Types (Зарегистрированные типы MIME), IIS по-прежнему будет обслуживать файл, однако не будет знать, что с ним делать. Пользователям IE будет предложено выбрать программу для открытия данного файла.
    Совет. Не знаете, какой тип MIME является корректным? Все типы MIME присваиваются и фиксируются организацией Internet Assigned Numbers Authority (IANA). С их списком можно ознакомиться по адресу http://www.iana.org.

    Учетная запись рабочего процесса

    Можно изменить учетную запись, присвоенную рабочему процессу. Если существует проблема, связанная с разрешениями, то настройте рабочий процесс на выполнение под учетной записью LocalSystem. Это не рекомендуется делать на функционирующем сайте, однако так можно проверить, вызвана ли проблема взаимодействием приложения как сетевой службы. Если обнаруживается, что приложение правильно функционирует как LocalSystem, то проблему можно решить, перестроив приложение и обойдя использование рабочих процессов, либо проверив разрешения библиотеки DLL, чтобы выяснить, не являются ли они слишком ограничительными.
    Ниже описан процесс изменения учетной записи рабочих процессов в пуле приложения:
  • Выделите пул приложения в консоли MMC IIS.
  • Выберите команду Action\Properties (Действие\Свойства).
  • Перейдите на вкладку Identity (Учетная запись).
  • Выберите учетную запись Network Service (Сетевая служба), Local Service (Сетевая служба) или Local System (Локальная система) либо выберите учетную запись пользователя локального компьютера или доверенного домена.


  • Вкладка Action (Действие)

    Во вкладке Action (Действие) (см. рис. 8.7) указываются действия, выполняемые при возникновении события. Можно задать следующие действия.
    Вкладка Action (Действие)
    Рис. 8.7.  Вкладка Action (Действие)
    Log An Entry in the Application Event Log (Заносить запись в журнал событий приложения). Записывает событие с детальными данными счетчика оповещения, значение, вызвавшее оповещение, и пороговое значение. Источником события является SysmonLog.
    Send A Network Message To (Отправить сетевое сообщение). Отправляет сетевое сообщение с помощью службы сообщений по имени, указанном в текстовом поле.
    Start Performance Data Log (Запуск журнала с данными о производительности). Запускает журнал, указанный в ниспадающем списке. Этот журнал будет функционировать до остановки расписания или до остановки вручную.
    Run This Program (Выполнить эту программу). Выполняет определенную программу. Опция используется для запуска отладчика, выполнения сценария, отправки электронной почты или выполнения другого действия. Приложение запускается с указанными аргументами командной строки. Опция прекрасно подходит для выполнения сценария VBScript.
    Command Line Arguments (Аргументы командной строки). Указывает параметры, передаваемые приложению при его выполнении. Содержит семь аргументов:
  • Single argument string – строка с одним аргументом;
  • Date/Time – дата/время;
  • Measured value – измеряемое значение;
  • Alert Name – имя оповещения;
  • Counter Name – имя счетчика;
  • Limit value – предельное значение;
  • Text message – текстовое сообщение.

  • Опция Single argument string присваивает строке формат разделителей-запятых вместо указания каждой переменой по отдельности. Опция Text message позволяет вводить любой текст, который необходимо отправить. Это очень полезная возможность; так как осуществляется настройка оповещения, пользователь знает, что именно запускается, и добавляет текстовое сообщение для переменной, которая необходима для запуска сценария VBScript, написанного для обработки рассматриваемой ситуации.

    Вкладка General (Общие)

    Во вкладке General (Общие) (см. рис. 8.3) добавляются объекты и счетчики в журнал, а также настраивается метод сбора данных.
    Вкладка General (Общие)
    Рис. 8.3.  Вкладка General (Общие)
    Под объектами подразумеваются объекты производительности, определенные Windows. Можно добавить в журнал объект производительности целиком, в результате чего будут автоматически фиксироваться данные для каждого счетчика этого объекта. Данный подход требует большого количества дискового пространства. Для добавления объекта нажмите на кнопку Add Objects (Добавить объекты) и выделите все объекты, отслеживание которых необходимо осуществлять, в открывшемся диалоговом окне. После этого нажмите на кнопку Close (Закрыть).
    Счетчиками называются отдельные счетчики производительности, находящиеся в объекте. Можно выбрать мониторинг отдельного счетчика, в результате чего будет использоваться меньший объем дискового пространства. Файл журнала в этом случае не будет столь детализованным, как если бы осуществлялся мониторинг всего объекта. Для добавления счетчика нажмите на кнопку Add Counters (Добавить счетчики) и в открывшемся диалоговом окне выберите нужные счетчики. После этого нажмите на кнопку Close (Закрыть).
    Как правило, при наличии достаточного объема дискового пространства и циклов центрального процессора следует добавлять объекты, а не счетчики.
    После свершения какого-либо факта вы не сможете вернуться обратно и зафиксировать данные на дополнительных счетчиках, поэтому заранее обеспечьте получение необходимой информации. Для получить конкретных данных используйте счетчики, в противном случае используйте объекты.
    В области Sample Data Every (Проверочные данные каждые) настраивается интервал времени сбора информации. По истечении этого интервала индикатор производительности опрашивает все установленные счетчики производительности для получение текущих данных. Эти данные затем записываются в журнал. Чем чаще осуществляется сбор данных, тем больше размер журнала и более подробна фиксируемая информация. Укажите оптимальный интервал времени для соотношения размера файла и степени его детализации – от 1 с до 45 дней.
    В текстовом поле Run As (Выполнить как) указывается учетная запись пользователя, под которой выполняется Performance Monitor (Индикатор производительности). Это позволяет выполнять мониторинг независимо от того, кто находится в системе.

    Вкладка Log Files (Файлы журнала)

    Во вкладке Log Files (Файлы журнала) (см. рис. 8.4) настраивается тип журнала, в который будет записываться информация.
    Вкладка Log Files (Файлы журнала)
    Рис. 8.4.  Вкладка Log Files (Файлы журнала)
    Здесь для выбора представлены следующие опции.
  • Text File (Comma Delimited) – текстовый файл с разделителями-запятыми.
  • Text File (Tab Delimited) – текстовый файл с разделителями-табуляцией.
  • Binary File – двоичный файл.
  • Binary Circular File – двоичный циклический файл.
  • SQL Database – база данных SQL.

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

    Вкладка Schedule (Расписание)

    Во вкладке Schedule (Расписание) (см. рис. 8.5) настраивается промежуток времени, согласно которому будет осуществляться сбор данных.
    Вкладка Schedule (Расписание)
    Рис. 8.5.  Вкладка Schedule (Расписание)
    В области Start Log (Запуск журнала) указывается запуск файла журнала вручную либо запуск по определенным дате и времени.
    В области Stop Log (Остановка журнала) указывается необходимость остановки журнала следующими методами:
  • вручную;
  • по прошествии определенного промежутка времени;
  • в определенные день и время;
  • по заполнении журнала.

  • При закрытии журнала можно запускать новый журнала. Если включена опция Start A New Log File (Запускать новый журнал), то будет создаваться новый журнал согласно правилам нумерации, указанным во вкладке Log Files (Файлы журнала). Вы можете указать необходимость выполнения определенной команды при закрытии журнала: задать сценарий, обрабатывающий данные, либо другую программу на усмотрение пользователя.
    Осуществив сбор данных, можно с большей долей вероятности выявить проблемы в системе и проверить соответствие сервера IIS системным требованиям.

    

        Работа с информацией: Безопасность - Защита - Софт - Криптография