Add custom section in web.config

Emmegi Arts newsHow to add custom section in web.config

Ovvero, vedremo come creare nel web.config una sezione personalizzata (custom section) per inserire i propri parametri. Il tutto sarà basato sul framework .NET 4.0 ed il linguaggio VB.

AGGIORNAMENTI: 09/05/2013 creazione articolo

 

 

 

Il web.config non è altro che un file di configurazione di una applicazione ASP .NET.

Il web.config è un file in formato XML diviso in sezioni e con una struttura ben precisa.

Quello che faremo è vedere come aggiungere una sezione (custom section) all'interno di questo file.

Nel file web.config noi vogliamo creare una sezione di questo tipo:

 

<MiaSezione>
    <Chiavi>
        <add name="nome1" value="valore1"/>
        <add name="nome2" value="valore2"/>
    </Chiavi>
</MiaSezione>

Questa sarà la nostra cutom section.

La nostra sezione vuole memorizzare una collezione di valori.

Estendere le section del file web.config è permesso ed il FrameWork .NET 4.0 lo permette in maniera più o meno agevole.

Per fare questo bisogna creare una classe pubblica che estenda

System.Configuration.ConfigurationSection

 

Si fa quindi qualcosa del genere:

 

Public Class MiaSezione
    Inherits System.Configuration.ConfigurationSection

    <ConfigurationProperty("Chiavi")> _
    Public ReadOnly Property ChiaviCollection() As ChiaviCollection
        Get
            Return TryCast(Me("Chiavi"), ChiaviCollection)
        End Get
    End Property
End Class

 

Questa classe dichiara appunto che al suo interno deve esserci una collezione di tipo ChiaviCollection.

Questa collezione è descritta dalla classe:

 

<ConfigurationCollection(GetType(KeyElement), AddItemName:="add")> _
Public Class ChiaviCollection
    Inherits ConfigurationElementCollection

    Protected Overrides Function CreateNewElement() As ConfigurationElement
        Return New KeyElement()
    End Function

    Public Sub Add(ByVal valueInteger As Integer)
        Dim newElement As KeyElement = TryCast(Me.CreateNewElement(), KeyElement)
        MyBase.BaseAdd(newElement)
    End Sub

    Protected Overrides Function GetElementKey(ByVal element As ConfigurationElement) As Object
        Return (CType(element, KeyElement)).Name
    End Function
End Class

 

Questa classe definisce semplicemente il comportamento standard di una collection. Il singolo elemento della collection è di tipo KeyElement descritto dalla classe:

 

Public Class KeyElement
    Inherits ConfigurationElement

    <ConfigurationProperty("name", DefaultValue:="Arial", IsRequired:=True)> _
    Public Property Name() As String
        Get
            Return CType(Me("name"), String)
        End Get
        Set(ByVal value As String)
            Me("name") = value
        End Set
    End Property

    <ConfigurationProperty("value", DefaultValue:="Arial", IsRequired:=True)> _
    Public Property Value() As String
        Get
            Return CType(Me("value"), String)
        End Get
        Set(ByVal value As String)
            Me("value") = value
        End Set
    End Property
End Class

 


Fatto questo abbiamo realizzato il codice per gestire la nuova sezione.

Nel file web.config oltre alla nostra nuova sezione bisogna mettere la dichiarazione per poterla usare. Ovvero:

 

<configSections>
    <section name="MiaSezione" type="assemblyName.MiaSezione, assemblyName" />    
</configSections>

 

Questa dichiarazione è di fondamentale importanza perché indica al sistema il nome della nuova sezione e la classe che se ne occuperà. Se dalla dichiarazione omettete o sbagliate l'assemblyName (che deve essere il qualificatore completo per individuare la classe) otterrete un errore in fase di running dell'applicazione. Un errore tipico è il seguente:

 

An error occurred creating the configuration section handler for MiaSezione: Could not load type 'MiaSezione'

 

Che indica appunto che il sistema non è riuscito a caricare la vostra classe.

Ultima cosa da fare.

Come si fa a leggere da codice questa nuova sezione?

 

Dim miaSezione As MiaSezione = CType(System.Configuration.ConfigurationManager.GetSection("MiaSezione"),  _
                MiaSezione)

Dim element As KeyElement
Dim name As String
Dim value As String
For Each element In secureSettingSection.SecureKeysCollection
    name = element.Name
    value = element.Value
    'vostro codice di gestione del parametro
Next

 

Tutto qua!

Buon lavoro!