Поделиться через


Использование Microsoft.Web.Administration

Саад Ладки (Saad Ladki)

Введение

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

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

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

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

В следующем коде создается сайт с именем "Сайт гоночных автомобилей" с корневым приложением и корневым виртуальным каталогом. Он также задает сайт для использования протокола 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 — это класс фабрики, содержащий набор объектов удобства сервера, свойства и методы которых доступны для использования строго типизированным способом. Это main точка входа для управления сервером. Управление сервером могло осуществляться с помощью других громоздких маршрутов (доступ к необработанным XML-файлам конфигурации или вызов API состояния), но с помощью этих объектов управление сервером является простым. Наиболее распространенный набор объектов, доступных для использования с помощью диспетчера сервера: приложения, виртуальные каталоги, сайты, рабочие процессы и домены приложений.

ServerManager serverManager = new ServerManager();

Объект sites обеспечивает доступ к свойствам и приложениям сайтов. Он также содержит методы для добавления сайта в систему или получения общего количества сайтов. Метод add также определяет имя сайта, путь к корневому виртуальному каталогу и номер порта в виде целого числа. Кроме того, обратите внимание, что этот вызов создается как объект 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;

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

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";

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

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

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 сайта

В следующем коде атрибуту enabled раздела присваивается значение false для сайта "Веб-сайт по умолчанию".

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");

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

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

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

section["enabled"] = true;

Конечный результат — конфигурация, заданная в web.config файле указанного сайта.

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

В следующем коде атрибуту enabled раздела присваивается значение false для сайта "Веб-сайт по умолчанию".

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 section — это вызов, который указывает как раздел, который будет прочитан и /или изменен, так и путь к расположению для него.

Configuration config = serverManager.GetApplicationHostConfiguration();

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