Комплексный пример расширяемости для разработчиков IIS 7.0
Службы IIS 7 и более поздних версий созданы с полностью модульной архитектурой на основе расширенных API расширяемости. Это позволяет разработчикам легко добавлять, удалять и даже заменять встроенные компоненты IIS на созданные вручную компоненты, специально подходящие для любого веб-сайта. Никогда не было так просто вставить код глубоко в основной конвейер IIS и расширить IIS способами, которые ранее были невозможны.
Примеры: несколько строк кода позволяют разработчикам создавать модули или обработчики, которые предоставляют новые схемы проверки подлинности и авторизации, выполнять анализ во время выполнения или безопасности входящих запросов и проверять ответы. Но чтобы обеспечить реальную ценность, эти модули должны управляться с помощью программных интерфейсов, программ командной строки и пользовательского интерфейса.
Этот технический документ является комплексным примером расширения веб-сервера IIS с помощью пользовательского обработчика запросов. В ней показано, как добавить поддержку API и командной строки для конфигурации этого обработчика, а также как написать модули пользовательского интерфейса в интерфейс управления IIS.
Решение было протестировано в Windows Vista и Windows Server® 2008 Бета-версия 3. Он будет обновлен после выпуска окончательной версии Windows Server 2008.
Набор возможностей
- Управляемый обработчик вставляет сообщение об авторских правах в файлы изображений
- Функция сообщения об авторских правах управляется конфигурацией и использует новую систему конфигурации IIS
- Конфигурацию можно схематизировать и сделать доступной для API конфигурации, скриптов WMI и программ командной строки IIS
- Модуль расширения пользовательского интерфейса позволяет настраивать функцию сообщения об авторских правах через пользовательский интерфейс IIS
Предварительные требования
Чтобы выполнить действия, описанные в этом документе, необходимо установить следующее программное обеспечение:
ASP.NET
Установите ASP.NET с помощью панель управления Windows Vista. Выберите "Программы" — "Включить или отключить компоненты Windows". Затем откройте "Службы IIS" — "Функции разработки приложений" и проверка "ASP.NET".
Если у вас есть сборка Windows Server 2008. откройте "диспетчер сервера" — "Управление ролями" и выберите "Веб-сервер (IIS)". Щелкните "Добавить службы ролей". В разделе "Разработка приложений" проверка "ASP.NET".
Необходимо также установить "Сценарии и средства управления IIS", чтобы воспользоваться преимуществами расширяемости WMI в IIS. Для этого выберите "Программы" — "Включить или отключить компоненты Windows". Затем откройте "Службы IIS" — "Средства веб-управления" и проверка "Сценарии и средства управления IIS".
Если у вас есть сборка Windows Server 2008, откройте "диспетчер сервера" — "Роли" и выберите "Веб-сервер (IIS)". Щелкните "Добавить службы ролей". В разделе "Средства управления веб-приложениями" проверка "Сценарии и средства управления IIS".
Visual C# Express Edition или Visual Studio 2005
Для модуля пользовательского интерфейса требуется средство разработки на C#. Если у вас нет копии Visual Studio 2005, скачайте Visual Studio бесплатно.
Решение проблем с контролем учетных записей пользователей
Защита учетных записей пользователей Windows Vista удаляет права администратора из вашего маркера доступа. По умолчанию у вас не будет доступа к расположению конфигурации и содержимого IIS. Чтобы устранить эту проблему, рекомендуется ознакомиться с этой статьей с помощью командной строки с повышенными привилегиями.
Чтобы запустить командную строку с повышенными привилегиями, перейдите в меню "Пуск" и выберите пункт "Все программы" — "Стандартные". Щелкните правой кнопкой мыши командную строку и выберите команду "Запуск от имени администратора". Подтвердите запрос на повышение прав.
Сценарий
Следующий пример динамически украшает изображения, обслуживаемые нашим веб-сервером, с информацией об авторских правах в левом нижнем углу, как показано на рисунке 1.
Рис. 1. Модуль "Авторские права на изображение" в действии
Мы используем управляемый код для разработки обработчика, который украшает изображения. В рамках примера мы также указываем конфигурацию для этого обработчика и сохраняем ее в хранилище конфигураций IIS. Наконец, мы разработаем подключаемый модуль пользовательского интерфейса для диспетчера IIS.
Шаг 1. Расширяемость конфигурации. Настройка обработчика авторских прав на образы
Хранилище конфигураций IIS можно расширить, просто скопировав файл схемы в каталог схемы IIS. Схема объявляет имя нового раздела конфигурации и его атрибуты, типы и значения по умолчанию. В нашем примере мы объявляем новый раздел конфигурации с именем imageCopyright. Он находится в группе конфигурации system.webServer. Его свойства:
- Логический флаг, который включает или отключает функцию imageCopyright.
- Строковый атрибут, содержащий сообщение об авторских правах
- Атрибут цвета, указывающий цвет сообщения об авторских правах
Объявление схемы
Сохраните следующее определение схемы как imagecopyright.xml в %windir%\system32\inetsrv\config\schema
:
<configSchema>
<sectionSchema name="system.webServer/imageCopyright">
<attribute name="enabled" type="bool" defaultValue="false" />
<attribute name="message" type="string" defaultValue="Your Copyright Message" />
<attribute name="color" type="string" defaultValue="Red"/>
</sectionSchema>
</configSchema>
Если вы получили сообщение об отказе в доступе, вы не сделали этого из командной строки с повышенными привилегиями. После добавления файла схемы схема должна быть объявлена в файле applicationhost.config. Добавьте следующий XML-код в %windir%\system32\inetsrv\config\applicationhost.config
<configSections>
...
<sectionGroup name="system.webServer">
<section name="imageCopyright" overrideModeDefault="Allow"/>
...
</sectionGroup>
</configSections>
Настройка
Процесс завершен. Новые параметры конфигурации можно задать с помощью командной строки или непосредственно в applicationhost.config или web.config. Попробуйте. Откройте командную оболочку и введите следующее:
<system.webServer>
<imageCopyright />
</system.webServer>
В выходных данных показано, что раздел конфигурации был распознано с конфигурацией по умолчанию:
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright
/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true
Теперь добавьте параметры конфигурации с помощью appcmd.exe, например
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright
/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true
Проверьте, сохранена ли конфигурация, выполнив следующую команду:
%windir%\system32\inetsrv\appcmd list config -section:system.webServer/imageCopyright
См. сохраненную конфигурацию:
<system.webServer>
<imageCopyright enabled="true" message="Copyright (C) Contoso.COM" color="yellow" />
</system.webServer>
Создание сценария конфигурации imageCopyright
Примечание
Сделать конфигурацию обработчика imageCopyright доступной для создания скриптов WMI необязательно. Вы можете перейти непосредственно к разделу "Шаг 2. Расширение основных компонентов: обработчик авторских прав на изображения", не затрагивая остальные действия.
Чтобы сделать конфигурацию обработчика imageCopyright доступной для скриптов WMI, выполните следующие действия.
- Установка поддержки WMI IIS
- Создание файла imageCopyright.mof
- Включение файла imageCopyright.mof в webadministration.mof и компиляция файлов схемы WMI
- Написание и выполнение скрипта
Установка поддержки WMI IIS
Установка служб IIS по умолчанию не включает компоненты скриптов WMI. Их необходимо добавить.
Установка поддержки WMI в номерах SKU клиентов Vista
Установите "Сценарии и средства управления IIS" с помощью панель управления Windows Vista. Выберите "Программы" — "Включить или отключить компоненты Windows". Затем откройте "Службы IIS" — "Средства веб-управления" и проверка "Сценарии и средства управления IIS".
Установка поддержки WMI в номерах SKU Windows Server 2008
Если у вас есть сборка Windows Server 2008, откройте "диспетчер сервера" — "Роли" и выберите "Веб-сервер (IIS)". Щелкните "Добавить службы ролей". В разделе "Средства управления" проверка "Сценарии и средства управления IIS".
Создание файла imageCopyright.mof
Объявление схемы свойств WMI очень похоже на объявление схемы свойств IIS на предыдущем шаге. Схемы WMI объявляются в MOF-файлах и компилируются средством под названием mofcomp. Mofcomp добавляет объявление схемы в репозиторий WMI.
Задачи по добавлению сведений о схеме
Откройте экземпляр Блокнота и скопируйте в него следующие строки:
#pragma AUTORECOVER
#pragma namespace("\\\\.\\Root\\WebAdministration")
[
dynamic : ToInstance ToSubClass,
provider("WebAdministrationProvider") : ToInstance ToSubClass,
Description("imageCopyright Section") : ToSubClass,
Locale(1033) : ToInstance ToSubClass,
factory_clsid("{901a70b2-0f7a-44ea-b97b-1e9299dec8ca}"),
section_path("system.webServer/imageCopyright"),
SupportsUpdate
]
class imageCopyright : ConfigurationSection
{
[
read: ToSubClass ToInstance,
write: ToSubClass ToInstance,
DefaultValue("False"): ToSubClass ToInstance,
Description("To be written"): ToSubClass ToInstance
]
boolean Enabled;
[
read: ToSubClass ToInstance,
write: ToSubClass ToInstance,
DefaultValue("Your Copyright Message"): ToSubClass ToInstance,
Description("Copyright Message"): ToSubClass ToInstance
]
string Message;
[
read: ToSubClass ToInstance,
write: ToSubClass ToInstance,
DefaultValue("Yellow"): ToSubClass ToInstance,
Description("Color of Copyright Message"): ToSubClass ToInstance
]
string Color;
};
Объявление схемы содержит те же записи, что и imageCopyright.xml на предыдущем шаге, а именно имя и тип параметра конфигурации и его значение по умолчанию. Сохраните файл как %windir%\system32\inetsrv\imageCopyright.mof
.
Компиляция файлов схемы WMI
Скомпилируйте imageCopyright.mof, выполнив следующую команду.
mofcomp webadministration.mof
Скрипт WMI
Mofcomp добавил схему imageCopyright в репозиторий WMI. Задайте параметры конфигурации IIS, создав скрипт поставщика WMI IIS. Вот пример:
Задания
Откройте экземпляр БЛОКНОТА и скопируйте в него следующие строки. Сохраните файл как SetCopyrightConfig.vbs:
Set oIIS = GetObject("winmgmts:root\WebAdministration")
Set oSection = oIIS.Get("ImageCopyright.Path='MACHINE/WEBROOT/APPHOST/Default Web Site',Location=''")
oSection.Enabled = true
oSection.Message = "Copyright (C) IIS7 Team - Date: " & date
oSection.Color = "White"
oSection.Put_
Это стандартный скрипт WMI, который подключается к поставщику WMI IIS. Он получает раздел конфигурации в указанном расположении ("Веб-сайт по умолчанию") и изменяет его значения. Вызов Put_ сохранит изменения на диске.
При выполнении скрипта будет добавлено сообщение об авторских правах с текущей датой в %systemdrive%\inetpub\wwwroot\web.config
. Посмотри.
Затем добавьте сам обработчик авторских прав на изображение.
Шаг 2. Базовая расширяемость: обработчик авторских прав на образ
Обработчик — это часть кода, которая выполняется, когда запрос соответствует определенному шаблону, обычно это расширение файла. Запросы, заканчивающиеся на . Например, ASP сопоставляются с ASP.DLL. В IIS 6.0 необходимо было написать расширение ISAPI для обработки запросов с определенным расширением файла. ASP.NET также разрешена обработка расширений файлов, но только в том случае, если вы сначала сопоставили запрос с ASP.NET. В СЛУЖБАх IIS можно обрабатывать произвольные расширения файлов без использования ASP.NET. В нашем примере мы обрабатываем запросы с помощью .JPG расширения. Вот как это сделать:
Создание каталога содержимого
Создайте каталог содержимого, например c:\inetpub\mypictures
, и скопируйте в него некоторые цифровые изображения. Убедитесь, что эти файлы являются файлами изображений с расширением .JPG.
Примечание
Для простоты приведенные здесь примеры кода не включают код обработки ошибок для файлов, которые не являются файлами изображений.
Создайте подкаталог с именем App_Code под новым каталогом, например c:\inetpub\mypictures\App\_Code
.
Создание приложения mypictures
Вы можете создать приложение, которое указывает c:\inetpub\mypictures
на с помощью консоли управления IIS, но есть и более интересные способы сделать это. Создайте приложение с помощью appcmd. Следующая команда создает приложение с именем mypictures на веб-сайте по умолчанию с физическим путем c:\inetpub\mypictures
:
%windir%\system32\inetsrv\appcmd add app -site.name:"Default Web Site"
-path:/mypictures -physicalPath:%systemdrive%\inetpub\mypictures
Так как мы хотим, чтобы JPG-файлы были скопированы в этот каталог, включите просмотр каталогов. Это можно сделать с помощью консоли управления IIS или воспользоваться более интересным методом и использовать appcmd. Вот как задать для просмотра каталогов значение true с помощью appcmd:
%windir%\system32\inetsrv\appcmd set config "Default Web Site/mypictures"
-section:directoryBrowse -enabled:true
При запросе http://localhost/mypictures
отобразится список каталогов с изображениями.
Время написания кода
Теперь напишите фактический код обработки изображений. Напишите несколько строк кода C#, чтобы получить результат: используйте приведенный ниже код в качестве ссылки и сохраните его как imagecopyrighthandler.cs в каталоге App_Code, например c:\inetpub\mypictures\App\_Code\imagecopyrighthandler.cs
.
#region Using directives
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.Web.Administration;
#endregion
namespace IIS7Demos
{
public class imageCopyrightHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
ConfigurationSection imageCopyrightHandlerSection =
WebConfigurationManager.GetSection("system.webServer/imageCopyright");
HandleImage( context,
(bool)imageCopyrightHandlerSection.Attributes["enabled"].Value,
(string)imageCopyrightHandlerSection.Attributes["message"].Value,
(string)imageCopyrightHandlerSection.Attributes["color"].Value
);
}
void HandleImage( HttpContext context,
bool enabled,
string copyrightText,
string color
)
{
try
{
string strPath = context.Request.PhysicalPath;
if (enabled)
{
Bitmap bitmap = new Bitmap(strPath);
// add copyright message
Graphics g = Graphics.FromImage(bitmap);
Font f = new Font("Arial", 50, GraphicsUnit.Pixel);
SolidBrush sb = new SolidBrush(Color.FromName(color));
g.DrawString( copyrightText,
f,
sb,
5,
bitmap.Height - f.Height - 5
);
f.Dispose();
g.Dispose();
// slow, but good looking resize for large images
context.Response.ContentType = "image/jpeg";
bitmap.Save(
context.Response.OutputStream,
System.Drawing.Imaging.ImageFormat.Jpeg
);
bitmap.Dispose();
}
else
{
context.Response.WriteFile(strPath);
}
}
catch (Exception e)
{
context.Response.Write(e.Message);
}
}
public bool IsReusable
{
get { return true; }
}
}
}
Приведенный выше код выполняет следующие действия:
- Считывает конфигурацию.
- Вызовы HandleImage
HandleImage выполняет следующие действия:
- Создает объект Graphics из растрового рисунка
- Создает объект шрифта с использованием настроенных значений
- Рисует сообщение на растровом рисунке
Чтобы использовать класс Microsoft.Web.Administration, необходимо добавить ссылку на сборку API администрирования IIS. Для этого откройте %systemdrive%\inetpub\mypictures\web.config
и добавьте следующие записи:
<system.web>
<compilation>
<assemblies>
<add assembly="Microsoft.Web.Administration, Version=7.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
</assemblies>
</compilation>
</system.web>
Вы также можете скомпилировать обработчик в сборку и поместить его в mypictures/bin. В этом случае не нужно добавлять сборку Microsoft.Web.Administration в файл web.config.
Конфигурация обработчика
Вам нужно только указать службам IIS, чтобы вызвать новый обработчик, если запрашивается файл .JPG. Это можно сделать с помощью консоли управления IIS или appcmd:
appcmd set config "Default Web Site/mypictures/" -section:handlers
/+[name='JPG-imageCopyrightHandler',path='*.jpg',verb='GET',type='IIS7Demos.imageCopyrightHandler']
Приведенная выше команда appcmd настраивает новый обработчик только в каталоге /mypictures. Так как записи обработчика находятся в коллекции, необходимо использовать синтаксис +[]. Этот синтаксис всегда используется при добавлении элементов в коллекции. Элементы конфигурации обработчика:
name
Может быть любым уникальным именем. Имя используется только для уникальной идентификации обработчика.
path
Сообщает СЛУЖБАм IIS, когда следует выполнить этот обработчик. *.JPG предписывает службам IIS выполнить этот обработчик для всех файлов, оканчивающихся на .JPG. Если в качестве пути используется foo*.JPG, этот обработчик выполняет только JPG-файлы, начиная с foo.
Команда
Разделяет запятыми список HTTP-команд, которые должны совпадать для выполнения этого обработчика. В нашем случае мы хотим выполнить запрос только при получении запроса GET.
type
Управляемый тип класса, который должен выполняться при совпадении запроса. Он состоит из пространства имен и производного класса IHttpHandler в каталоге App_Code.
Одна последняя заметка
Прежде чем приступить к тестированию защищенных авторским правом образов, убедитесь, что рабочий процесс IIS, выполняющий запрос, принимает внесенные вами изменения схемы. Возможно, рабочий процесс уже был запущен при добавлении файла imageCopyright.xml в каталог схемы. В этом случае вы получите исключение конфигурации в файле imagecopyrightconfig.cs. Автор столкнулся с этой проблемой при написании этой статьи, и это стоило довольно много времени.
Простое повторное использование пула приложений решает эту проблему:
appcmd recycle AppPool DefaultAppPool
Процесс завершен. Если вы запросите http://localhost/mypictures/<imageOfYourChoice>.jpg)
, вы увидите сообщение об авторских правах.
Параметры:
- Вы можете изменить параметры сообщения об авторских правах с помощью appcmd или путем непосредственного редактирования файла web.config
- Обработчик imageCopyright можно сопоставить с другими типами изображений, например BMP или GIF, добавив тот же обработчик для другого расширения. Пример
appcmd set config "Default Web Site/mypictures/" -section:handlers /+[name='BMP-imageCopyrightHandler',path='*.bmp',verb='GET',type='IIS7Demos.imageCopyrightHandler']
Шаг 3. Создание модуля пользовательского интерфейса "Авторские права на изображения"
Время для последних штрихов. Мы уже расширили основной сервер IIS несколькими строками кода; Мы расширили систему конфигурации IIS без кода и получили поддержку командной строки бесплатно. Теперь, чтобы настроить обработчик imageCopyright с помощью консоли управления IIS.
Мы делаем это с помощью следующих задач:
- Создание проекта в Microsoft Visual Studio или Microsoft Visual C# Express для использования сборки в консоли управления IIS
- Создание поставщика модуля
- Создание модуля, который считывает и задает свойства imageCopyright.
Создание проекта
Чтобы создать модуль расширяемости для InetMgr, необходимо создать проект DLL, также известный как проект библиотеки классов. Эта библиотека DLL должна иметь строгое имя, чтобы ее можно было зарегистрировать в глобальном кэше сборок, что является обязательным требованием для модулей, используемых консолью управления IIS.
Этапы
Нажмите кнопку Пуск, выберите Программы и запустите Microsoft Visual Studio 2005 или Microsoft Visual C# 2005 Express Edition.
В меню Файл выберите пункт Создать проект.
В диалоговом окне Новый проект выберите Библиотека классов в качестве типа проекта и введите imageCopyrightUI в качестве имени проекта и нажмите кнопку ОК.
Рис. 2. Диалоговое окно создания проектаУдалите файл Class1.cs, который был добавлен по умолчанию, так как мы не будем использовать его.
С помощью параметра Добавить новую ссылку в меню Проект добавьте ссылку на Microsoft.Web.Management.dll, расположенную в каталоге \Windows\system32\inetsrv. Это библиотека DLL, содержащая все классы расширяемости, необходимые для создания модулей для консоли управления IIS.
С помощью параметра Добавить новую ссылку в меню Проект добавьте ссылку на Microsoft.Web.Administration.dll, расположенную в каталоге \Windows\system32\inetsrv. Это библиотека DLL, содержащая все классы конфигурации, необходимые для чтения конфигурации записи конфигурации IIS.
Так как мы будем использовать код для создания пользовательского интерфейса на основе WinForms, мы также хотим добавить ссылку на System.Windows.Forms.dll; для этого снова с помощью параметра Добавить новую ссылку в меню Проект выберите System.Windows.Forms.dll и System.Web.dll в the.NET списке сборок.
Одно из требований к библиотекам, которые должны использоваться в InetMgr, заключается в том, что они должны быть зарегистрированы в GAC. Для этого необходимо убедиться, что наша библиотека DLL имеет строгое имя (иногда называется Signed). Visual Studio предлагает простой способ создания новых имен и выбора имен для проекта. Для этого в меню Проект выберите параметр imageCopyrightUI Properties.
На вкладке Подписывание проверка подписывание сборки.
В разделе Создание ключа строгого имени введите изображениеCopyrightUI в качестве имени ключа и снимите флажок Защитить файл ключа с помощью пароля проверка. Щелкните ОК.
Рис. 3. Диалоговое окно создания строгого имениНа вкладке подписывания отображается следующее:
Рис. 4. Вкладка подписывания проекта VSТак как мы хотим, чтобы сборка была в глобальном кэше сборок, мы добавим некоторые события после сборки, чтобы она автоматически добавлялась в GAC при каждой компиляции. Это позволит легко выполнять отладку и вносить изменения по мере добавления новых функций. Для этого выберите вкладку События сборки и добавьте следующую командную строку события после сборки:
call "%VS80COMNTOOLS%\vsvars32.bat" > NULL
gacutil.exe /if "$(TargetPath)"
Рис. 5. Вкладка "События после сборки VS"(Необязательно) Если вы используете Microsoft Visual Studio 2005 (это не будет работать с Visual C# Express Edition), настройте отладку правильно, чтобы использовать F5 для выполнения кода. Для этого перейдите к свойствам проекта, выберите вкладку Отладка и установите для нее запуск внешней программы, выбрав \windows\system32\inetsrv\inetmgr.exe
Рис. 6. Вкладка "Отладка"Наконец, закройте свойства проекта, выберите параметр Сохранить все в меню Файл и нажмите кнопку ОК.
Теперь скомпилируйте проект с помощью команды Сборка решения в меню Сборка. Это автоматически создаст библиотеку DLL и добавит ее в GAC.
Создание поставщика модуля
Пользовательский интерфейс IIS является таким же настраиваемым и модульным, как основной сервер IIS и система конфигурации IIS. Пользовательский интерфейс IIS — это набор модулей компонентов, которые можно удалить или заменить. Точка входа для каждого модуля пользовательского интерфейса является поставщиком модуля. Список всех поставщиков модулей можно найти в %windir%\system32\inetsrv\Administration.config
<modules>
разделе .
В качестве первого шага создайте поставщик модуля imageCopyrightUI.
Этапы
Выберите параметр Добавить новый элемент в меню Проект. В диалоговом окне Добавление нового элемента выберите шаблон Класс и введите imageCopyrightUIModuleProvider.cs в качестве имени файла.
Рис. 7. Диалоговое окно добавления нового элементаИзмените код так, чтобы он выглядел следующим образом:
using System; using System.Security; using Microsoft.Web.Management.Server; namespace IIS7Demos { class imageCopyrightUIProvider : ModuleProvider { public override Type ServiceType { get { return null; } } public override ModuleDefinition GetModuleDefinition(IManagementContext context) { return new ModuleDefinition(Name, typeof(imageCopyrightUI).AssemblyQualifiedName); } public override bool SupportsScope(ManagementScope scope) { return true; } } }
Этот код создает ModuleProvider, который поддерживает все типы областей (сервер, сайт и приложение), и регистрирует клиентский модуль imageCopyrightUI. Чтобы отобразить модуль только на уровне приложения, функция SupportsScope выглядит следующим образом:
public override bool SupportsScope(ManagementScope scope) { return (scope == ManagementScope.Application) ; }
Создание модуля пользовательского интерфейса
Модуль — это main точка входа в клиенте для всех объектов расширяемости. У него есть один метод main с именем Initialize. Это метод, в котором выполняется все действие.
Этапы
Выберите параметр Добавить новый элемент в меню проекта.
Выберите шаблон Класс и введите imageCopyrightUI.cs в качестве имени файла. Измените код так, чтобы он выглядел следующим образом:
using System; using System.Windows.Forms; using Microsoft.Web.Management.Client; using Microsoft.Web.Management.Server; namespace IIS7Demos { internal class imageCopyrightUI : Module { protected override void Initialize(IServiceProvider serviceProvider, ModuleInfo moduleInfo) { base.Initialize(serviceProvider, moduleInfo); IControlPanel controlPanel = (IControlPanel)GetService(typeof(IControlPanel)); ModulePageInfo modulePageInfo = new ModulePageInfo(this, typeof(imageCopyrightUIPage), "Image Copyright", "Image Copyright"); controlPanel.RegisterPage(modulePageInfo); } } }
В приведенном выше коде мы указываем текст записи в списке модулей пользовательского интерфейса и тип отдельной страницы, которая должна отображаться, когда пользователь щелкает этот текст.
Осталось только написать саму страницу.
Создание страницы модуля
В этой задаче вы создадите самую простую страницу модуля. ModulePage — это базовый класс, предоставляемый платформой для создания нового пользовательского интерфейса. Существует четыре различных класса, предоставляемых платформой, которые являются полезными в зависимости от сценария, который вы пытаетесь создать.
- ModulePage. Этот базовый класс предлагает только самые основные службы и вообще не предлагает никакого специального пользовательского интерфейса. Ни одна из функций, включенных в InetMgr, не является производным непосредственно от этого класса.
- ModuleDialogPage. Этот базовый класс предлагает аналогичную семантику, как диалоговое окно, включая ссылки Применить и Отмена в списке задач и предлагает определенные методы, которые можно переопределить для обработки этих распространенных задач. Он также автоматически обрабатывает такие функции, как обновление и другие функции. Примеры функций, производных от этой страницы, включают ключ компьютера, службу управления и т. д.
- ModulePropertiesPage. Этот базовый класс предлагает пользовательский интерфейс, аналогичный сетке свойств Visual Studio, где все свойства отображаются в иерархическом элементе управления, подобном сетке. Примеры: CGI, ASP, компиляция .NET и т. д.
- ModuleListPage. Этот базовый класс полезен всякий раз, когда необходимо отобразить список элементов. Он включает элемент управления ListView, который можно использовать для автоматического отображения параметров и предлагает поиск, группирование и представления. Примеры включают параметры приложения, модули, рабочие процессы и т. д.
Этапы
Выберите параметр Добавить новый элемент в меню Проект.
В диалоговом окне Добавление нового элемента выберите шаблон Класс и введите imageCopyrightUIPage.cs в качестве имени файла. Измените код так, чтобы он выглядел следующим образом:
using System; using System.Collections.Generic; using System.Windows.Forms; using Microsoft.Web.Management.Client.Win32; using Microsoft.Web.Administration; using Microsoft.Web.Management.Client; using Microsoft.Web.Management.Server; namespace IIS7Demos { public sealed class imageCopyrightUIPage : ModulePage { public string message; public bool featureenabled; public string color; ComboBox _colCombo = new ComboBox(); TextBox _msgTB = new TextBox(); CheckBox _enabledCB = new CheckBox(); public imageCopyrightUIPage() { this.Initialize(); } protected override void OnActivated(bool initialActivation) { base.OnActivated(initialActivation); if (initialActivation) { ReadConfig(); UpdateUI(); } } void UpdateUI() { _enabledCB.Checked = featureenabled; int n = _colCombo.FindString(color, 0); _colCombo.SelectedIndex = n; _msgTB.Text = message; } void Initialize() { Label crlabel = new Label(); crlabel.Left = 50; crlabel.Top = 100; crlabel.AutoSize = true; crlabel.Text = "Enable Image Copyright:"; _enabledCB.Text = ""; _enabledCB.Left = 200; _enabledCB.Top = 100; _enabledCB.AutoSize = true; Label msglabel = new Label(); msglabel.Left = 150; msglabel.Top = 130; msglabel.AutoSize = true; msglabel.Text = "Message:"; _msgTB.Left = 200; _msgTB.Top = 130; _msgTB.Width = 200; _msgTB.Height = 50; Label collabel = new Label(); collabel.Left = 160; collabel.Top = 160; collabel.AutoSize = true; collabel.Text = "Color:"; _colCombo.Left = 200; _colCombo.Top = 160; _colCombo.Width = 50; _colCombo.Height = 90; _colCombo.Items.Add((object)"Yellow"); _colCombo.Items.Add((object)"Blue"); _colCombo.Items.Add((object)"Red"); _colCombo.Items.Add((object)"White"); Button apply = new Button(); apply.Text = "Apply"; apply.Click += new EventHandler(this.applyClick); apply.Left = 200; apply.AutoSize = true; apply.Top = 250; Controls.Add(crlabel); Controls.Add(_enabledCB); Controls.Add(collabel); Controls.Add(_colCombo); Controls.Add(msglabel); Controls.Add(_msgTB); Controls.Add(apply); } private void applyClick(Object sender, EventArgs e) { try { UpdateVariables(); ServerManager mgr; ConfigurationSection section; mgr = new ServerManager(); Configuration config = mgr.GetWebConfiguration ( Connection.ConfigurationPath.SiteName, Connection.ConfigurationPath.ApplicationPath + Connection.ConfigurationPath.FolderPath ); section = config.GetSection("system.webServer/imageCopyright"); section.GetAttribute("color").Value = (object)color; section.GetAttribute("message").Value = (object)message; section.GetAttribute("enabled").Value = (object)featureenabled; mgr.CommitChanges(); } catch {} } public void UpdateVariables() { featureenabled = _enabledCB.Checked; color = _colCombo.Text; message = _msgTB.Text; } public void ReadConfig() { try { ServerManager mgr; ConfigurationSection section; mgr = new ServerManager(); Configuration config = mgr.GetWebConfiguration( Connection.ConfigurationPath.SiteName, Connection.ConfigurationPath.ApplicationPath + Connection.ConfigurationPath.FolderPath); section = config.GetSection("system.webServer/imageCopyright"); color = (string)section.GetAttribute("color").Value; message = (string)section.GetAttribute("message").Value; featureenabled = (bool)section.GetAttribute("enabled").Value; } catch {} } } }
Хотя их много, этот код не делает ничего, кроме как поместить пару элементов управления на ModulePage и считывает и записывает в хранилище конфигураций IIS.
Конфигурация чтения
Функция ReadConfig использует те же интерфейсы Microsoft.Web.Administration для открытия хранилища конфигураций IIS. Сам пользовательский интерфейс предоставляет область, к которым будут применяться параметры конфигурации.
Пример
Connection.ConfigurationPath.SiteName,
Connection.ConfigurationPath.ApplicationPath+
Connection.ConfigurationPath.FolderPath
Сохранение конфигурации
Конфигурация сохраняется при нажатии кнопки Применить (функция applyClick). Изменения, внесенные в пользовательском интерфейсе, переносят в атрибуты раздела, а раздел сохраняется на диск.
section.GetAttribute("enabled").Value = (object)featureenabled;
mgr.CommitChanges();
На этом этапе можно снова скомпилировать все с помощью команды "Сборка решения" в меню Сборка. При этом создается образ сборкиCopyrightUI и он помещется в глобальный кэш сборок.
Регистрация модуля
Модуль пользовательского интерфейса создан, но по-прежнему необходимо указать консоли управления IIS, чтобы загрузить его. Для этого выполните указанные ниже действия.
- Получение строгого имени модуля пользовательского интерфейса из глобального кэша сборок
- Добавление строгого имени и типа в файл конфигурации консоли управления IIS. Это приведет к тому, что консоль управления IIS загрузит тип при запуске
- Включение модуля в списке модулей пользовательского интерфейса
Этапы
Откройте или используйте существующую командную оболочку с повышенными привилегиями и зарегистрируйте переменные среды Visual Studio 8.0, выполнив следующую команду:
"%vs80comntools%\vsvars32.bat
Запуск GacUtil
GACUTIL /l imageCopyrightUI
Откройте
%windir%\system32\inetsrv\config\administration.config
и добавьте следующий код сразу после<moduleProviders>
записи:<add name="imageCopyrightUI" type="IIS7Demos.imageCopyrightUIProvider, IIS7Demos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3fd9bd5e992ee757"/>
Результат
Задача завершена. Проверьте результаты.
Откройте консоль управления IIS и перейдите к приложению /mypictures.
Дважды щелкните запись "Image Copyright" (Авторские права на изображение).
Рис. 8. Пользовательский интерфейс для защиты авторских прав на изображения
Измените сообщение об авторских правах, нажмите кнопку Применить и обновите браузер. Сообщение об авторских правах изменено. Просмотрите файл web.config в каталоге, %systemdrive%\inetpub\mypictures
чтобы увидеть измененную конфигурацию.
Итоги
СЛУЖБЫ IIS можно расширяемыми способами, которые ранее были недоступны. Вы можете расширить основной конвейер обработки IIS с помощью собственного компонента, сохранить конфигурацию для этого компонента вместе с конфигурацией IIS и даже написать подключаемый модуль пользовательского интерфейса, который находится рядом со стандартными параметрами IIS. Чтобы просмотреть то, что мы сделали в предыдущем примере, выполните следующие действия:
Расширяемость IIS Core
Мы добавили обработчик изображений в ядро IIS, который вставляет сообщение об авторских правах в каждый обслуживаемый файл .JPG. Это было сделано с помощью всего нескольких строк кода C#. Функциональность обработчика была управляемой конфигурацией. Мы хранили конфигурацию в обычных файлах конфигурации IIS applicationhost.config и web.config. Мы также добавили поддержку кэширования для изображений.
Расширяемость системы конфигурации IIS
Мы добавили конфигурацию обработчика авторских прав на образы в систему конфигурации IIS. Такие преимущества, как высокочитаемое хранилище xml, мгновенное использование API и поддержка командной строки, делегирование и распределенные развертывания, предоставляются бесплатно. Нам не нужно было писать ни одной строки кода.
Расширяемость пользовательского интерфейса IIS
Чтобы обеспечить видимость нашей функции, мы добавили модуль пользовательского интерфейса IIS. Хотя пользовательский интерфейс IIS и не отображается, он полностью можно использовать по протоколу HTTPS.