Condividi tramite


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

  1. 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; }
            // }
        }
    }
    
  2. 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

  1. 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>
    
  2. 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

Altre risorse

Amministrazione di siti Web ASP.NET

Configurazione di applicazioni