Utilisation de Microsoft.Web.Administration
par Saad Ladki
Introduction
IIS 7.0 et versions ultérieures fournit une interface de programmation d’applications (API) de gestion complète du code managé qui permet une manipulation intégrale des fichiers de configuration XML et un accès pratique aux objets serveur. Ce document vous guide dans l’utilisation de la nouvelle API de gestion pour modifier la configuration du serveur et administrer les objets serveur.
IIS inclut Microsoft.Web.Administration, qui est une nouvelle API de gestion pour le serveur web qui permet de modifier la configuration via une manipulation complète des fichiers de configuration XML. Elle fournit également des objets pratiques pour gérer le serveur, ses propriétés et son état. L'aspect de modification de la configuration de l'API fournit un accès par programmation aux propriétés de configuration en lecture et en écriture dans la hiérarchie des fichiers de configuration IIS et des fichiers de configuration spécifiques. L'aspect de gestion des objets de cette API fournit une série d'objets d'administration de niveau supérieur pour la gestion directe du serveur (c'est-à-dire des sites, des pools d'applications, des processus de travail, etc.)
Les classes de gestion se trouvent dans l'espace de noms Microsoft.Web.Administration. Les classes fournissent une interface faiblement typée pour accéder aux sections de configuration et aux objets pratiques avec des propriétés et des méthodes représentant des attributs de la configuration (comme le chemin d'un répertoire virtuel) ou des actions à entreprendre sur l'objet (comme le recyclage d'un pool d'applications).
Créer un site
Le code suivant crée un site intitulé « Racing Cars Site » avec son application racine et son répertoire virtuel racine. Il définit également le site de sorte à utiliser le protocole HTTP sur le port 80 et définit le chemin physique sur 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 est la classe de fabrique qui contient un ensemble d’objets serveur pratiques pour lesquels les propriétés et méthodes sont disponibles pour être utilisés de manière fortement typée. ServerManager est le point d’entrée principal pour la gestion du serveur. La gestion du serve ur peut être effectuée via d’autres routes fastidieuses (accès aux API XML de configuration brute ou d’appel d’état). Toutefois, la gestion du serveur est facile par le biais de ces objets. L’ensemble d’objets le plus courant est disponible via le gestionnaire du serveur : applications, répertoires virtuels, sites, processus de travail et domaines d’application.
ServerManager serverManager = new ServerManager();
L’objet sites permet d’accéder aux propriétés et applications des sites. Il contient également des méthodes pour ajouter un site au système ou obtenir le nombre total de sites. La méthode add définit également le nom du site, le chemin du répertoire virtuel racine et le numéro de port sous forme d’entier. Notez aussi que cet appel est instancié sous la forme d’un objet Site, mySite, sur lesquel nous pouvons ensuite agir sur le site nouvellement créé en modifiant directement ses propriétés.
Site mySite = serverManager.Sites.Add("Racing Cars Site", "d:\\inetpub\\wwwroot\\racing", 8080);
Les objets pratiques facilitent la modification des propriétés. En accédant aux propriétés à partir de l’objet mySite, vous pouvez définir la propriété de démarrage automatique du site sur « true » directement sans connaître de concepts d’élément ou d’attribut XML spécifiques.
mySite.ServerAutoStart = true;
De plus, une autre manière qui aurait pu être suivie pour modifier la propriété de démarrage automatique consiste à ne pas instancier d’objet site. Au lieu de cela, récupérez le site une fois qu’il est créé et modifiez directement ses propriétés. L’objet de gestion utilise le concept des indexeurs pour rechercher des objets spécifiques par des clés comme le nom ou l’index sans avoir à effectuer d’appels coûteux pour lister l’ensemble des objets. En définissant le nom, vous pouvez obtenir l’objet spécifique et agir dessus.
serverManager.Sites["Racing Cars Site"].ServerAutoStart = true;
Pour une mise à jour, l’appel de changement de validation exécute la transaction pour sérialiser la configuration, le cas échéant, sur le disque.
serverManager.CommitChanges();
L’exécution du code ci-dessus génère la sortie suivante dans applicationHost.config au sein de la section. Au lieu de manipuler directement le code XML et de travailler au niveau de l’élément et de l’attribut, l’utilisation des objets du gestionnaire de serveur offre un moyen pratique de gérer le serveur web.
<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>
Créer un pool d’applications
Le code suivant modifie le site « Racing Cars Site » existant. Son nom et son chemin physique d:\inetput\wwwroot\racing changent. Il crée également un pool d’applications, définit certaines propriétés, définit l’utilisation de ce pool pour le site, puis finit par le recycler.
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();
}
}
}
Au lieu d’une indexation pour récupérer le site, vous pouvez instancier un objet site et définir la référence sur lui. Une fois la référence définie, vous pouvez appeler les méthodes de l’objet site, en l’occurrence name, pour renommer le site directement.
Site site = serverManager.Sites["Racing Cars Site"];
site.Name = "Racing Site";
Voici une autre utilisation des indexeurs pour obtenir l’application racine, puis le répertoire racine et définir le chemin physique sur celui-ci.
site.Applications[0].VirtualDirectories[0].PhysicalPath = "d:\\racing";
En plus de l’objet site, nous avons l’objet pool d’applications qui fournit un moyen pratique d’obtenir et de définir des propriétés de configuration, ainsi que d’agir sur les méthodes et données d’état. Un nouveau pool d’applications est créé, puis le site est immédiatement placé sur ce pool d’applications.
serverManager.ApplicationPools.Add("RacingApplicationPool");
serverManager.Sites["Racing Site"].Applications[0].ApplicationPoolName = "RacingApplicationPool";
Comme l’objet site du gestionnaire de serveur, l’objet pool d’applications du gestionnaire de serveur vous permet de créer l’objet pool d’applications et de définir la référence sur celui-ci. Vous pouvez également obtenir et définir des propriétés et appeler des méthodes.
Une fois que les données de configuration du pool d’applications sont sérialisées dans le fichier via l’appel de mise à jour, vous pouvez exécuter la méthode recycle dessus. Cet appel de la méthode recycle n’est pas nécessaire, car le pool d’applications est tout simplement créé. Toutefois, cela montre que l’action peut être effectuée dans des objets qui ont été créés uniquement après leur sérialisation sur le disque et que le serveur peut extraire cette configuration et agir dessus.
ApplicationPool apppool = serverManager.ApplicationPools["RacingApplicationPool"];
apppool.ManagedPipelineMode = ManagedPipelineMode.ISAPI;
serverManager.CommitChanges();
apppool.Recycle();
L’exécution du code ci-dessus génère la sortie suivante dans applicationHost.config au sein de la section. Au lieu de manipuler directement le code XML et de travailler au niveau de l’élément et de l’attribut, l’utilisation des objets du gestionnaire de serveur offre un moyen pratique de gérer le serveur web.
<site name="Racing Site" id="2" serverAutoStart="true">
<application path="/">
<virtualDirectory path="/" physicalPath="d:\racing" />
</application>
<bindings>
<binding protocol="http" bindingInformation=":8080:" />
</bindings>
</site>
En outre, les modifications suivantes se produisent dans la section :
<add name="RacingApplicationPool" managedPipelineMode="ISAPI" />
Définir la configuration dans le fichier web.config de la racine du site
Le code suivant définit l’attribut « enabled » de la section sur false pour le site « Site web par défaut ».
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();
}
}
}
La configuration est une classe qui fournit l’accès aux sections de configuration dans le système. En fonction des différents appels pour obtenir la configuration, vous pouvez accéder à applicationHost.config, web.config, administration.config ou tout autre fichier de configuration. L’appel GetWebConfiguration obtient spécifiquement un fichier web.config pour le site donné (site web par défaut) et le chemin spécifique (racine).
Configuration config = serverManager.GetWebConfiguration("Default Web Site");
Une fois le fichier web.config acquis (s’il n’existe pas, il est créé), l’appel pour obtenir une section est effectué. Nous recherchons la section afin de la désactiver. Même si le fichier web.config n’existe pas (ou s’il existe, mais qu’il n’existe aucune section définie explicitement), une configuration effective est quand même appliquée au niveau du site. Il s’agit de la configuration qui sera remplacée.
ConfigurationSection section = config.GetSection("system.webServer/defaultDocument");
En utilisant des méthodes sur l’objet section, vous pouvez obtenir l’attribut enabled, puis définir sa valeur par le biais de la méthode value. C’est seulement après avoir appelé la méthode de changement de validation dans le gestionnaire de serveur que les modifications sont sérialisées, conservées sur le disque et immédiatement récupérées par le serveur. S’il existe plusieurs instances des objets de configuration, l’appel des changements de validation sur le gestionnaire de serveur conserve tous les objets sur le disque.
ConfigurationAttribute enabled = section.GetAttribute("enabled");
enabled.Value = true;
serverManager.CommitChanges();
Une autre option permettant d’obtenir et de définir des informations d’attribut à partir d’une section consiste à utiliser des indexeurs. La ligne de code suivante peut être utilisée après l’obtention de l’objet section pour définir la valeur d’attribut enabled.
section["enabled"] = true;
Le résultat final est une configuration définie dans le fichier web.config du site spécifié.
Définir la configuration d’un site dans applicationHost.config
Le code suivant définit l’attribut « enabled » de la section sur false pour le site « Site web par défaut ».
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();
}
}
}
Ce code est effectivement le même que celui de la tâche précédente. La seule différence a trait à l’appel du gestionnaire de configuration pour obtenir le fichier applicationHost.config via GetApplicationHostconfiguration.
Remarque
L’appel de section get est celui qui spécifie à la fois la section qui sera lue et/ou modifiée, ainsi que le chemin de son emplacement.
Configuration config = serverManager.GetApplicationHostConfiguration();
Le résultat final est une configuration définie dans le fichier applicationHost.config applicable au site spécifié par le biais d’une balise d’emplacement.