Gewusst wie: Erstellen von benutzerdefinierten Konfigurationsabschnitten mit IConfigurationSectionHandler
Aktualisiert: November 2007
Sie können die standardmäßigen ASP.NET-Konfigurationseinstellungen durch eigene XML-Konfigurationselemente erweitern. Dazu erstellen Sie einfach einen eigenen Handler für Konfigurationsabschnitte.
Der Handler muss eine .NET Framework-Klasse sein, die entweder die System.Configuration.IConfigurationSectionHandler-Schnittstelle oder die System.Configuration.ConfigurationSection-Klasse implementiert.
Hinweis: |
---|
In diesem Thema wird die System.Configuration.IConfigurationSectionHandler-Schnittstelle verwendet, die in .NET Framework, Version 2.0, für veraltet erklärt wurde. Ein Beispiel, in dem die System.Configuration.ConfigurationSection-Klasse verwendet wird, finden Sie unter Gewusst wie: Erstellen von benutzerdefinierten Konfigurationsabschnitten mit ConfigurationSection. Wenn Sie die folgenden Codebeispiele verwenden, erstellen Sie sie mit .NET Framework, Version 1.0 oder 1.1. |
Der Abschnittshandler interpretiert und verarbeitet die in den XML-Konfigurationselementen definierten Einstellungen innerhalb eines bestimmten Bereichs einer Datei Web.config und gibt das geeignete, auf den Konfigurationseinstellungen basierende Konfigurationsobjekt zurück. Das von der Handlerklasse zurückgegebene Konfigurationsobjekt kann eine beliebige Datenstruktur darstellen und ist auf keine Basiskonfigurationsklasse bzw. auf kein Konfigurationsformat beschränkt. In ASP.NET werden mithilfe des Konfigurationsobjekts Schreib- und Lesevorgänge für das benutzerdefinierte Konfigurationselement ausgeführt.
So erstellen Sie einen benutzerdefinierten Konfigurationsabschnittshandler:
Erstellen Sie eine öffentliche Klasse, die die System.Configuration.IConfigurationSectionHandler-Schnittstelle implementiert, wie im folgenden Code dargestellt.
Imports System Imports System.Collections Imports System.Text Imports System.Configuration Imports System.Xml Namespace MyConfigSectionHandler Public Class MyHandler Implements IConfigurationSectionHandler Public Function Create( _ ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) _ As Object Implements System.Configuration.IConfigurationSectionHandler.Create Throw New System.Exception("The method is not implemented.") End Function End Class End Namespace
using System; using System.Collections.Generic; using System.Text; using System.Configuration; using System.Xml; namespace MyConfigSectionHandler { public class MyHandler : IConfigurationSectionHandler { #region IConfigurationSectionHandler Members object IConfigurationSectionHandler.Create( object parent, object configContext, XmlNode section) { throw new Exception("The method is not implemented."); } #endregion } }
Fügen Sie eigenen Code hinzu, um die gewünschte Konfigurationsarbeit durchzuführen.
Sie können zum Beispiel die Zeile throw new Exception("The method is not implemented."); durch Code ersetzen, der die Attributnamen und -werte aus der Attributes-Eigenschaft des section-Parameters abruft und ein benutzerdefiniertes Konfigurationsobjekt zurückgibt. Im folgenden Beispiel wird eine Hashtable als Konfigurationsobjekt verwendet.
Imports System Imports System.Collections Imports System.Text Imports System.Configuration Imports System.Xml Namespace MyConfigSectionHandler Public Class MyHandler Implements IConfigurationSectionHandler Public Function Create( _ ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) _ As Object Implements System.Configuration.IConfigurationSectionHandler.Create ' Creates the configuration object that this method will return. ' This can be a custom configuration class. ' In this example, we use a System.Collections.Hashtable. Dim myConfigObject As New Hashtable ' Gets any attributes for this section element. Dim myAttribs As New Hashtable For Each attrib As XmlAttribute In section.Attributes If XmlNodeType.Attribute = attrib.NodeType Then myAttribs.Add(attrib.Name, attrib.Value) End If Next ' Puts the section name and attributes as the first config object item. myConfigObject.Add(section.Name, myAttribs) ' Gets the child element names and attributes. For Each child As XmlNode In section.ChildNodes If XmlNodeType.Element = child.NodeType Then Dim myChildAttribs As New Hashtable For Each childAttrib As XmlAttribute In child.Attributes If XmlNodeType.Attribute = childAttrib.NodeType Then myChildAttribs.Add(childAttrib.Name, childAttrib.Value) End If Next myConfigObject.Add(child.Name, myChildAttribs) End If Next Return (myConfigObject) End Function End Class End Namespace
using System; using System.Collections; using System.Text; using System.Configuration; using System.Xml; namespace MyConfigSectionHandler { public class MyHandler : IConfigurationSectionHandler { #region IConfigurationSectionHandler Members object IConfigurationSectionHandler.Create( object parent, object configContext, XmlNode section) { // Creates the configuration object that this method will return. // This can be a custom configuration class. // In this example, we use a System.Collections.Hashtable. Hashtable myConfigObject = new Hashtable(); // Gets any attributes for this section element. Hashtable myAttribs = new Hashtable(); foreach (XmlAttribute attrib in section.Attributes) { if (XmlNodeType.Attribute == attrib.NodeType) myAttribs.Add(attrib.Name, attrib.Value); } // Puts the section name and attributes as the first config object item. myConfigObject.Add(section.Name, myAttribs); // Gets the child element names and attributes. foreach (XmlNode child in section.ChildNodes) { if (XmlNodeType.Element == child.NodeType) { Hashtable myChildAttribs = new Hashtable(); foreach (XmlAttribute childAttrib in child.Attributes) { if (XmlNodeType.Attribute == childAttrib.NodeType) myChildAttribs.Add(childAttrib.Name, childAttrib.Value); } myConfigObject.Add(child.Name, myChildAttribs); } } return (myConfigObject); } #endregion } }
So fügen Sie einer ASP.NET-Konfigurationsdatei einen benutzerdefinierten Abschnittshandler hinzu:
Fügen Sie Ihrer Datei Web.config im configSections-Element ein sectionGroup-Element und ein section-Element hinzu, wie im folgenden Code veranschaulicht.
Hinweis: Das Schachteln eines section-Elements in einer sectionGroup ist zwar optional, wird jedoch empfohlen, damit Konfigurationsdaten besser verwaltet werden können.
Sie können die Abschnittshandlerdeklaration einer anderen Konfigurationsdatei hinzufügen als derjenigen, der Sie die benutzerdefinierten Konfigurationselemente hinzufügen. Voraussetzung hierfür ist, dass die Konfigurationsdatei, in der der Abschnittshandler deklariert ist, in der Konfigurationsdateihierarchie an höherer Stelle steht. Weitere Informationen finden Sie unter: ASP.NET-Konfigurationsdateihierarchie und Vererbung.
Das type-Attribut des section-Elements muss mit dem Manifest der Auflistung übereinstimmen. Andernfalls tritt ein Konfigurationsfehler auf. Die Assemblydatei selbst muss sich in demselben ASP.NET-Anwendungsverzeichnis befinden wie die Datei Web.config, durch die sie definiert ist.
<configuration> <!-- Configuration section-handler declaration area. --> <configSections> <sectionGroup name="myCustomGroup"> <section name="myCustomSection" type="MyConfigSectionHandler.MyHandler, MyCustomConfigurationHandler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" /> </sectionGroup> <!-- Other <section> and <sectionGroup> elements. --> </configSections> <!-- Configuration section settings area. --> </configuration>
Fügen Sie die benutzerdefinierten Konfigurationselemente in dem Bereich der Datei Web.config hinzu, der die Einstellungen für den Konfigurationsabschnitt enthält.
<configuration> <!-- Configuration section-handler declaration area. --> <!-- Configuration section settings area. --> <myCustomGroup> <myCustomSection myAttrib1="Clowns"> <myChildSection myChildAttrib1="Zippy" myChildAttrib2="Michael Zawondy "/> </myCustomSection> </myCustomGroup> <!-- Other configuration settings, like <system.web> --> </configuration>
So greifen Sie programmgesteuert auf die benutzerdefinierten Konfigurationsdaten zu:
Rufen Sie eine Instanz des benutzerdefinierten Konfigurationsobjekts ab, und füllen Sie diese mithilfe der ConfigurationManager.GetSection-Methode oder der WebConfigurationManager.GetSection-Methode auf.
Das folgende Beispiel einer ASPX-Seite wird in Kombination mit den vorherigen Beispielen ausgeführt, um die Attribute und untergeordneten Elemente des benutzerdefinierten Konfigurationsabschnitts aufzulisten, wenn auf eine Schaltfläche geklickt wird.
Da der benutzerdefinierte Abschnittshandler eine Hashtable als Konfigurationsobjekt verwendet, gibt die GetSection-Methode eine Hashtable zurück.
Der folgende Code wird in der ASPX-Seite gespeichert. Der Code für das Klickereignis der Schaltfläche, der in der Code-Behind-Datei gespeichert wird, wird im nächsten Codebeispiel veranschaulicht.
Für die folgenden Codebeispiele ist .NET Framework, Version 1.0 oder 1.1, erforderlich.
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="BugTest.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 2003"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name=vs_defaultClientScript content="JavaScript"> <meta name=vs_targetSchema content="https://schemas.microsoft.com/intellisense/ie5"> </head> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" > <h1>Enumerate MyCustomSection</h1> <asp:Label ID="Label1" Text="" /> <br /> <asp:Button ID="Button1" Text="Get Custom Config Info" OnClick="Button1_Click" /> </form> </body> </html>
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 2003"> <meta name="CODE_LANGUAGE" Content="VB"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="https://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" > <h1>Enumerate MyCustomSection</h1> <asp:Label ID="Label1" Text="" /> <br> <asp:Button ID="Button1" Text="Get Custom Config Info" OnClick="Button1_Click" /> </form> </body> </HTML>
Der folgende Code für das Klickereignis der Schaltfläche wird in Code-Behind-Datei gespeichert, die zur vorhergehenden ASPX-Seite gehört. Für die Code-Behind-Datei wird je nach language-Attribut der @Page-Deklaration die Dateinamenerweiterung .aspx.cs oder .aspx.vb verwendet.
[C#]
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Configuration; using System.Text; namespace BugTest { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.Label Label1; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion protected void Button1_Click(object sender, System.EventArgs e) { Hashtable config = (Hashtable)System.Configuration.ConfigurationSettings.GetConfig("myCustomGroup/myCustomSection"); StringBuilder sb = new StringBuilder(); sb.AppendFormat("Config object item count = {0}<br/><br/>", config.Count); foreach (DictionaryEntry deKey in config) { sb.AppendFormat("<h2>Attributes in the {0} Element:</h2>", deKey.Key.ToString()); Hashtable attribs = (Hashtable)deKey.Value; foreach (DictionaryEntry deAttrib in attribs) { sb.AppendFormat("{0} = {1}<br/>", deAttrib.Key.ToString(), deAttrib.Value.ToString()); } } Label1.Text = sb.ToString(); Label1.Visible = true; } } }
Imports System.Text Public Class WebForm1 Inherits System.Web.UI.Page #Region " Web Form Designer Generated Code " 'This call is required by the Web Form Designer. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() End Sub Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents Button1 As System.Web.UI.WebControls.Button 'NOTE: The following placeholder declaration is required by ' the Web Form Designer. 'Do not delete or move it. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal _ e As System.EventArgs) Handles MyBase.Init 'CODEGEN: This method call is required by the Web Form Designer 'Do not modify it using the code editor. InitializeComponent() End Sub #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal _ e As System.EventArgs) Handles MyBase.Load 'Put user code to initialize the page here End Sub Protected Sub Button1_Click(ByVal sender As System.Object, ByVal _ e As System.EventArgs) Handles Button1.Click Dim config As Hashtable = _ System.Configuration.ConfigurationSettings.GetConfig( _ "myCustomGroup/myCustomSection") Dim sb As New StringBuilder sb.AppendFormat("Config object item count = {0}<br/><br/>", _ config.Count) For Each deKey As DictionaryEntry In config sb.AppendFormat("<h2>Attributes in the {0} Element:</h2>", _ deKey.Key.ToString()) Dim attribs As Hashtable = deKey.Value For Each deAttrib As DictionaryEntry In attribs sb.AppendFormat("{0} = {1}<br/>", deAttrib.Key.ToString(), _ deAttrib.Value.ToString()) Next Label1.Text = sb.ToString() Label1.Visible = True Next End Sub End Class
Siehe auch
Aufgaben
Gewusst wie: Erstellen von benutzerdefinierten Konfigurationsabschnitten mit ConfigurationSection
Konzepte
Struktur der ASP.NET-Konfigurationsdatei (Abschnitte und Abschnittshandler)
Weitere Ressourcen
Verwalten von ASP.NET-Websites