Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 ist zusammen mit ASP.NET Konfiguration in web.config Dateien vorhanden.
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\schemaabgelegt 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 konstruiert ist, sollte es ausreichend sein, um die Leistungsfähigkeit der Konfigurationserweiterbarkeit zu veranschaulichen.
Voraussetzungen
Für diesen Artikel gibt es eine Reihe von Voraussetzungen. Dazu gehören:
- Eine Standardinstallation von IIS 7.0 oder höher. 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, beziehen 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 konfigurierte Beispiel eines benutzerdefinierten Protokollierungsmoduls. Das Modul selbst ist nicht alles so spezielle und behandelt einfach ein integriertes IIS-Protokollierungsereignis - LogRequest - und schreibt einen Protokolleintrag in eine Datei auf dem Datenträger; Stellen Sie sich dies als grundlegende Version der IIS-Protokollierung vor.
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 in das %windir%\system32\inetsrv\config\schema Verzeichnis ab.
Erstellen Sie eine XML-Datei mit dem NamensimpleLogging_Schema.xml , und 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. Führen Sie den folgenden Befehl in der Befehlszeile aus:
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 zeigt einige Beispiele, aber die beste Möglichkeit, etwas zu lernen, besteht darin, die Schemadatei für die IIS-Konfiguration zu betrachten. Suchen Sie es unter %windir%\system32\inetsrv\config\schema\IIS\_schema.xml.
Attribut-
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] />Example:
<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] />Example:
<configSchema> <sectionSchema name="system.webServer/simpleLogging"> <element name="logfile"> <attribute name="fileLocation" type="string" /> </element> </sectionSchema> </configSchema>Sammlung
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] />Example:
<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>
Dieser 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 Es wird etwas wie folgt angezeigt:
<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 fest, oder legen Sie ihn mithilfe des toolsappcmd.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 (die in der STANDARD-IIS-Konfiguration installierte %systemdrive%\inetpub\wwwroot\ und benannte Datei "Standardwebsite"). 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 dieselbe Funktion über die Befehlszeile erreichen, indem Sie Folgendes verwenden:
%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" auflisten:
%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. In Schritt 1 oben 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 um den simpleLogging-Konfigurationsabschnitt unseres 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 stark benannte .NET-Assembly, 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
Die erforderlichen Schritte umfassen:
Erstellen Sie ein Verzeichnis, in dem Sie arbeiten, 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 dies zu einem stark benannten Modul machen, damit IIS es als globales Modul für alle Standorte verwenden kann. Erstellen Sie zunächst eine Datei mit starkem Namenschlüssel. Öffnen Sie eine Eingabeaufforderung, und ändern 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.snkWenn dies ordnungsgemäß funktioniert hat, zeigt die Ausgabe von sn.exe etwas wie "Schlüsselpaar in 'keyFile.snk' geschrieben."
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.snkPlatzieren Sie als Nächstes die kompilierte Assembly (SimpleLoggingModule.dll) in den globalen Assemblycache. Führen Sie den folgenden Befehl in der Eingabeaufforderung aus.
gacutil.exe /i SimpleLoggingModule.dllJetzt 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 SimpleLoggingModuleDadurch wird etwa wie folgt ausgegeben:
SimpleLoggingModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=652a8d02f48e4288, processorArchitecture=MSILFü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 erforderliche Konfigurationseintrag hinzugefügt, die globale Konfigurationsdatei von IIS.
Der Vorgang ist abgeschlossen. Das benutzerdefinierte Modul, das benutzerdefinierte Konfiguration verwendet, wurde eingerichtet. Alles, was bleibt, besteht darin, es zu testen. Starten Sie den Browser, und navigieren Sie zu http://localhost/. Folgendes wird angezeigt:
Wenn eine Fehlermeldung angezeigt wird, stellen Sie sicher, dass Sie den IIS_IUSRS Gruppenberechtigungen zum Schreiben in das Verzeichnis erteilt haben.
Öffnen Sie %systemdrive%\inetpub\logs\simpleLogs (oder das Verzeichnis, das Sie in der Konfiguration verwendet haben), und finden Sie eine .log Datei mit dem heutigen Datum. Ö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 Ihrer web.config-Datei 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. Wenn mehrere Anforderungen gleichzeitig versuchen, einen Protokolleintrag zu schreiben, wird es fehlschlagen.
Erweiterbarkeit der Konfiguration – erweiterte Szenarien
Übersicht
Im vorherigen Abschnitt wurden die Grundlagen der Erweiterbarkeit der Konfiguration untersucht – einfach die Konfiguration mithilfe des Schemas zu erweitern. Beim Erweitern der Konfiguration steht jedoch mehr Energie 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 zum Bearbeiten und Arbeiten mit Ihrer Konfiguration zu definieren. 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 von COM gesichertes Attribut
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 konktives Szenario, aber eines, das einige nützlich finden könnten.
Hinweis
Sie müssen keine .NET-Komponente erstellen – jede gültige COM-Komponente ist ausreichend.
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.
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 mit dem Namen tlbimp.exe aus dem .NET Framework SDK. Das Installieren von Visual Studio oder .NET SDK ist eine Voraussetzung für diesen Artikel. Wenn sie nicht installiert ist, laden Sie es von
Hier sind 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.snkDas 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, die SimpleLoggingModule erstellt haben.
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.snkSie 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.dllDadurch wird die COM-Komponente in der Registrierung registriert. 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 – es bleibt nur noch, die Tests durchzuführen. 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 aus dem Testen des SimpleLoggingModule vorhanden sein. Führen Sie das Skript über die Befehlszeile aus. Es wird eine Ausgabe von 1 angezeigt.
Erweitern der Konfiguration – Eine von COM gesicherte Methode
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 dazu), ruft das Konfigurationssystem ProvideMethod auf und übergibt Parameter, von denen einer den Namen der aufgerufenen Methode hat; 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 ziemlich 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 ruft dann unsere Methode auf und gibt den logfileCount aus. 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 obigen Artikel finden Sie eine kurze Übersicht über die Bereitstellung neuer Konfigurations- und Konfigurationsmethoden, die von COM-Komponenten unterstützt werden. Wie Sie wahrscheinlich gefunden haben, ist die Erweiterung der Konfiguration mit dieser Methode sehr leistungsfähig.
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 bekannt sein, da wir dies zuvor mehrmals getan haben.
Erweiterung der Sites-Konfiguration
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 "owner"-Attribut und ein "ownerEmail"-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 Namensattribute so fest, dass es sich um einen vorhandenen Abschnitt handelt. 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 "owner" und "ownerEmail" 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 etwa 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/ wechseln, erhalten Sie möglicherweise eine Serverfehler 500.19 Fehlermeldung. Dies ist ein bekanntes Problem und wird in einem späteren Build von IIS 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.