Partager via


Extensibilité de la configuration

Le système de configuration dans IIS 7.0 et versions ultérieures est basé sur des fichiers xml distribués qui contiennent la configuration pour IIS, ASP.NET et d’autres composants ; la flexibilité du système de configuration permet également de définir la configuration à plusieurs niveaux, notamment au niveau du serveur, du site et de l’application. La configuration au niveau du site et de l’application coexiste avec ASP.NET configuration dans les fichiers web.config.

L’un des aspects du nouveau système de configuration est la facilité avec laquelle la configuration peut être étendue. Il est possible, avec seulement quelques modifications simples, d’intégrer des sections de configuration personnalisées directement dans le système de configuration et de manipuler ces paramètres à l’aide des API d’administration existantes. La configuration est étendue en définissant simplement une nouvelle section de configuration dans un fichier de schéma XML qui est ensuite supprimé dans le répertoire %windir%\system32\inetsrv\config\schema de schéma IIS. Enfin, la nouvelle section de configuration doit être inscrite dans le fichier de configuration global IIS.

Cet article décrit un exemple qui utilise l’extensibilité de configuration de base et certains scénarios plus avancés. Bien que l’exemple utilisé soit artificiel, il doit être suffisant pour illustrer la puissance de l’extensibilité de la configuration.

Prérequis

Cet article présente un certain nombre de conditions préalables. Notamment :

  1. Avoir une installation par défaut d'IIS 7.0 ou ultérieure. Si IIS n’est pas installé, installez-le en ouvrant le Gestionnaire de serveur et en ajoutant le rôle Serveur Web (IIS).
  2. Assurez-vous que le Kit de développement logiciel (SDK) .NET Framework est installé. Si le Kit de développement logiciel (SDK) n’est pas installé, obtenez-le à partir de https://www.microsoft.com/downloads
  3. Utilisation d’un certain nombre d’outils dans le répertoire bin du Kit de développement logiciel (SDK). Utilisez l’invite de commandes du Kit de développement logiciel (SDK) à partir de votre menu Démarrer ou ajoutez le répertoire bin à votre chemin d’accès (par exemple %systemdrive%\Program Files\Microsoft.NET\SDK\v2.0\Bin)
  4. Exécution de toutes les commandes à partir d’une invite de commandes avec des privilèges élevés. Cliquez avec le bouton droit sur « Invite de commandes SDK », (or « Invite de commandes ») dans le menu de démarrage « Exécuter en tant qu’administrateur ».

Extensibilité de la configuration : les bases

Vue d’ensemble

Pour illustrer certaines des fonctionnalités d’extensibilité de configuration de base, nous utilisons l’exemple artificiel d’un module de journalisation personnalisé. Le module lui-même n’est pas tout ce qui est spécial et gère simplement un événement de journalisation IIS intégré : LogRequest : et écrit une entrée de journal dans un fichier sur disque ; considérez-le comme une version de base de la journalisation IIS.

L’extensibilité de la configuration entre en jeu, car le module doit savoir où consigner les informations. Le module doit avoir une section de configuration personnalisée qui stocke sa configuration, dans ce cas, l’emplacement du fichier journal.

Étape 1 : le fichier de schéma

La première étape de l’ajout d’une nouvelle section de configuration consiste à définir la section. Définissez le schéma de section dans xml et déposez le fichier dans le répertoire %windir%\system32\inetsrv\config\schema.

Créez un fichier xml appelé simpleLogging_Schema.xml et placez-y les éléments suivants :

<configSchema> 
    <sectionSchema name="system.webServer/simpleLogging"> 
        <attribute name="logfileDirectory" type="string" 
            defaultValue="%systemdrive%\inetpub\logs\simpleLogs" expanded="true" encrypted="false" />

    </sectionSchema> 
</configSchema>

Le schéma ci-dessus effectue deux opérations. Tout d’abord, il définit une nouvelle section de configuration nommée « simpleLogging » à l’aide de l’élément <sectionSchema>. Ensuite, il définit un attribut de cette nouvelle section de configuration appelée « logfileDirectory ».

Vous pouvez voir à partir du fichier de schéma que l’attribut est une chaîne et que le système de configuration ne le chiffrera pas. Le expand="true" indique au système de configuration de développer automatiquement les variables d’environnement lorsqu’elles sont utilisées. Si vous n’avez pas créé le fichier dans le répertoire %windir%\system32\inetsrv\config\schema, déplacez-le maintenant.

Ensuite, créez le répertoire par défaut spécifié pour « logfileDirectory », car il n’existe probablement pas sur votre ordinateur. Exécutez la commande suivante à partir de la ligne de commande pour créer le répertoire :

md %systemdrive%\inetpub\logs\simpleLogs

Le groupe Windows IIS_IUSRS doit disposer d’autorisations d’écriture dans le répertoire afin que le module SimpleLogging que nous créons à l’étape 4 puisse y écrire des fichiers journaux. À l’invite de commandes, exécutez la ligne suivante :

icacls %systemdrive%\inetpub\logs\simpleLogs /grant BUILTIN\IIS_IUSRS:RW

En savoir plus sur le schéma

Bien que l’étape 1 soit terminée en termes de notre exemple, il est approprié de discuter des fichiers de schéma. Dans le schéma ci-dessus, nous avons simplement créé une section de configuration simpleLogging qui existe sous system.webServer et spécifié un attribut personnalisé. Toutefois, vous pouvez facilement créer une configuration personnalisée plus complexe avec des collections, des éléments et des attributs. La liste suivante présente quelques exemples, mais la meilleure façon d’apprendre consiste à examiner le fichier de schéma pour la configuration IIS. Trouvez-le à %windir%\system32\inetsrv\config\schema\IIS\_schema.xml.

  • attribute

    Informations de schéma :

    <attribute 
    name="" [String, Required] [XML name of the attribute] 
    type="" [bool|enum|flags|uint|int|int64|string|timeSpan, Required] [Runtime type] 
    required="false" [bool] [Indicates if it must be set] 
    isUniqueKey="false" [bool] [Serves as the collection key] 
    isCombinedKey="false" [bool] [Part of a multi-attribute key] 
    defaultValue="" [String] [Default value or comma-delimited flags] 
    encrypted="false" [bool] [Indicates if the value persisted is encrypted] 
    expanded="false" [bool] [Environment variables are expanded when read] 
    allowInfinite="false" [bool] [Indicates if "Infinite" can be set] 
    timeSpanFormat="string" [string|seconds|minutes] [hh:mm:ss or number] 
    validationType="" [See validation below] 
    validationParameter="" [See validation below] 
    />
    

    Exemple :

    <configSchema> 
      <sectionSchema name="system.webServer/simpleLogging"> 
        <attribute name="logfileDirectory" type="string" />
      </sectionSchema> 
    </configSchema>
    
  • élément

    Informations de schéma :

    <element 
     name="" [String, Required] [XML name of the element]
     isCollectionDefault="false" [bool] [Indicates if default values are held for other elements in this collection] />
    

    Exemple :

    <configSchema> 
      <sectionSchema name="system.webServer/simpleLogging"> 
        <element name="logfile"> 
          <attribute name="fileLocation" type="string" /> 
        </element> 
      </sectionSchema> 
    </configSchema>
    
  • collection

    Informations de schéma :

    <collection 
    addElement="" [String] [Name of Add directive, if supported] 
    removeElement="" [String] [Name of Remove directive, if supported] 
    clearElement="" [String] [Name of Clear directive, if supported] 
    defaultElement="" [applicationDefaults|applicationPoolDefaults|siteDefaults|virtualDirectoryDefaults] 
    mergeAppend="true" [bool] [Indicates whether or not deepest set values are appended] 
    allowDuplicates="false" [bool] [Indicates if multiple elements may have the same key] 
    allowUnrecognizedAttributes="false" [bool] [Indicates if non-schema attributes are ok] 
    />
    

    Exemple :

    <configSchema> 
      <sectionSchema name="system.webServer/simpleLogging"> 
        <collection addElement="add"> 
          <attribute name="logfileDirectory" type="string" /> 
        </collection> 
      </sectionSchema> 
    </configSchema>
    

Étape 2 : inscription de la nouvelle section

Maintenant qu’une nouvelle section a été définie, indiquez au système de configuration la section. Inscrivez la nouvelle section dans le fichier %windir%\system32\inetsrv\config\applicationHost.config. Ouvrez le fichier et inscrivez la section simpleLogging comme suit :

<configSections> 
    ...
    <sectionGroup name="system.webServer"> 
        <section name="simpleLogging"/> 
        ...
    </sectionGroup> 
</configSections>

Cette étape est terminée. La section est définie et inscrite.

Pour case activée que la section s’est inscrite correctement, exécutez la commande suivante à partir de la ligne de commande :

%windir%\system32\inetsrv\appcmd list config –section:system.webServer/simpleLogging

Si tout s’est bien passé jusqu’à présent, la section de configuration s’affiche et vous voyez quelque chose comme ceci :

<system.webServer> 
    <simpleLogging /> 
</system.webServer>

Étape 3 : définition de la configuration

Maintenant que la section a été inscrite, définissez la configuration comme vous le feriez pour une autre configuration à l’aide d’un fichier web.config ou définissez-la à l’aide de l’outil appcmd.exe dans le répertoire %windir%\system32\inetsrv\. Vous pouvez également définir la configuration à l’aide de l’une des API de configuration. Une autre option consiste à définir la configuration via la nouvelle interface utilisateur d’administration IIS en créant un module d’interface utilisateur et en appelant les API de configuration pour définir la configuration.

Pour le moment, définissez la configuration en l’ajoutant à un nouveau fichier web.config pour le site web IIS par défaut (celui installé sur %systemdrive%\inetpub\wwwroot\ et nommé « Site web par défaut » dans la configuration IIS par défaut). Créez un fichier intitulé web.config et ajoutez les éléments suivants :

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
        <simpleLogging logfileDirectory="%systemdrive%\inetpub\logs\simpleLogs" /> 
    </system.webServer> 
</configuration>

Vous pouvez obtenir la même chose à partir de la ligne de commande à l’aide de :

%windir%\system32\inetsrv\appcmd set config "Default Web Site" –section:system.webServer/simpleLogging 
                                    /logfileDirectory:""%"systemdrive"%"\inetpub\logs\simpleLogs"

Exécutez la commande suivante pour répertorier la configuration du « site web par défaut » :

%windir%\system32\inetsrv\appcmd list config "Default Web Site" –section:system.webServer/simpleLogging

La sortie ressemble à ceci :

<system.webServer> 
    <simpleLogging logfileDirectory="%systemdrive%\inetpub\logs\simpleLogs" /> 
</system.webServer>

Remarque

Si le répertoire spécifié pour « logfileDirectory » n’existe pas, créez-le maintenant. Le groupe Windows IIS_IUSRS doit disposer d’autorisations d’écriture dans le répertoire afin que le module SimpleLogging que nous créons à l’étape suivante puisse y écrire des fichiers journaux. L’étape 1 ci-dessus a montré la commande de ligne de commande utilisée pour définir les autorisations appropriées sur le répertoire par défaut. Utilisez une commande similaire si vous avez créé un autre répertoire.

Étape 4 : le module SimpleLogging

À ce stade, nous avons étendu le système de configuration avec notre section de configuration simpleLogging du client. Nous allons arrondir l’analyse de l’extensibilité de configuration de base en créant le module et en montrant comment utiliser la configuration personnalisée à partir de celle-ci.

Nous allons créer un assembly .NET fortement nommé que tous les sites web dans IIS peuvent utiliser. Nous devons utiliser certains outils du Kit de développement logiciel (SDK) .NET pour cette section ; s’il n’est pas installé, téléchargez-le à partir du site web www.microsoft.com/downloads.

Les étapes nécessaires comprennent :

  1. Créez un répertoire dans lequel travailler et l’ouvrir.

  2. Créez un fichier SimpleLoggingModule.cs et ajoutez-y le code suivant à l’aide d’un éditeur de texte :

    using System;
    using System.Web;
    using System.Web.Hosting;
    using System.IO;
    using Microsoft.Web.Administration;
    
    namespace ConfigurationExtensibility
    {
        public class SimpleLoggingModule : IHttpModule
        {
            private string GetlogfileDirectory(HttpContext context)
            {
                ConfigurationSection section = WebConfigurationManager.GetSection(
                        context, "system.webServer/simpleLogging");
                return (string)section["logfileDirectory"];
            }
     
            public void Init(HttpApplication context)
            {
                context.LogRequest += new EventHandler(LogRequest_EventHandler);
            }
     
            private void LogRequest_EventHandler(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                LogRequest(application.Context);
            }
     
            private void LogRequest(HttpContext context)
            {
                string logfileDirectory = GetlogfileDirectory(context);
     
                if (Directory.Exists(logfileDirectory) == false)
                {
                    Directory.CreateDirectory(logfileDirectory);
                }
     
                string logfile = Path.Combine(logfileDirectory, DateTime.Now.ToString("yyyyMMdd") + ".log");
                string ogline = string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}",
                        DateTime.Now,
                        context.Request.HttpMethod,
                        context.Request.UserHostAddress,
                        context.Request.Url.ToString(),
                        context.Request.ServerVariables["LOGON_USER"],
                        context.Request.UserAgent,
                        context.Response.StatusCode,
                        HostingEnvironment.SiteName);
            File.AppendAllText(logfile, ogline + Environment.NewLine);
            }
     
            public void Dispose()
            {
            }    
        }
    }
    
  3. Nous devons en faire un module fortement nommé afin que IIS l’utilise comme module global pour tous les sites. Tout d’abord, créer un fichier de clé de nom fort. Ouvrez une invite de commandes et remplacez le répertoire par celui contenant le fichier SimpleLoggingModule.cs. Ensuite, exécutez la commande suivante (assurez-vous que le répertoire bin de votre Kit de développement logiciel (SDK) .NET Framework se trouve dans votre chemin d’accès) :

    sn.exe /k keyFile.snk
    

    Si cela fonctionnait correctement, la sortie de sn.exe indique quelque chose comme « Paire de clés écrite dans keyFile.snk »

  4. Compilez maintenant le fichier et créez une DLL. Exécutez la commande suivante depuis l’invite de commande :

    %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library SimpleLoggingModule.cs /r:System.Web.dll 
                       /r:%windir%\system32\inetsrv\Microsoft.Web.Administration.dll /keyfile:keyFile.snk
    
  5. Ensuite, placez l'assembly compilé (SimpleLoggingModule.dll) dans le Global Assembly Cache. Exécutez la commande suivante depuis l’invite de commande :

    gacutil.exe /i SimpleLoggingModule.dll
    
  6. Nous devons maintenant ajouter notre module à la liste des modules que IIS peut utiliser. Avant cela, toutefois, nous devons obtenir le nom complet de l'assembly juste créé. À l’invite de commandes, exécutez la commande suivante :

    gacutil.exe /l SimpleLoggingModule
    

    Cette sortie ressemble à ceci :

    SimpleLoggingModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=652a8d02f48e4288, processorArchitecture=MSIL
    
  7. Ajoutez le module à la liste des modules que IIS peut utiliser. Exécutez la commande ci-dessous. Toutefois, veillez à remplacer les variables par la sortie de la dernière commande.

    %windir%\system32\inetsrv\appcmd add module /name:"SimpleLoggingModule" 
    /type:"ConfigurationExtensibility.SimpleLoggingModule, SimpleLoggingModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=652a8d02f48e4288"
    

    Cela ajoute l’entrée de configuration nécessaire au fichier applicationHost.config : fichier de configuration global d'IIS.

  8. L'opération est terminée. Le module personnalisé, qui utilise la configuration personnalisée, a été configuré. Tout cela reste à tester. Lancer le navigateur et accéder à http://localhost/. Vous voyez l'affichage suivant :

    Screenshot of accessing local host in a web browser.

Si vous recevez une erreur, vérifiez que vous avez accordé les autorisations de groupe IIS_IUSRS pour écrire dans le répertoire.

Ouvrez %systemdrive%\inetpub\logs\simpleLogs (ou quel répertoire que vous avez utilisé dans la configuration) et vous disposez d’un fichier .log nommé avec la date d’aujourd’hui. Ouvrez le fichier et vous voyez quelque chose comme ceci :

Screenshot of a log file with the time stamps of the accessed directories for the local host website.

Testez la configuration pour vous assurer qu’elle fonctionne. Essayez de supprimer la section simpleLogging de votre fichier web.config et case activée pour voir si les journaux d’activité accèdent à l’emplacement par défaut (vérifiez simplement que l’utilisateur ASPNET dispose des autorisations appropriées).

Remarque

Le module que nous venons de créer est uniquement à des fins de démonstration et ne doit pas être utilisé dans un environnement de production. Elle échoue s’il existe plusieurs demandes qui tentent d’écrire une entrée de journal en même temps.

Extensibilité de la configuration : scénarios plus avancés

Vue d’ensemble

La section précédente a examiné les principes de base de l’extensibilité de la configuration, en étendant simplement la configuration à l’aide du schéma. Toutefois, il existe davantage de puissance lors de l’extension de la configuration.

Tout d’abord, il est possible d’étendre la configuration afin d’utiliser des objets COM pour récupérer la configuration, ce qui vous permet de stocker les informations de configuration où que vous soyez et que vous le souhaitez sans vous soucier que les API de configuration ne peuvent pas la lire.

Deuxièmement, il est possible de définir des méthodes de manipulation et d’exploitation sur votre configuration. Ces méthodes peuvent ensuite être appelées à l’aide des API de configuration existantes. Ensemble, ces deux fonctionnalités offrent une prise en charge puissante de la création d’extensions de configuration personnalisées.

Cette section examine d’abord la modification de la configuration personnalisée simpleLogging à partir de la première partie de cet article pour récupérer les valeurs de configuration à l’aide d’un composant COM. Ensuite, il examine l’ajout d’une méthode de configuration soutenue par un composant COM qui effectue des actions.

Extension de la configuration : attribut sauvegardé par COM

Cette section étend le schéma pour avoir un attribut appelé « logfileCount ». Cet attribut de configuration est soutenu par un assembly .NET (une dll managée : programmée en C#), qui compte le nombre de fichiers journaux dans le répertoire du journal ; encore une fois, il s’agit d’un scénario artificiel mais que certains peuvent trouver utiles.

Remarque

Vous n’avez pas besoin de créer un composant .NET : tout composant COM valide le fera.

Étape 1 : création et inscription du composant COM .NET

Tout d’abord, pour créer le composant COM .NET. Créez un répertoire pour stocker les fichiers que nous allons créer et le composant que nous allons générer et l’ouvrir.

Le composant que nous créons doit implémenter certaines interfaces exposées via COM par le système de configuration IIS. Pour utiliser l’interface COM à partir du composant .NET, nous devons créer une dll d’interopérabilité. Cela permet au système de configuration IIS de communiquer avec le composant lorsqu’il doit obtenir une valeur pour l’attribut logfileCount. Pour créer la dll d’interopérabilité, utilisez un outil à partir du Kit de développement logiciel (SDK) .NET Framework appelé tlbimp.exe. L’installation de Visual Studio ou du Kit de développement logiciel (SDK) .NET est un prérequis pour cet article. S’il n’est pas installé, téléchargez-le à partir de www.microsoft.com/downloads.

Voici les étapes à suivre pour créer le composant COM .NET :

  1. Ouvrez une invite de ligne de commande et accédez au répertoire que vous avez créé pour stocker les fichiers. Vérifiez que le répertoire bin du .NET Framework se trouve dans votre chemin d’accès, puis exécutez la commande suivante sur la ligne de commande :

    tlbimp %windir%\system32\inetsrv\nativerd.dll /keyfile:keyFile.snk
    

    L’outil tlbimp.exe aura créé un fichier appelé AppHostAdminLibrary.dll : il s’agit de la dll d’interopérabilité dont nous avons besoin.

  2. Créez un fichier ConfigurationExtensibility.cs dans le répertoire que vous avez créé précédemment et copiez le code C# suivant dans le fichier à l’aide d’un éditeur de texte :

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using AppHostAdminLibrary;
    
    namespace ConfigurationExtensibility
    {
        [ComVisible(true)]
        public class SimpleLoggingExtension : IAppHostPropertyExtension
        {
            public void ProvideGetProperty(IAppHostElement pElement, IAppHostProperty pProperty)
            {
                switch(pProperty.Name)
                {
                case "logfileCount":
                string logDirectory = (string) pElement.Properties["logfileDirectory"].Value;
     
                if(Directory.Exists(logDirectory))
                pProperty.Value = Directory.GetFiles(logDirectory, "????????.log").Length;
                else 
               pProperty.Value = 0;
                break;
            }
            }
        }
    }
    

    Remarque

    Nous avons une classe qui implémente l’interface IAppHostPropertyExtension. Le code lui-même lit uniquement l’attribut logfileDirectory pour obtenir le répertoire logfile, puis compte tous les fichiers qui correspondent au modèle de nom de fichier des fichiers journaux créés par SimpleLoggingModule.

  3. Générez le composant en exécutant la commande suivante à partir de la ligne de commande :

    %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /r:AppHostAdminLibrary.dll 
                        ConfigurationExtensibility.cs /keyfile:keyFile.snk
    

    Vous disposez maintenant de votre composant COM .NET : ConfigurationExtensibility.dll.

  4. Inscrivez le composant COM managé que vous venez de créer. Exécutez la commande suivante dans l’invite de commandes :

    %windir%\Microsoft.NET\Framework\v2.0.50727\regasm.exe /register /codebase ConfigurationExtensibility.dll
    

    Cela inscrit le composant COM dans le registre. Vous avez créé et inscrit un composant COM .NET que le système de configuration peut utiliser.

Étape 2 : mise à jour du fichier de schéma

Ensuite, modifiez le fichier simpleLogging_Schema.xml créé précédemment. Ouvrez le fichier et modifiez-le pour ressembler à ce qui suit (le nouvel attribut est mis en gras) :

<configSchema> 
    <sectionSchema name="system.webServer/simpleLogging"> 
        <attribute name="logfileDirectory" type="string" 
             defaultValue="%systemdrive%\inetpub\logs\simpleLogs\" expanded="true" encrypted="false" />
        <attribute name="logfileCount" type="int" extension="ConfigurationExtensibility.SimpleLoggingExtension" /> 
    </sectionSchema> 
</configSchema>

Étape 3 : test

Tout doit fonctionner correctement maintenant, tout ce qui reste à tester. Pour tester l’extension, utilisez un script simple. Créez un fichier SimpleLoggingTest.vbs et entrez le texte suivant :

Dim adminManager, section
Set adminManager = WScript.Createobject("Microsoft.ApplicationHost.AdminManager")
Set section = adminManager.GetAdminSection("system.webServer/simpleLogging",
                    "MACHINE/WEBROOT/APPHOST/Default Web Site")
WScript.Echo(section.Properties.Item("logfileCount").Value)

À ce stade, il doit y avoir un seul fichier journal à partir du test de SimpleLoggingModule précédemment. Exécutez l’outil à partir de la ligne de commande. Vous voyez une sortie de 1.

Extension de la configuration : une méthode sauvegardée par COM

Enfin, cet article examine l’extension de la configuration avec une méthode. Les méthodes de configuration sont des opérations que le système de configuration peut appeler pour effectuer des tâches telles que la modification d’une configuration ou la suppression de fichiers journaux, ce qui est ce que cette méthode fera. Pour cet exemple, nous ajoutons une méthode pour supprimer tous les fichiers journaux créés par SimpleLoggingModule.

Étape 1 : le code

  1. Tout d’abord, ajoutez le code nécessaire pour la méthode. Ouvrez le fichier ConfigurationExtensibility.cs créé précédemment et mettez-le à jour comme suit (nouveau code en gras) :

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using AppHostAdminLibrary;
     
    namespace ConfigurationExtensibility
    {
        [ComVisible(true)]
        public class SimpleLoggingExtension : IAppHostPropertyExtension, IAppHostMethodExtension 
        {
            public void ProvideGetProperty(IappHostElement pElement, IappHostProperty pProperty)
            {
                switch(pProperty.Name)
                {
                case "logfileCount":
                string logDirectory = (string) pElement.Properties["logfileDirectory"].Value;
     
                if(Directory.Exists(logDirectory))
                pProperty.Value = Directory.GetFiles(logDirectory, "????????.log").Length;
                else 
               pProperty.Value = 0;
                break;
            }
            }
     
            public void ProvideMethod(IappHostMethod pMethod,
                IappHostMethodInstance pMethodInstance,
                IappHostElement pElement)
            {
                switch(pMethod.Name)
            {
                case "deleteLogs":
                string logDirectory = (string) pElement.Properties["logfileDirectory"].Value;
     
                if(Directory.Exists(logDirectory))
                {
                foreach(string logFile in Directory.GetFiles(logDirectory, "????????.log"))
                {
                    File.Delete(logFile);
                    }
                }
     
                break;
            }
            }
        }
    }
    

    Remarque

    Nous avons implémenté l’interface IAppHostMethodExtension. Cette interface a une méthode unique appelée ProvideMethod qui fournit logiquement la méthode. Lorsque quelqu’un appelle la méthode (voir l’étape 3 pour savoir comment procéder), le système de configuration appelle ProvideMethod et transmet des paramètres, dont l’un a le nom de la méthode appelée ; dans le code ci-dessus, nous gérons uniquement une méthode appelée « deleteLogs ».

  2. Générez le projet une nouvelle fois à l’aide de :

    %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /r:AppHostAdminLibrary.dll 
                ConfigurationExtensibility.cs /keyfile:keyFile.snk
    

Étape 2 : mise à jour du schéma

Ensuite, indiquez le schéma sur notre nouvelle méthode. À ce stade, vous devez être assez familiarisé avec votre fichier simpleLogging_Schema.xml. Ouvrez-le à nouveau et modifiez-le pour ressembler à ce qui suit :

<configSchema> 
    <sectionSchema name="system.webServer/simpleLogging"> 
        <attribute name="logfileDirectory" type="string" 
            defaultValue="c:\inetpub\logs\simpleLogs\" expanded="true" encrypted="false" />
        <attribute name="logfileCount" type="int" extension="ConfigurationExtensibility.SimpleLoggingExtension" /> 
        <method name="deleteLogs" extension="ConfigurationExtensibility.SimpleLoggingExtension" /> 
    </sectionSchema> 
</configSchema>

La modification a défini une nouvelle méthode appelée « deleteLogs » et indique à la configuration où rechercher la méthode.

Étape 3 : test

Enfin, case activée voir si la méthode fonctionne. Pour ce faire, vous pouvez facilement écrire un script VB simple. Voici un exemple de script qui génère le logfileCount, puis appelle notre méthode et génère le logfileCount. Mettez simplement à jour le fichier SimpleLoggingTest.vbs que vous avez créé précédemment et entrez les éléments suivants :

Dim adminManager, section
Set adminManager = WScript.Createobject("Microsoft.ApplicationHost.AdminManager")
Set section = adminManager.GetAdminSection("system.webServer/simpleLogging", "MACHINE/WEBROOT/APPHOST/Default Web Site")
WScript.Echo(section.Properties.Item("logfileCount").Value)
section.Methods.Item("deleteLogs").CreateInstance().Execute()
WScript.Echo(section.Properties.Item("logfileCount").Value)

Exécutez le script à partir d’une ligne de commande et vous obtenez une sortie de :

1
0

Voici une vue d’ensemble rapide de la façon de fournir de nouvelles méthodes de configuration et de configuration sauvegardées par les composants COM. Comme vous l’avez probablement trouvé, l’extension de la configuration à l’aide de cette méthode est très puissante.

Extensibilité de la configuration : extension de la configuration existante

L’aspect final de l’extensibilité de la configuration est la possibilité d’étendre des sections de configuration existantes telles que la section system.webServer/sites, ou d’étendre la section system.webServer/simpleLogging créée dans les deux sections précédentes.

L’extension d’une section de configuration existante est aussi simple que la création d’une nouvelle section. Définissez simplement le schéma en tant que xml et placez le fichier de schéma dans le répertoire %windir%\system32\inetsrv\config\schema\. Cela devrait être familier, comme nous l’avons fait précédemment plus d’une fois.

Extension de la configuration « sites »

Pour mieux montrer comment étendre une section de configuration existante, nous étendons la section system.applicationHost/sites, la section de configuration utilisée pour définir des sites. Nous étendons la section sites en ajoutant un attribut « owner » et un attribut « ownerEmail ». Les attributs comme ceux-ci sont utiles lorsque vous hébergez plusieurs sites sur une seule zone et que vous souhaitez suivre qui possède les différents sites.

Tout d’abord, créez un fichier de schéma. Créez un fichier siteExtension_schema.xml dans le répertoire %windir%\system32\inetsrv\config\schema\ et entrez le texte ci-dessous :

<configSchema> 
    <sectionSchema name="system.applicationHost/sites"> 
        <collection addElement="site"> 
            <attribute name="owner" type="string" /> 
            <attribute name="ownerEmail" type="string" /> 
        </collection> 
    </sectionSchema> 
</configSchema>

Lorsque vous étendez le schéma d’une section existante, créez simplement un élément <sectionSchema> et définissez l’attribut de nom comme une section existante. Dans le fichier de schéma ci-dessus, nous avons défini une <sectionSchema> avec le nom « system.applicationHost/sites » : il s’agit du même nom que le nom de sectionSchema dans le fichier IIS_Schema.xml dans le répertoire schéma.

Testez nos modifications en ajoutant des valeurs pour les attributs « owner » et « ownerEmail », puis case activée le fichier de configuration pour voir les modifications. Exécutez simplement la commande suivante à partir de la ligne de commande :

%windir%\system32\inetsrv\appcmd set site "Default Web Site" /owner:"John Contoso" /ownerEmail:"john@contoso.com"

Pour voir si la configuration a été appliquée, exécutez la commande suivante et case activée la sortie :

%windir%\system32\inetsrv\appcmd list site "Default Web Site" /config

La sortie doit ressembler à ce qui suit :

<system.applicationHost> 
    <sites> 
    ...
        <site name="Default Web Site" id="1" siteOwner="John Contoso" siteOwnerEmail="john@contoso.com">
        ...
        ...
        </site> 
    </sites> 
</system.applicationHost>

Remarque

Si vous accédez maintenant à http://localhost/, vous pouvez recevoir un message d’erreur du serveur 500.19. Il s’agit d’un problème connu et sera résolu dans une version ultérieure d'IIS. Pour contourner ce problème, exécutez « iisreset » à partir de la ligne de commande.

Cela conclut l’extensibilité de la configuration. J’espère que vous pouvez utiliser l’extensibilité de configuration d’une manière intéressante après avoir lu les exemples précédents.