Comment : créer des sections de configuration personnalisées à l'aide de IConfigurationSectionHandler
Mise à jour : novembre 2007
Vous pouvez étendre le jeu standard des paramètres de configuration ASP.NET avec vos propres éléments de configuration XML. Pour cela, vous devez créer votre propre gestionnaire de section de configuration.
Le gestionnaire doit être une classe .NET Framework qui implémente l'interface System.Configuration.IConfigurationSectionHandler ou la classe System.Configuration.ConfigurationSection.
Remarque : |
---|
Cette rubrique utilise l'interface System.Configuration.IConfigurationSectionHandler qui a été désapprouvée dans le .NET Framework version 2.0. Pour obtenir un exemple qui utilise la classe System.Configuration.ConfigurationSection, consultez Comment : créer des sections de configuration personnalisées à l'aide de ConfigurationSection. Si vous utilisez les exemples de code suivants, générez-les avec le .NET Framework version 1.0 ou 1.1. |
Le gestionnaire de section interprète et traite les paramètres définis dans les éléments de configuration XML dans une partie spécifique d'un fichier Web.config et retourne un objet de configuration approprié basé sur les paramètres de configuration. L'objet de configuration que la classe du gestionnaire retourne peut être n'importe quelle structure de données ; il n'est pas limité à une classe de configuration de base ni à un format de configuration. ASP.NET utilise l'objet de configuration pour lire et écrire à votre élément de configuration personnalisée.
Pour créer un gestionnaire de section de configuration personnalisée
Créez une classe publique qui implémente l'interface System.Configuration.IConfigurationSectionHandler, comme illustré dans le code suivant.
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 } }
Ajoutez votre propre code pour effectuer le travail de configuration que vous souhaitez.
Par exemple, vous pouvez remplacer la ligne throw new Exception("The method is not implemented."); par le code qui obtient les noms et valeurs d'attributs de la propriété Attributes du paramètre section et retourner un objet de configuration personnalisée. L'exemple suivant utilise Hashtable en tant qu'objet de configuration.
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 } }
Pour ajouter un gestionnaire de section personnalisé à un fichier de configuration ASP.NET
Ajoutez un élément sectionGroup et section à votre fichier Web.config dans l'élément configSections, comme illustré dans le code suivant.
Remarque : L'imbrication d'un élément section dans sectionGroup est facultative, mais recommandée pour aider à organiser les données de configuration.
Vous pouvez ajouter la déclaration de gestionnaire de section dans un fichier de configuration différent de celui dans lequel vous ajoutez vos éléments de configuration personnalisée à condition que le fichier de configuration dans lequel le gestionnaire de section est déclaré se trouve à un niveau supérieur dans la hiérarchie des fichiers de configuration. Pour plus d'informations, consultez Hiérarchie du fichier de configuration ASP.NET et héritage.
L'attribut type de l'élément section doit correspondre au manifeste de l'assembly ou une erreur de configuration se produira. Le fichier d'assembly lui-même doit se trouver dans le même répertoire de l'application ASP.NET que le fichier Web.config qui le définit.
<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>
Ajoutez vos éléments de configuration personnalisée dans la zone de paramètres de la section de configuration de votre fichier Web.config.
<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>
Pour accéder par programme à vos données de configuration personnalisée
Obtenez une instance de votre objet de configuration personnalisée et utilisez la méthode ConfigurationManager.GetSection ou la méthode WebConfigurationManager.GetSection pour la remplir.
L'exemple suivant d'une page ASPX fonctionne avec les exemples précédents afin d'énumérer les attributs et les éléments enfants de la section de configuration personnalisée lorsque l'utilisateur clique sur un bouton.
Étant donné que le gestionnaire de section personnalisé utilise Hashtable comme objet de configuration, la méthode GetSection retourne Hashtable.
Le code suivant est inséré dans la page .aspx. Le code de l'événement de clic du bouton, inséré dans le fichier code-behind, figure dans l'exemple de code suivant.
Les exemples de code suivants exigent la présence du .NET Framework version 1.0 ou 1.1.
<%@ 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>
Le code suivant de l'événement de clic du bouton est inséré dans le fichier code-behind qui appartient à la page .aspx précédente. Le fichier code-behind utilise l'extension de nom de fichier .aspx .cs ou .aspx .vb, selon l'attribut language de la déclaration @Page.
[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
Voir aussi
Tâches
Comment : créer des sections de configuration personnalisées à l'aide de ConfigurationSection
Concepts
Structure du fichier de configuration ASP.NET (sections et gestionnaires de sections)
Autres ressources
Administration de sites Web ASP.NET