Как использовать Microsoft.Web.Administration

Saad Ladki

Введение

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

IIS включает Microsoft.Web.Administration, который является новым API для управления веб-сервером, позволяющим полностью редактировать конфигурацию через манипуляцию с XML-файлами конфигурации. Он также предоставляет удобные объекты для управления сервером, его свойствами и состоянием. Аспект редактирования конфигурации API обеспечивает программный доступ к чтению и записи свойств конфигурации в иерархии файлов конфигурации IIS, а также в отдельных файлах конфигурации. Аспект управления объектами этого API предоставляет ряд объектов администрирования верхнего уровня для прямого управления сервером (например, сайтов, пулов приложений, рабочих процессов и т. д.).

Классы управления находятся в пространстве имен Microsoft.Web.Administration. Классы предоставляют слабо типизированный интерфейс для доступа к разделам конфигурации и объектам с удобными свойствами и методами, представляющими атрибуты конфигурации (например, путь к виртуальному каталогу) или действия, которые можно выполнить над объектом (например, перезапуск пула приложений).

Создание нового сайта

Следующий код создает сайт с названием Racing Cars Site с корневым приложением и корневым виртуальным каталогом. Он также задает сайт для использования протокола HTTP через порт 80 и определяет физический путь по адресу d:\inetput\wwwroot\racing.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;
namespace MSWebAdmin_Application
{       
    class Program
    {
        static void Main(string[] args)
        {
            ServerManager serverManager = new ServerManager();
            Site mySite = serverManager.Sites.Add("Racing Cars Site", "d:\\inetpub\\wwwroot\\racing",  8080);
            mySite.ServerAutoStart = true;
            serverManager.CommitChanges();
         }
    }
}

ServerManager — это фабричный класс, содержащий набор вспомогательных объектов для сервера, для которых доступны свойства и методы, которые можно использовать строго типизированным образом. Это основная точка входа для управления сервером. Управлять сервером можно было через другие громоздкие пути (доступ к необработанным XML-конфигурациям или обращение к API состояния), но с помощью этих объектов управлять сервером просто. Наиболее распространенный набор объектов доступен для использования с помощью диспетчера серверов: приложения, виртуальные каталоги, сайты, рабочие процессы и домены приложений.

ServerManager serverManager = new ServerManager();

Объект sites обеспечивает доступ к свойствам и приложениям сайтов. Он также содержит методы для добавления сайта в систему или получения общего количества сайтов. Метод добавления также определяет имя сайта, путь к корневому виртуальному каталогу и номер порта в виде целого числа. Кроме того, обратите внимание, что этот вызов создается как объект Site, mySite, к которому затем мы можем действовать на только что созданном сайте, изменив его свойства напрямую.

Site mySite = serverManager.Sites.Add("Racing Cars Site", "d:\\inetpub\\wwwroot\\racing",  8080);

Удобные объекты упрощают изменение свойств. Получив доступ к свойствам из объекта mySite, можно задать для свойства автозапуска сайта значение true напрямую, не зная каких-либо определенных атрибутов ИЛИ элементов XML.

mySite.ServerAutoStart = true;

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

serverManager.Sites["Racing Cars Site"].ServerAutoStart = true;

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

serverManager.CommitChanges();

Выполнение приведенного выше кода создает следующие выходные данные в applicationHost.config в разделе. Вместо управления XML напрямую и работы на уровне элементов и атрибутов с помощью объектов диспетчера серверов удобно управлять веб-сервером.

<site name="Racing Cars Site" id="2" serverAutoStart="true"> 
    <application path="/"> 
        <virtualDirectory path="/" physicalPath="d:\inetpub\wwwroot\racing" /> 
    </application> 
    <bindings> 
        <binding protocol="http" bindingInformation=":8080:" /> 
    </bindings> 
</site>

Создание пула приложений

Следующий код изменяет существующий сайт Racing Cars и изменяет его имя и физический путь в d:\inetput\wwwroot\racing. Он также создает новый пул приложений, определяет некоторые свойства, задает гоночный сайт для использования этого пула и, наконец, перезапускает его.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;
namespace MSWebAdmin_Application
{       
    class Program
    {
        static void Main(string[] args)
        {
            ServerManager serverManager = new ServerManager();
            Site site = serverManager.Sites["Racing Cars Site"];
            site.Name = "Racing Site";
            site.Applications[0].VirtualDirectories[0].PhysicalPath = "d:\\racing";
            serverManager.ApplicationPools.Add("RacingApplicationPool");
            serverManager.Sites["Racing Site"].Applications[0].ApplicationPoolName = "RacingApplicationPool";
            ApplicationPool apppool = serverManager.ApplicationPools["RacingApplicationPool"];
            apppool.ManagedPipelineMode = ManagedPipelineMode.ISAPI;
            serverManager.CommitChanges();
            apppool.Recycle();
        }
    }
}

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

Site site = serverManager.Sites["Racing Cars Site"];
site.Name = "Racing Site";

Ниже приведено другое использование индексаторов для получения корневого приложения, а затем корневого каталога и задания физического пути к нему.

site.Applications[0].VirtualDirectories[0].PhysicalPath = "d:\\racing";

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

serverManager.ApplicationPools.Add("RacingApplicationPool");
serverManager.Sites["Racing Site"].Applications[0].ApplicationPoolName = "RacingApplicationPool";

Как и объект сайта диспетчера серверов, объект пула приложений диспетчера серверов позволяет создать объект пула приложений и задать ссылку на него. Вы также можете считывать и изменять свойства, а также вызывать методы.

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

ApplicationPool apppool = serverManager.ApplicationPools["RacingApplicationPool"];
apppool.ManagedPipelineMode = ManagedPipelineMode.ISAPI;
serverManager.CommitChanges();
apppool.Recycle();

Выполнение приведенного выше кода создает следующие выходные данные в applicationHost.config в разделе. Вместо управления XML напрямую и работы на уровне элементов и атрибутов с помощью объектов диспетчера серверов удобно управлять веб-сервером.

<site name="Racing Site" id="2" serverAutoStart="true"> 
    <application path="/"> 
        <virtualDirectory path="/" physicalPath="d:\racing" /> 
    </application> 
    <bindings> 
        <binding protocol="http" bindingInformation=":8080:" /> 
    </bindings> 
</site>

Кроме того, в разделе происходят следующие изменения:

<add name="RacingApplicationPool" managedPipelineMode="ISAPI" />

Настройка конфигурации в файле web.config, находящемся в корне сайта

Следующий код устанавливает атрибут "активирован" для раздела в значение false для сайта "Default Web Site".

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;
namespace MSWebAdmin_Application
{
    class Program
    {
        static void Main(string[] args)
        {
            ServerManager serverManager = new ServerManager();
            Configuration config =
            mgr.GetWebConfiguration("Default Web Site");
            ConfigurationSection section = config.GetSection("system.webServer/defaultDocument");
            ConfigurationAttribute enabled = section.GetAttribute("enabled");
            enabled.Value = true;
            serverManager.CommitChanges();
        }
    }
}

Конфигурация — это класс, предоставляющий доступ к разделам конфигурации в системе. На основе различных вызовов для получения конфигурации можно получить доступ к applicationHost.config, web.config, administration.config или любому другому файлу конфигурации. Вызов GetWebConfiguration специально получает файл web.config для данного сайта — веб-сайт по умолчанию и определенный путь — корневой каталог.

Configuration config = serverManager.GetWebConfiguration("Default Web Site");

После получения файла web.config (если его не существует, он создается) производится вызов для получения раздела. Мы ищем раздел, чтобы его отключить. Даже если файл web.config не существует (или если он существует, но нет явного набора разделов), то к уровню сайта по-прежнему применяется эффективная конфигурация. Это конфигурация, которая будет переопределена.

ConfigurationSection section = config.GetSection("system.webServer/defaultDocument");

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

ConfigurationAttribute enabled = section.GetAttribute("enabled");
enabled.Value = true;    
serverManager.CommitChanges();

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

section["enabled"] = true;

Конечный результат — это настройка в файле web.config указанного сайта.

Настройка конфигурации сайта в applicationHost.config

Следующий код устанавливает атрибут "активирован" для раздела в значение false для сайта "Default Web Site".

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Web.Administration;

namespace MSWebAdmin_Application
{
    class Program
    {
        static void Main(string[] args)
        {
            ServerManager serverManager = new ServerManager();
            Configuration config = serverManager.GetApplicationHostConfiguration();
            ConfigurationSection section = config.GetSection("system.webServer/defaultDocument","Default Web Site");
            ConfigurationAttribute enabled = section.GetAttribute("enabled");
            enabled.Value = false;
            serverManager.CommitChanges();
        }
    }
}

Этот код фактически совпадает с предыдущей задачей; Единственное различие заключается в вызове configuration manager для получения файла applicationHost.config с помощью GetApplicationHostconfiguration.

Замечание

Вызов секции get указывает как на раздел, который может быть считан и/или изменен, так и на путь к нему.

Configuration config = serverManager.GetApplicationHostConfiguration();

Конечный результат — это настройка в файле applicationHost.config, применимом к сайту, указанному с помощью тега расположения.