Erweiterbarkeit der Konfiguration
Das Konfigurationssystem in IIS 7.0 und höher basiert auf verteilten XML-Dateien, die die Konfiguration für IIS, ASP.NET und andere Komponenten enthalten; Flexibilität im Konfigurationssystem ermöglicht auch, dass die Konfiguration auf einer Reihe von Ebenen festgelegt werden kann, einschließlich auf Server-, Standort- und Anwendungsebene. Die Konfiguration auf Standort- und Anwendungsebene existiert neben der ASP.NET Konfiguration in den Web.config-Dateien.
Ein Aspekt des neuen Konfigurationssystems ist die Leichtigkeit, mit der die Konfiguration erweitert werden kann. Es ist möglich, mit nur wenigen einfachen Änderungen benutzerdefinierte Konfigurationsabschnitte direkt in das Konfigurationssystem zu integrieren und diese Einstellungen mithilfe der vorhandenen Verwaltungs-APIs zu bearbeiten. Die Konfiguration wird erweitert, indem einfach ein neuer Konfigurationsabschnitt in einer XML-Schemadatei definiert wird, die dann im IIS-Schemaverzeichnis %windir%\system32\inetsrv\config\schema
abgelegt wird. Schließlich muss der neue Konfigurationsabschnitt in der globalen IIS-Konfigurationsdatei registriert werden.
In diesem Artikel wird ein Beispiel erläutert, in dem grundlegende Konfigurationserweiterungen und einige der erweiterten Szenarien verwendet werden. Obwohl das verwendete Beispiel erfunden ist, sollte es ausreichend sein, um die Leistungsfähigkeit der Konfigurationserweiterung zu veranschaulichen.
Voraussetzungen
Für diesen Artikel gibt es eine Reihe von Voraussetzungen. Dazu gehören:
- über eine Standardinstallation von IIS 7.0 oder höher zu verfügen. Wenn IIS nicht installiert ist, installieren Sie es, indem Sie den Server-Manager öffnen und die Webserverrolle (IIS) hinzufügen.
- Stellen Sie sicher, dass das .NET Framework SDK installiert ist. Wenn das SDK nicht installiert ist, holen Sie es von https://www.microsoft.com/downloads
- Verwenden einer Reihe von Tools im Bin-Verzeichnis des SDK. Verwenden Sie entweder die SDK-Eingabeaufforderung aus dem Startmenü, oder fügen Sie das Bin-Verzeichnis zu Ihrem Pfad hinzu (z. B.
%systemdrive%\Program Files\Microsoft.NET\SDK\v2.0\Bin
) - Ausführen aller Befehle über eine Eingabeaufforderung mit erhöhten Rechten. Klicken Sie im Startmenü mit der rechten Maustaste auf "SDK-Eingabeaufforderung" (oder "Eingabeaufforderung"), und wählen Sie dann "Als Administrator ausführen" aus.
Erweiterbarkeit der Konfiguration – Die Grundlagen
Übersicht
Um einige der grundlegenden Konfigurationserweiterungsfeatures zu veranschaulichen, verwenden wir das erfundene Beispiel eines benutzerdefinierten Protokollierungsmoduls. Das Modul selbst ist nicht wirklich etwas Besonderes und setzt einfach ein integriertes IIS-Protokollierungsereignis - LogRequest -und und schreibt einen Protokolleintrag in eine Datei auf dem Datenträger; fassen Sie ihn als eine Grundversion der IIS-Protokollierung auf.
Die Konfigurationserweiterung kommt ins Spiel, da das Modul wissen muss, wo Informationen protokolliert werden sollen. Das Modul muss über einen benutzerdefinierten Konfigurationsabschnitt verfügen, in dem die Konfiguration gespeichert wird – in diesem Fall der Speicherort der Protokolldatei.
Schritt 1 : Die Schemadatei
Der erste Schritt beim Hinzufügen eines neuen Konfigurationsabschnitts ist die Definition des Abschnitts. Definieren Sie das Abschnittsschema in XML, und legen Sie die Datei im %windir%\system32\inetsrv\config\schema
Verzeichnis ab.
Erstellen Sie eine XML-Datei mit dem Namen simpleLogging_Schema.xmlund fügen Sie Folgendes ein:
<configSchema>
<sectionSchema name="system.webServer/simpleLogging">
<attribute name="logfileDirectory" type="string"
defaultValue="%systemdrive%\inetpub\logs\simpleLogs" expanded="true" encrypted="false" />
</sectionSchema>
</configSchema>
Das obige Schema führt zwei Dinge aus. Zunächst wird ein neuer Konfigurationsabschnitt namens "simpleLogging" mithilfe des <sectionSchema-Elements> definiert. Zweitens wird ein Attribut dieses neuen Konfigurationsabschnitts namens "logfileDirectory" definiert.
Sie können aus der Schemadatei sehen, dass das Attribut eine Zeichenfolge ist und das Konfigurationssystem sie nicht verschlüsselt. Das expanded="true" weist das Konfigurationssystem an, Umgebungsvariablen bei Verwendung automatisch zu erweitern. Wenn Sie die Datei nicht im %windir%\system32\inetsrv\config\schema
Verzeichnis erstellt haben, verschieben Sie sie jetzt dorthin.
Erstellen Sie als Nächstes das für "logfileDirectory" angegebene Standardverzeichnis, da es wahrscheinlich nicht auf Ihrem Computer vorhanden ist. Führen Sie den folgenden Befehl über die Befehlszeile aus, um das Verzeichnis zu erstellen:
md %systemdrive%\inetpub\logs\simpleLogs
Die Windows-Gruppe IIS_IUSRS muss über Schreibberechtigungen für das Verzeichnis verfügen, damit das in Schritt 4 erstellte SimpleLogging-Modul Protokolldateien in das Verzeichnis schreiben kann. Geben Sie den folgenden Befehl in die Eingabeaufforderungszeile ein.
icacls %systemdrive%\inetpub\logs\simpleLogs /grant BUILTIN\IIS_IUSRS:RW
Weitere Informationen zum Schema
Obwohl Schritt 1 in Bezug auf unser Beispiel vollständig ist, empfiehlt es sich, die Schemadateien zu besprechen. Im obigen Schema haben wir einfach einen neuen Konfigurationsabschnitt "simpleLogging " erstellt, der unter "system.webServer " vorhanden ist und ein benutzerdefiniertes Attribut angegeben hat. Sie können jedoch problemlos komplexere benutzerdefinierte Konfigurationen mit Sammlungen, Elementen und Attributen erstellen. Die folgende Liste enthält einige Beispiele, die beste Möglichkeit ist es aber, sich die Schemadatei für die IIS-Konfiguration anzusehen. Sie finden sie unter %windir%\system32\inetsrv\config\schema\IIS\_schema.xml
.
attribute
Schemainformationen
<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] />
Beispiel:
<configSchema> <sectionSchema name="system.webServer/simpleLogging"> <attribute name="logfileDirectory" type="string" /> </sectionSchema> </configSchema>
Element
Schemainformationen
<element name="" [String, Required] [XML name of the element] isCollectionDefault="false" [bool] [Indicates if default values are held for other elements in this collection] />
Beispiel:
<configSchema> <sectionSchema name="system.webServer/simpleLogging"> <element name="logfile"> <attribute name="fileLocation" type="string" /> </element> </sectionSchema> </configSchema>
collection
Schemainformationen
<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] />
Beispiel:
<configSchema> <sectionSchema name="system.webServer/simpleLogging"> <collection addElement="add"> <attribute name="logfileDirectory" type="string" /> </collection> </sectionSchema> </configSchema>
Schritt 2 – Registrieren des neuen Abschnitts
Nachdem nun ein neuer Abschnitt definiert wurde, informieren Sie das Konfigurationssystem über den Abschnitt. Registrieren Sie den neuen Abschnitt in der %windir%\system32\inetsrv\config\applicationHost.config
Datei. Öffnen Sie die Datei und registrieren Sie den Abschnitt "simpleLogging" wie folgt:
<configSections>
...
<sectionGroup name="system.webServer">
<section name="simpleLogging"/>
...
</sectionGroup>
</configSections>
Ein Schritt ist abgeschlossen. Der Abschnitt wird definiert und registriert.
Um zu überprüfen, ob der Abschnitt ordnungsgemäß registriert wurde, führen Sie den folgenden Befehl über die Befehlszeile aus:
%windir%\system32\inetsrv\appcmd list config –section:system.webServer/simpleLogging
Wenn alles bis jetzt gut gegangen ist, wird der Konfigurationsabschnitt angezeigt, und Sie werden etwa Folgendes sehen:
<system.webServer>
<simpleLogging />
</system.webServer>
Schritt 3 – Festlegen der Konfiguration
Nachdem der Abschnitt registriert wurde, legen Sie die Konfiguration wie jede andere Konfiguration mithilfe einer Web.config-Datei oder mithilfe des tools appcmd.exe im %windir%\system32\inetsrv\
Verzeichnis fest. Sie können die Konfiguration auch mithilfe einer der Konfigurations-APIs festlegen. Eine weitere Option besteht darin, die Konfiguration über die neue IIS-Verwaltungsoberfläche festzulegen, indem sie ein Benutzeroberflächenmodul erstellen und die Konfigurations-APIs aufrufen, um die Konfiguration festzulegen.
Legen Sie die Konfiguration zurzeit fest, indem Sie sie einer neuen Web.config-Datei für die STANDARD-IIS-Website hinzufügen (diejenige, die unter %systemdrive%\inetpub\wwwroot\
installiert ist und die Bezeichnung "Standardwebsite" trägt). Erstellen Sie eine Datei namens "web.config", und fügen Sie Folgendes hinzu:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<simpleLogging logfileDirectory="%systemdrive%\inetpub\logs\simpleLogs" />
</system.webServer>
</configuration>
Sie können dies auch über die Befehlszeile erreichen, indem Sie wie folgt vorgehen:
%windir%\system32\inetsrv\appcmd set config "Default Web Site" –section:system.webServer/simpleLogging
/logfileDirectory:""%"systemdrive"%"\inetpub\logs\simpleLogs"
Führen Sie den folgenden Befehl aus, um die Konfiguration für die "Standardwebsite" aufzulisten:
%windir%\system32\inetsrv\appcmd list config "Default Web Site" –section:system.webServer/simpleLogging
Die Ausgabe sieht ungefähr wie folgt aus:
<system.webServer>
<simpleLogging logfileDirectory="%systemdrive%\inetpub\logs\simpleLogs" />
</system.webServer>
Hinweis
Wenn das für "logfileDirectory" angegebene Verzeichnis nicht vorhanden ist, erstellen Sie es jetzt. Die Windows-Gruppe IIS_IUSRS muss über Schreibberechtigungen für das Verzeichnis verfügen, damit das im nächsten Schritt erstellte SimpleLogging-Modul Protokolldateien in das Verzeichnis schreiben kann. Im vorstehenden Schritt 1 wurde der Befehlszeilenbefehl zum Festlegen der richtigen Berechtigungen für das Standardverzeichnis angezeigt. Verwenden Sie einen ähnlichen Befehl, wenn Sie ein anderes Verzeichnis erstellt haben.
Schritt 4 – Das SimpleLogging-Modul
In dieser Phase haben wir das Konfigurationssystem mit dem simpleLogging-Konfigurationsabschnitt für unsere Kunden erweitert. Wir runden die grundlegende Erweiterbarkeit der Konfiguration ab, indem wir das Modul erstellen und zeigen, wie die benutzerdefinierte Konfiguration darin verwendet wird.
Wir erstellen eine .NET-Assembly mit einem starken Namen, die alle Websites in IIS verwenden können. Wir müssen einige Tools aus dem .NET SDK für diesen Abschnitt verwenden. Wenn sie nicht installiert ist, laden Sie sie von der www.microsoft.com/downloads-Website herunter.
Die erforderlichen Schritte umfassen:
Ein Verzeichnis zu erstellen, in dem sie funktioniert, und öffnen Sie es.
Erstellen Sie eine SimpleLoggingModule.cs Datei, und fügen Sie ihr den folgenden Code mithilfe eines Text-Editors hinzu:
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() { } } }
Wir müssen diesem Modul einen starken Namen geben, damit IIS es als globales Modul für alle Standorte verwenden kann. Erstellen als erstes eine Schlüsseldatei mit einem starkem Namen Öffnen Sie eine Eingabeaufforderung und verschieben Sie das Verzeichnis in das Verzeichnis, das die SimpleLoggingModule.cs Datei enthält. Führen Sie dann den folgenden Befehl aus (stellen Sie sicher, dass sich das Bin-Verzeichnis des .NET Framework SDK in Ihrem Pfad befindet):
sn.exe /k keyFile.snk
Wenn dies ordnungsgemäß funktioniert hat, sagt die Ausgabe von sn.exe etwas wie "Schlüsselpaar in keyFile.snk eingetragen"
Kompilieren Sie nun die Datei, und erstellen Sie eine DLL. Führen Sie den folgenden Befehl an der Eingabeaufforderung aus:
%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
Platzieren Sie als Nächstes die kompilierte Assembly (SimpleLoggingModule.dll) in den globalen Assembly-Cache. Führen Sie den folgenden Befehl an der Eingabeaufforderung aus:
gacutil.exe /i SimpleLoggingModule.dll
Jetzt müssen wir unser Modul zur Liste der Module hinzufügen, die IIS verwenden kann. Davor müssen wir jedoch den vollständigen Namen der soeben erstellten Assembly abrufen. Führen Sie folgendes an der Befehlszeile aus:
gacutil.exe /l SimpleLoggingModule
Dadurch wird etwa Folgendes ausgegeben:
SimpleLoggingModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=652a8d02f48e4288, processorArchitecture=MSIL
Fügen Sie das Modul zur Liste der Module hinzu, die IIS verwenden kann. Führen Sie den folgenden Befehl aus. Stellen Sie jedoch sicher, dass Sie die Variablen durch die Ausgabe des letzten Befehls ersetzen.
%windir%\system32\inetsrv\appcmd add module /name:"SimpleLoggingModule" /type:"ConfigurationExtensibility.SimpleLoggingModule, SimpleLoggingModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=652a8d02f48e4288"
Dadurch wird der Datei applicationHost.config – der globalen Konfigurationsdatei von IIS – der erforderliche Konfigurationseintrag hinzugefügt.
Der Vorgang ist abgeschlossen. Das benutzerdefinierte Modul, das eine benutzerdefinierte Konfiguration verwendet, wurde eingerichtet. Bleibt nur noch, es zu testen. Initialisieren Sie den Browser und navigieren Sie zu http://localhost/. Sie sehen Folgendes:
Wenn eine Fehlermeldung angezeigt wird, stellen Sie sicher, dass Sie den IIS_IUSRS Gruppen die Genehmigung zum Schreiben in das Verzeichnis erteilt haben.
Öffnen Sie %systemdrive%\inetpub\logs\simpleLogs
(oder das Verzeichnis, das Sie in der Konfiguration verwendet haben), und damit haben Sie eine .log Datei mit dem Namen des heutigen Datums. Öffnen Sie die Datei und sie wird ungefähr wie folgt angezeigt:
Experimentieren Sie mit der Konfiguration, um sicherzustellen, dass sie funktioniert. Versuchen Sie, den Abschnitt "simpleLogging " aus der Datei "web.config" zu entfernen, und überprüfen Sie, ob die Protokolle zum Standardspeicherort wechseln (stellen Sie einfach sicher, dass der ASPNET-Benutzer über die richtigen Berechtigungen verfügt).
Hinweis
Das gerade erstellte Modul dient nur zu Demonstrationszwecken und sollte nicht in einer Produktionsumgebung verwendet werden. Dies wird fehlschlagen, wenn es mehrere Anforderungen gibt, einen Protokolleintrag zu schreiben.
Erweiterbarkeit der Konfiguration – erweiterte Szenarien
Übersicht
Im vorstehen Abschnitt wurden die Grundlagen der Erweiterbarkeit der Konfiguration untersucht – einfach die Konfiguration mithilfe des Schemas zu erweitern. Beim Erweitern der Konfiguration steht jedoch mehr Potenz zur Verfügung.
Zunächst besteht die Möglichkeit, die Konfiguration so zu erweitern, dass COM-Objekte zum Abrufen der Konfiguration verwendet werden, sodass Sie die Konfigurationsinformationen überall speichern können, ohne sich sorgen zu müssen, dass die Konfigurations-APIs sie nicht lesen können.
Zweitens gibt es die Möglichkeit, Methoden zu definieren, um ihre Konfiguration zu bearbeiten und laufen zu lassen. Diese Methoden können dann mithilfe der vorhandenen Konfigurations-APIs aufgerufen werden. Diese beiden Features bieten leistungsstarke Unterstützung für die Erstellung von benutzerdefinierten Konfigurationserweiterungen.
Dieser Abschnitt befasst sich zunächst mit dem Ändern der benutzerdefinierten SimpleLogging-Konfiguration aus dem ersten Teil dieses Artikels, um Konfigurationswerte mithilfe einer COM-Komponente abzurufen. Anschließend wird untersucht, wie Sie eine von einer COM-Komponente gesicherte Konfigurationsmethode hinzufügen, die Aktionen ausführt.
Erweitern der Konfiguration – ein Attribut, das ein Back-Up für COM bietet.
In diesem Abschnitt wird das Schema um ein Attribut namens "logfileCount" erweitert. Dieses Konfigurationsattribute wird durch eine .NET-Assembly (eine verwaltete DLL - programmiert in C#) unterstützt, die die Anzahl der Protokolldateien im Protokollverzeichnis zählt; dies ist erneut ein erfundenes Szenario, aber eines, das einige Benutzer nützlich finden könnten.
Hinweis
Sie müssen keine .NET-Komponente erstellen – jede gültige COM-Komponente führt dies aus.
Schritt 1: Erstellen und Registrieren der .NET COM-Komponente
Erstellen Sie zunächst die .NET COM-Komponente. Erstellen Sie ein Verzeichnis zum Speichern der Dateien, die wir erstellen werden, und die Komponente, die wir erstellen, und öffnen Sie es.
Die erstellte Komponente muss einige Schnittstellen implementieren, die über COM vom IIS-Konfigurationssystem verfügbar gemacht werden. Um die COM-Schnittstelle aus der .NET-Komponente zu verwenden, müssen wir eine Interop-DLL erstellen . Dadurch kann das IIS-Konfigurationssystem mit der Komponente kommunizieren, wenn ein Wert für das LogfileCount-Attribut abgerufen werden muss. Verwenden Sie zum Erstellen der Interop-DLL ein Tool aus dem .NET Framework SDK mit dem Namen tlbimp.exe. Das Installieren von Visual Studio oder .NET SDK ist eine Voraussetzung für diesen Artikel. Wenn sie nicht installiert ist, laden Sie sie von www.microsoft.com/downloadsherunter.
Hier die Schritte zum Erstellen der .NET COM-Komponente:
Öffnen Sie eine Eingabeaufforderung in der Befehlszeile, und wechseln Sie zu dem Verzeichnis, das Sie erstellt haben, um die Dateien zu speichern. Stellen Sie sicher, dass sich das Bin-Verzeichnis von .NET Framework in Ihrem Pfad befindet, und führen Sie dann den folgenden Befehl in der Befehlszeile aus:
tlbimp %windir%\system32\inetsrv\nativerd.dll /keyfile:keyFile.snk
Das Tool tlbimp.exe hat eine Datei namens AppHostAdminLibrary.dll erstellt – dies ist die interop dll, die wir benötigen.
Erstellen Sie eine ConfigurationExtensibility.cs Datei im zuvor erstellten Verzeichnis, und kopieren Sie den folgenden C#-Code mithilfe eines Text-Editors in die Datei:
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; } } } }
Hinweis
Wir verfügen über eine Klasse, die die IAppHostPropertyExtension-Schnittstelle implementiert. Der Code selbst liest nur das LogfileDirectory-Attribut, um das Logfile-Verzeichnis abzurufen, und zählt dann alle Dateien, die mit dem Dateinamenmuster für die Protokolldateien übereinstimmen, welche von den SimpleLoggingModule erstellt wurden.
Erstellen Sie die Komponente, indem Sie den folgenden Befehl über die Befehlszeile ausführen:
%windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /r:AppHostAdminLibrary.dll ConfigurationExtensibility.cs /keyfile:keyFile.snk
Sie verfügen jetzt über Ihre .NET COM-Komponente – ConfigurationExtensibility.dll.
Registrieren Sie die gerade erstellte verwaltete COM-Komponente. Führen Sie an der Eingabeaufforderung den folgenden Befehl aus:
%windir%\Microsoft.NET\Framework\v2.0.50727\regasm.exe /register /codebase ConfigurationExtensibility.dll
Dadurch wird die COM-Komponente im Register eingetragen. Sie haben eine .NET COM-Komponente erstellt und registriert, die vom Konfigurationssystem verwendet werden kann.
Schritt 2: Aktualisieren der Schemadatei
Ändern Sie als Nächstes die zuvor erstellte simpleLogging_Schema.xml Datei. Öffnen Sie die Datei, und ändern Sie sie so, dass sie wie folgt aussieht (das neue Attribut ist fett formatiert):
<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>
Schritt 3 : Testen
Alles sollte jetzt ordnungsgemäß funktionieren – alles, was weiterhin getestet wird. Verwenden Sie zum Testen der Erweiterung ein einfaches Skript. Erstellen Sie eine Datei "SimpleLoggingTest.vbs" und geben Sie den folgenden Text ein:
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)
In dieser Phase sollte eine einzelne Protokolldatei vorhanden sein, indem Sie die SimpleLoggingModule früher testen. Führen Sie das Skript über die Befehlszeile aus. Es wird eine Ausgabe von 1 angezeigt.
Erweitern der Konfiguration – eine von Methode, mit einem Back-Up von COM
Schließlich wird in diesem Artikel die Erweiterung der Konfiguration mit einer Methode untersucht. Konfigurationsmethoden sind Vorgänge, die vom Konfigurationssystem aufgerufen werden können, z. B. das Ändern einer Konfiguration oder das Löschen von Protokolldateien – was diese Methode tun wird. In diesem Beispiel fügen wir eine Methode zum Löschen aller Protokolldateien hinzu, die von SimpleLoggingModule erstellt wurden.
Schritt 1 : Der Code
Fügen Sie zuerst den erforderlichen Code für die Methode hinzu. Öffnen Sie die zuvor erstellte ConfigurationExtensibility.cs Datei, und aktualisieren Sie sie so, dass sie wie folgt aussieht (neuer Code fett formatiert):
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; } } } }
Hinweis
Wir haben die IAppHostMethodExtension-Schnittstelle implementiert. Diese Schnittstelle verfügt über eine einzelne Methode namens ProvideMethod , die die Methode logisch bereitstellt. Wenn jemand die Methode aufruft (siehe Schritt 3, wie das geht), ruft das Konfigurationssystem ProvideMethod auf und überträgt Parameter, von denen einer den Namen der aufgerufenen Methode trägt; im obigen Code behandeln wir nur eine Methode namens "deleteLogs".
Erstellen Sie das Projekt erneut, indem Sie Folgendes verwenden:
%windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /r:AppHostAdminLibrary.dll ConfigurationExtensibility.cs /keyfile:keyFile.snk
Schritt 2 : Aktualisieren des Schemas
Informieren Sie als Nächstes das Schema über unsere neue Methode. In dieser Phase sollten Sie mit Ihrer simpleLogging_Schema.xml-Datei vertraut sein. Öffnen Sie sie also erneut und ändern Sie sie so, dass sie wie folgt aussieht:
<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>
Die Änderung hat eine neue Methode namens "deleteLogs" definiert und der Konfiguration mitgeteilt, wo nach der Methode gesucht werden soll.
Schritt 3 : Testen
Überprüfen Sie abschließend, ob die Methode funktioniert. Eine schnelle und einfache Möglichkeit hierfür ist das Schreiben eines einfachen VB-Skripts. Nachfolgend sehen Sie ein Beispielskript, das den logfileCount ausgibt und dann unsere Methode aufruft und den logfileCount ausgibt. Aktualisieren Sie einfach die Datei SimpleLoggingTest.vbs, die Sie zuvor erstellt haben, und geben Sie Folgendes ein:
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)
Führen Sie das Skript über eine Befehlszeile aus und Sie erhalten eine Ausgabe von:
1
0
Im vorstehenden Artikel finden Sie eine kurze Übersicht über die Bereitstellung neuer Konfigurationen und Konfigurationsmethoden, die von COM-Komponenten unterstützt werden. Wie Sie wahrscheinlich festgestellt haben, ist die Erweiterung der Konfiguration mit dieser Methode sehr effizient.
Erweiterbarkeit der Konfiguration – Erweitern vorhandener Konfigurationen
Der letzte Aspekt der Konfigurationserweiterung ist die Möglichkeit, vorhandene Konfigurationsabschnitte wie den Abschnitt "system.webServer/sites " zu erweitern oder den abschnitt "system.webServer/simpleLogging " zu erweitern, der in den vorherigen beiden Abschnitten erstellt wurde.
Das Erweitern eines vorhandenen Konfigurationsabschnitts ist so einfach wie das Erstellen eines neuen Abschnitts. Definieren Sie einfach das Schema als XML und platzieren Sie die Schemadatei im %windir%\system32\inetsrv\config\schema\
Verzeichnis. Dies sollte Ihnen bekannt vorkommen, da wir dies zuvor mehrmals getan haben.
Erweitern der Konfiguration "Sites"
Um besser zu zeigen, wie ein vorhandener Konfigurationsabschnitt erweitert wird, erweitern wir den Abschnitt "system.applicationHost/sites " – den Konfigurationsabschnitt, der zum Definieren von Websites verwendet wird. Wir erweitern den Abschnitt "Websites", indem wir ein "Besitzer"-Attribut und ein "Besitzer-E-Mail"-Attribut hinzufügen. Attribute wie diese sind nützlich, wenn Sie mehrere Websites in einem einzigen Feld hosten und nachverfolgen möchten, wer die verschiedenen Websites besitzt.
Erstellen Sie zunächst eine neue Schemadatei. Erstellen Sie eine siteExtension_schema.xml-Datei im %windir%\system32\inetsrv\config\schema\
Verzeichnis und geben Sie den folgenden Text ein:
<configSchema>
<sectionSchema name="system.applicationHost/sites">
<collection addElement="site">
<attribute name="owner" type="string" />
<attribute name="ownerEmail" type="string" />
</collection>
</sectionSchema>
</configSchema>
Wenn Sie das Schema eines vorhandenen Abschnitts erweitern, erstellen Sie einfach ein <sectionSchema>
Element, und legen Sie das Namensattribut so fest, dass es mit einem existierenden Abschnitt identisch ist. In der obigen Schemadatei haben wir ein <SectionSchema> mit dem Namen "system.applicationHost/sites" definiert - dies entspricht dem SectionSchema-Namen in der Datei IIS_Schema.xml im Schemaverzeichnis.
Testen Sie unsere Änderungen, indem Sie Werte für die Attribute "Besitzer" und "Besitzer-E-Mail" hinzufügen und dann die Konfigurationsdatei überprüfen, um die Änderungen anzuzeigen. Führen Sie einfach den folgenden Befehl über die Befehlszeile aus:
%windir%\system32\inetsrv\appcmd set site "Default Web Site" /owner:"John Contoso" /ownerEmail:"john@contoso.com"
Um festzustellen, ob die Konfiguration angewendet wurde, führen Sie den folgenden Befehl aus und überprüfen Sie die Ausgabe:
%windir%\system32\inetsrv\appcmd list site "Default Web Site" /config
Die Ausgabe sollte ungefähr wie folgt aussehen.
<system.applicationHost>
<sites>
...
<site name="Default Web Site" id="1" siteOwner="John Contoso" siteOwnerEmail="john@contoso.com">
...
...
</site>
</sites>
</system.applicationHost>
Hinweis
Wenn Sie jetzt zu http://localhost/
navigieren, wird möglicherweise eine Server 500.19t-Fehlermeldung angezeigt. Dies ist ein bekanntes Problem und wird in einem späteren IIS-Build behoben. Um dieses Problem zu umgehen, führen Sie "iisreset" über die Befehlszeile aus.
Dies schließt den Blick auf die Erweiterbarkeit der Konfiguration ab. Hoffentlich können Sie die Erweiterbarkeit der Konfiguration auf interessante Weise verwenden, nachdem Sie die vorherigen Beispiele gelesen haben.