How 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!