Procedura: creare sezioni di configurazione personalizzate tramite ConfigurationSection
Aggiornamento: novembre 2007
È possibile estendere il set standard delle impostazioni di configurazione ASP.NET con altri elementi di configurazione XML. Per eseguire questa operazione, è necessario creare un gestore della sezione di configurazione personalizzato.
Il gestore deve essere una classe .NET Framework che implementa la classe System.Configuration.ConfigurationSection.
Nota: |
---|
Nelle versioni 1.0 e 1.1 di .NET Framework un gestore della sezione di configurazione doveva implementare l'interfaccia System.Configuration.IConfigurationSectionHandler, ormai obsoleta. Tuttavia, un esempio di codice è riportato in Procedura: creare sezioni di configurazione personalizzate tramite IConfigurationSectionHandler. |
Il gestore della sezione interpreta ed elabora le impostazioni definite negli elementi di configurazione XML all'interno di una sezione specifica di un file Web.config e restituisce l'oggetto di configurazione appropriato in base alle impostazioni di configurazione. L'oggetto di configurazione restituito dalla classe del gestore può corrispondere a qualsiasi struttura di dati e non è limitato a nessuna classe di configurazione o formato di configurazione di base. ASP.NET utilizza l'oggetto di configurazione per leggere e scrivere nell'elemento di configurazione personalizzato.
Per creare un gestore della sezione di configurazione personalizzato
Creare una classe pubblica che eredita la classe System.Configuration.ConfigurationSection, come illustrato nell'esempio di codice riportato di seguito.
Imports System Imports System.Collections Imports System.Text Imports System.Configuration Imports System.Xml Namespace MyConfigSectionHandler Public Class MyHandler Inherits ConfigurationSection Public Sub New() End Sub ' Add declarations for child elements and attributes like this: '<ConfigurationProperty("<propertyName>", <named parameters>)> _ 'Public Property MyAttrib1() As <type> ' Get ' Return CStr(Me("<propertyName>")) ' End Get ' Set(ByVal value As <type>) ' Me("<propertyName>") = value ' End Set 'End Property End Class End Namespace
using System; using System.Collections; using System.Text; using System.Configuration; using System.Xml; namespace MyConfigSectionHandler { public class MyHandler : ConfigurationSection { public MyHandler() { } // Add declarations for child elements and attributes like this: // [ConfigurationProperty("<propertyName>", <named parameters>)] // public <type> <PropertyName> // { // get { return (<type>)this["<propertyName>"]; } // set { this["<propertyName>"] = value; } // } } }
Aggiungere il codice personalizzato per eseguire le operazioni di configurazione desiderate.
È possibile, ad esempio, sostituire il codice commentato con il codice riportato di seguito che ottiene i valori dalla sezione personalizzata.
Imports System Imports System.Collections Imports System.Text Imports System.Configuration Imports System.Xml Namespace MyConfigSectionHandler Public Class MyHandler Inherits ConfigurationSection Public Sub New() End Sub Public Sub New(ByVal attribVal As String) MyAttrib1 = attribVal End Sub <ConfigurationProperty("myAttrib1", DefaultValue:="Clowns", IsRequired:=True)> _ <StringValidator(InvalidCharacters:="~!@#$%^&*()[]{}/;'\|\\", MinLength:=1, MaxLength:=60)> _ Public Property MyAttrib1() As String Get Return CStr(Me("myAttrib1")) End Get Set(ByVal value As String) Me("myAttrib1") = value End Set End Property <ConfigurationProperty("myChildSection")> _ Public Property MyChildSection() As MyChildConfigElement Get Return CType(Me("myChildSection"), MyChildConfigElement) End Get Set(ByVal value As MyChildConfigElement) Me("myChildSection") = CType(value, MyChildConfigElement) End Set End Property End Class Public Class MyChildConfigElement Inherits ConfigurationElement Public Sub New() End Sub Public Sub New( _ ByVal a1 As String, ByVal a2 As String) MyChildAttribute1 = a1 MyChildAttribute2 = a2 End Sub <ConfigurationProperty("myChildAttrib1", DefaultValue:="Zippy", IsRequired:=True)> _ <StringValidator(InvalidCharacters:="~!@#$%^&*()[]{}/;'\|\\", MinLength:=1, MaxLength:=60)> _ Public Property MyChildAttribute1() As String Get Return CStr(Me("myChildAttrib1")) End Get Set(ByVal value As String) Me("myChildAttrib1") = value End Set End Property <ConfigurationProperty("myChildAttrib2", DefaultValue:="Michael Zawondy", IsRequired:=True)> _ <StringValidator(InvalidCharacters:="~!@#$%^&*()[]{}/;'\|\\", MinLength:=1, MaxLength:=60)> _ Public Property MyChildAttribute2() As String Get Return CStr(Me("myChildAttrib2")) End Get Set(ByVal value As String) Me("myChildAttrib2") = value End Set End Property End Class End Namespace
using System; using System.Collections; using System.Text; using System.Configuration; using System.Xml; namespace MyConfigSectionHandler { public class MyHandler : ConfigurationSection { public MyHandler() { } public MyHandler(String attribVal) { MyAttrib1 = attribVal; } [ConfigurationProperty("myAttrib1", DefaultValue = "Clowns", IsRequired = true)] [StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 60)] public String MyAttrib1 { get { return (String)this["myAttrib1"]; } set { this["myAttrib1"] = value; } } [ConfigurationProperty("myChildSection")] public MyChildConfigElement MyChildSection { get { return (MyChildConfigElement)this["myChildSection"]; } set { this["myChildSection"] = value; } } } public class MyChildConfigElement : ConfigurationElement { public MyChildConfigElement() { } public MyChildConfigElement(String a1, String a2) { MyChildAttribute1 = a1; MyChildAttribute2 = a2; } [ConfigurationProperty("myChildAttrib1", DefaultValue = "Zippy", IsRequired = true)] [StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 60)] public String MyChildAttribute1 { get { return (String)this["myChildAttrib1"]; } set { this["myChildAttrib1"] = value; } } [ConfigurationProperty("myChildAttrib2", DefaultValue = "Michael Zawondy", IsRequired = true)] [StringValidator(InvalidCharacters = "~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 60)] public String MyChildAttribute2 { get { return (String)this["myChildAttrib2"]; } set { this["myChildAttrib2"] = value; } } } }
In questo esempio viene utilizzato il modello dichiarativo. La classe System.Configuration.ConfigurationSection può essere implementata anche mediante il modello a livello di codice. Per un esempio, vedere i cenni preliminari sulla classe System.Configuration.ConfigurationSection e Classi per la creazione di gestori delle sezioni personalizzati.
Ai fini del confronto, questo esempio è simile al codice illustrato in Procedura: creare sezioni di configurazione personalizzate tramite IConfigurationSectionHandler. Tuttavia, ereditare dalla classe System.Configuration.ConfigurationSection consente di ottenere un controllo più efficace del gestore della sezione. Il file di configurazione della procedura che segue, ad esempio, rende possibile la presenza di un elemento figlio denominato myChildSection per il quale il codice precedente dichiara una ConfigurationProperty e la definisce come una classe derivata da ConfigurationElement. Inoltre l'incapsulamento della funzionalità dell'insieme nella classe ConfigurationElementCollection consente di creare elementi dell'insieme in grado di utilizzare elementi di aggiunta, rimozione e cancellazione in un file di configurazione. Per ulteriori informazioni ed esempi, vedere ConfigurationElementCollection.
Per aggiungere un gestore della sezione personalizzato a un file di configurazione ASP.NET
Aggiungere un elemento sectionGroup e un elemento section al file Web.config all'interno dell'elemento configSections, come illustrato nell'esempio di codice riportato di seguito. Questa dichiarazione associa il gestore della sezione personalizzato al nome della sezione.
Nota: La nidificazione di un elemento section in un elemento sectionGroup è facoltativa, sebbene sia consigliabile per facilitare una migliore organizzazione dei dati di configurazione.
È possibile aggiungere la dichiarazione del gestore della sezione in un file di configurazione diverso da quello in cui sono stati aggiunti gli elementi di configurazione personalizzati, purché il file di configurazione in cui viene dichiarato il gestore di sezione si trovi a un livello superiore nella gerarchia di file di configurazione. Per ulteriori informazioni, vedere Gerarchia ed ereditarietà dei file di configurazione di ASP.NET.
Se l'attributo type dell'elemento section non corrisponde al manifesto dell'assembly, si verificherà un errore di configurazione. Lo stesso file assembly deve trovarsi nella stessa directory dell'applicazione ASP.NET del file Web.config che lo definisce.
<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>
Aggiungere gli elementi di configurazione personalizzati nell'area delle impostazioni della sezione di configurazione del file 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>
Per accedere a livello di codice ai dati di configurazione personalizzati
Ottenere un'istanza dell'oggetto di configurazione personalizzato e utilizzare il metodo GetSection o il metodo GetSection per compilarlo.
Nel seguente esempio di pagina ASPX vengono utilizzati gli esempi precedenti per enumerare gli attributi e gli elementi figlio della sezione di configurazione personalizzata.
<%@ Page Language="C#" %> <script > protected void Button1_Click(object sender, EventArgs e) { MyConfigSectionHandler.MyHandler config = (MyConfigSectionHandler.MyHandler)System.Configuration.ConfigurationManager.GetSection( "myCustomGroup/myCustomSection"); StringBuilder sb = new StringBuilder(); sb.Append("<h2>Attributes in the myCustomSection Element:</h2>"); sb.AppendFormat("myAttrib1 = {0}<br/>", config.MyAttrib1.ToString()); sb.Append("<h2>Attributes in the myChildSection Element:</h2>"); sb.AppendFormat("myChildAttrib1 = {0}<br/>", config.MyChildSection.MyChildAttribute1.ToString()); sb.AppendFormat("myChildAttrib2 = {0}<br/>", config.MyChildSection.MyChildAttribute2.ToString()); Label1.Text = sb.ToString(); Label1.Visible = true; } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>Untitled Page</title> </head> <body> <form id="form1" > <div> <h1>Enumerate MyCustomSection</h1> <asp:Label ID="Label1" Text="" /> <br /> <asp:Button ID="Button1" Text="Get Custom Config Info" OnClick="Button1_Click" /> </div> </form> </body> </html>
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script > Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Dim config As New MyConfigSectionHandler.MyHandler config = _ System.Configuration.ConfigurationManager.GetSection("myCustomGroup/myCustomSection") Dim sb As New StringBuilder sb.Append("<h2>Attributes in the myCustomSection Element:</h2>") sb.AppendFormat("myAttrib1 = {0}<br/>", config.MyAttrib1.ToString()) sb.Append("<h2>Attributes in the myChildSection Element:</h2>") sb.AppendFormat("myChildAttrib1 = {0}<br/>", config.MyChildSection.MyChildAttribute1.ToString()) sb.AppendFormat("myChildAttrib2 = {0}<br/>", config.MyChildSection.MyChildAttribute2.ToString()) Label1.Text = sb.ToString() Label1.Visible = True End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>Untitled Page</title> </head> <body> <form id="form1" > <div> <h1>Enumerate MyCustomSection</h1> <asp:Label ID="Label1" Text=""/> <br /> <asp:Button ID="Button1" Text="Get Custom Config Info" OnClick="Button1_Click" /> </div> </form> </body> </html>
Vedere anche
Concetti
Struttura dei file di configurazione ASP.NET (Sezioni e gestori della sezione)
Cenni preliminari sulla configurazione di ASP.NET