RicorDiario .NET

File di configurazione WEB.config

Introduzione

E’ possibile configurare le singole applicazioni ASP.NET mediante il sistema di configurazione di .NET.
I dati di configurazione di ASP.NET risiedono in alcuni file XML chiamati web.config che possono comparire in diverse directory nelle applicazioni .NET.
Attraverso i file di configurazione è possibile intervenire su:
1. L’intera macchina .NET;
2. La singola applicazione;
3. La sicurezza.

Esaminiamo solo l’aspetto che concerne la configurazione delle applicazioni ed in particolare vediamo come parametrizzare alcuni valori in modo che sia possibile impostarli una volta effettuato il deploy dell’applicazione. In questo modo possiamo cambiare alcune impostazioni senza dover rimettere mano al codice.

Configurazioni semplici


L’elemento del file XML di configurazione in cui inserire i parametri di configurazione personali è . Per ogni parametro deve essere inserito un elemento del tipo:
, dove key è il nome del parametro, value è il valore del parametro.

Esempio:




E’ possibile leggere dal codice questo parametro attraverso la proprietà statica AppSettings della classe ConfigurationSettings:

String ConnString = ConfigurationSettings.AppSettings[“ConnString”];

Questo e gli altri elementi di configurazione devono essere inseriti nel file web.config della directory dell’applicazione o in una directory di livello superiore.

Configurazioni complesse

Se i parametri di configurazione sono molti oppure sono complessi (ad esempio la stringa di connessione ODBC è un parametro composto, quindi complesso), vi è un sistema più efficace:
è possibile, infatti, introdurre nel file di configurazione XML nuovi tag personalizzati che individuano sezioni che verranno gestite attraverso un “gestore”, cioè un oggetto di una classe che implementa l’interfaccia IConfigurationSectionHandler.

In particolare il gestore si occupa di leggere/scrivere una sezione, di elaborare le informazioni presenti nei vari elementi che la compongono e di restituire tali informazioni attraverso un opportuno oggetto di configurazione.

 

E’ possibile configurare le singole applicazioni ASP

Introduzione

E’ possibile configurare le singole applicazioni ASP.NET  mediante il sistema di configurazione di .NET.

I dati di configurazione di ASP.NET risiedono in alcuni file XML chiamati web.config che possono comparire in diverse directory nelle applicazioni .NET.

Attraverso i file di configurazione è possibile intervenire su:

  1. L’intera macchina .NET;
  2. La singola applicazione;
  3. La sicurezza.

Esaminiamo solo l’aspetto che concerne la configurazione delle applicazioni ed in particolare vediamo come parametrizzare alcuni valori in modo che sia possibile impostarli una v??????olta effettuato il deploy dell’applicazione. In questo modo possiamo cambiare alcune impostazioni senza dover rimettere mano al codice.

Configurazioni semplici

L’elemento del file XML di configurazione in cui inserire i parametri di configurazione personali è . Per ogni parametro deve essere inserito un elemento del tipo:

, dove key è il nome del parametro, value è il valore del parametro.

Esempio:

            Driver={SQL Server};Server=MyServer” />

E’ possibile leggere dal codice questo parametro attraverso la proprietà statica AppSettings della classe ConfigurationSettings:

String ConnString = ConfigurationSettings.AppSettings[“ConnString”];

Questo e gli altri elementi di configurazione devono essere inseriti nel file web.config della directory dell’applicazione o in una directory di livello superiore.

Configurazioni complesse

Se i parametri di configurazione sono molti oppure sono complessi (ad esempio la stringa di connessione ODBC è un parametro composto, quindi complesso), vi è un sistema più efficace:

è possibile, infatti, introdurre nel file di configurazione XML nuovi tag personalizzati che individuano sezioni  che verranno gestite attraverso un “gestore”, cioè un oggetto di una classe che implementa l’interfaccia IConfigurationSectionHandler.

In particolare il gestore si occupa di leggere/scrivere una sezione, di elaborare le informazioni presenti nei vari elementi che la compongono e  di restituire tali informazioni attraverso un opportuno oggetto di configurazione.

Creazione un gestore di configurazione

Per creare un gestore di configurazione, creare una classe pubblica che implementi l’interfaccia IConfigurationSectionHandler e scrivere il metodo Create() che verrà invocato dal metodo AppSettings.GetConfig().

object IConfigurationSectionHandler.Create(object parent, object configContext, XmlNode section)

Attraverso questo metodo possiamo leggere dall’oggetto section di classe XmlNode i parametri di configurazione della sezione (che vedremo più avanti come inserire nel file di configurazione) e popolare un apposito oggetto di configurazione che sarà poi restituito.

Per leggere i parametri di configurazione presenti nella sezione, invocare la property Attributes dell’oggetto XmlNode, passato al metodo attraverso il parametro section, che restituisce la collezione contenente tutti i parametri.

All’interno della procedura chiamante, cioè quella che impiegherà i parametri di configurazione, invocare uno dei due seguenti metodi:

System.Configuration.ConfigurationManager.GetSection(System.String)

System.Web.Configuration.WebConfigurationManager.GetSection(System.String)

Dove il parametro di tipo String rappresenta il nome della sezione da leggere. Il metodo GetSection restituirà un’istanza della classe di configurazione.

Inserire una sezione nel file di configurazione

Sono necessari due passi:

1.      Il primo passo è meramente dichiarativo perché consente solo di dichiarare la struttura delle sezioni di configurazione personalizzate. Nel file web.config, all’interno dell’elemento , aggiungere uno o più elementi e, all’interno di ciascuno di essi, uno o più elementi

secondo necessità. E’possibile l’inserimento di un solo elemento figlio per file di configurazione: esso deve essere il primo.

Nella parte dichiarativa si deve specificare, per ogni elemento <section>, il nome della sezione nell’attributo name ed il nome completo della classe (comprensivo del namespace), che implementa l’interfaccia IConfigurationSectionHandler e che gestirà sezione, nell’attributo type. In tale attributo deve essere specificato il nome dell’assembly di appartenenza della classe (attenzione, questo punto è all’origine di comuni errori).

2.      Il secondo passo consente di definire la configurazione personalizzata vera e propria attraverso la valorizzazione di una o più sezioni tra quelle dichiarate nel primo passo.

Esempio

Configuriamo una connessione ODBC verso un database.

Per configurare la connessione odbc inserire nel file Web.config la seguente sezione:

<configuration>

 

 

  <configSections>

    <sectionGroup name="Connections">

      <section name="OdbcConfig"

               type="WebApplication1.OdbcConfigurationSectionHandler, WebApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"

               allowLocation="true"

               allowDefinition="Everywhere"

      />

    sectionGroup>

  configSections>

 

  <Connections>

    <OdbcConfig Driver="SQL Server" Server="PC-DENITTIS" Database="TempDatabase" Uid="myuser" Pwd="mypassword"/>

  Connections>

. . . .

configuration>

Come si vede si è dichiarato un gruppo di sezioni (sectionGroup), denominato “Connections”, all’interno del quale è stata inserita la dichiarazione della sezione di configurazione della connessione ODBC con il database, identificata con il tag “OdbcConfig”.

Terminata la dichiarazione della sezione, si è passati alla definizione della medesima in un altro punto del file xml: per migliorare la leggibilità della configurazione si è scelto di inserire la definizione immediatamente di seguito alla dichiarazione.

Note

(1)   L’elemento <configSections> che racchiude tutte le dichiarazioni deve essere il primo nodo di livello inferiore all’elemento <configuration>, pena un errore di configurazione;

(2)   La scelta di inserire la definizione della sezione di seguito alla sua dichiarazione non è obbligatoria: è possibile inserirla in qualunque altro punto del file xml.

(3)   L’attributo type dell’elemento <section> specifica la classe WebApplication1.OdbcConfigurationSectionHandler, ed il relativo namespace (WebApplication1), che dovrà ge??????stire la sezione. La dichiarazione di tale classe verrà esaminata nel seguito del paragrafo;

Vediamo come impiegare in pratica la sezione di configurazione OdbcConfig all’interno di un generico metodo che ha il compito di creare una connessione ODBC. Esaminiamo, a tal proposito, il seguente frammento di codice che definisce il metodo apriConnessioneODBC().

      using System.Configuration;

      … … …

public static void apriConnessioneODBC()

            {

            String StrConn = null;

            OdbcConfiguration MyOdbcConfig = null;

            // Prelievo dei parametri sulla connessione ODBC

            MyOdbcConfig = (OdbcConfiguration)System.Configuration.ConfigurationSettings.GetConfig("Connections/OdbcConfig");

                  // Apertura della connessione.

            if(MyConn==null)

                  {

                  StrConn = MyOdbcConfig.ToString();

                  MyConn = new OdbcConnection(StrConn.ToString());

                  MyConn.Open();

                  }

                 

                  // Apertura del DataAdapter e del DataSet Globali

                  OdbcDA = new OdbcDataAdapter();

                  MyDS = new DataSet();

                 

            } // fine funzione.

Sono due i passaggi essenziali:

(1)   Si legge dal file di configurazione Web.config la sezione OdbcConfig: a questo proposito basta invocare il metodo System.Configuration.ConfigurationSettings.GetConfig()  passandogli, come argomento, una stringa che specifica l’elemento che rappresenta la sezione di configurazione da leggere (nel nostro esempio “Connections/OdbcConfig”). Il metodo restituirà un riferimento all’oggetto di classe OdbcConfiguration, la definizione della quale vedremo tra breve, che è l’oggetto di configurazione.

(2)   Invocando il metodo ToString() dell’oggetto di configurazione ottenuto al passo precedente, si ottiene la stringa di connessione secondo l’impostazione corrente del file di configurazione.

L’oggetto di configurazione OdbcConfiguration, definito come nel seguente frammento di codice, ha solo il compito di comporre la stringa di connessione Odbc. In generale gli oggetti di configurazione sono il luogo più opportuno per compiere tutte quelle operazioni sui parametri di configurazione che riteniamo utili per l’applicazione che stiamo realizzando.

using System.Configuration;

namespace WebApplication1

{

    ///

    /// Classe degli oggetti di configurazione dei driver ODBC

    /// per la connessione ai database.

    /// @MdN - 21/10/2009

    ///

    public class OdbcConfiguration

    {

        public String driver = null;

        public String uid = null;

        public String pwd = null;

        public String database = null;

        public String server = null;

        ///

        /// Costruttore

        /// @MdN - 21/10/2009

        ///

        public OdbcConfiguration()

        {

            //NOP

        }

        ///

        /// Crea e restituisce la stringa di inizializzazione.

        /// @MdN

        ///

        /// stringa di inizializzazione del driver ODBC.

        public String ToString()

        {

            StringBuilder StrConn = new StringBuilder();

            if (driver != null)

            {

                if (StrConn.Length > 0)

                    StrConn.Append(";");

                StrConn.Append("Driver={" + driver + "}");

            }

            //Server

            if (server != null)

            {

                if (StrConn.Length > 0)

                    StrConn.Append(";");

                StrConn.Append("Server=" + server);

            }

            //Database

            if (database!= null)

            {

                if (StrConn.Length > 0)

                    StrConn.Append(";");

                StrConn.Append("Database=").Append(database);

            }

            //Uid

            if (uid != null)

            {

                if (StrConn.Length > 0)

                    StrConn.Append(";");

                StrConn.Append("Uid=").Append(uid);

            }

            //Pwd

            if (pwd != null)

            {

                if (StrConn.Length > 0)

                    StrConn.Append(";");

                StrConn.Append("Pwd=").Append(uid);

            }

            return StrConn.ToString();

        }

    }

}

 

Il problema che rimane da risolvere è: chi valorizza gli attributi dell’oggetto di configurazione?

La valorizzazione avviene da parte dell’oggetto gestore della configurazione. Questo oggetto viene creato dal metodo statico ConfigurationSettings.GetConfig() che, come già detto, invoca il metodo Create() che il gestore della configurazione deve implementare per conformità all’interfaccia IConfigurationSectionHandler. Un ultimo punto da chiarire è come fa il metodo GetConfig() ad associare la sezione di configurazione al corrispondente gestore della configurazione. Tale informazione è scritta proprio nell’attributo type dell’elemento xml della dichiarazione della sezione stessa: nel nostro esempio la classe OdbcConfigurationSectionHandler, la cui definizione è riportata nel seguente frammento di codice.

using System.Configuration;

using System.Xml;

………

namespace WebApplication1

{

    public class OdbcConfigurationSectionHandler : IConfigurationSectionHandler

    {

        ///

        /// Crea un oggetto OdbcConfiguration, lo imposta e lo restituisce.

        /// @MdN - 21/10/2009

        ///

        ///

        ///

        ///

        ///

        public object Create(object parent, object configContext, XmlNode section)

        {

            //Creazione dell'oggetto

            OdbcConfiguration MyConf = new OdbcConfiguration();

            //Esplorazione degli attributi

            Type Tgt = MyConf.GetType();

            foreach (XmlAttribute attrib in section.Attributes)

            {

                //In questo ciclo viene esaminato il tipo di attributo

                //del nodo XML che rappresenta l'elemento

e si associa?????? il corrispondente valore

                //all'omonimo attributo dell'oggetto.

                //NOTA BENE:

                //Usiamo reflection per trovare la corrispondenza tra gli attributi dell'oggetto

                //e gli attributi dell'elemento

                FieldInfo[] l_InfoS = Tgt.GetFields();

                foreach (FieldInfo l_Info in l_InfoS)

                {

                    if (l_Info.Name.ToLower().CompareTo(attrib.Name.ToLower()) == 0)

                        l_Info.SetValue(MyConf, attrib.Value);

                }               

            }

            return MyConf;

        }

    }

}

Come si vede l’oggetto di classe OdbcConfigurationSectionHandler, facendo uso di oggetti del namespace System.xml, ricava i valori di configurazione dagli attributi dell’elemento OdbcSection, passato come parametro al metodo Create() mediante il riferimento section ad un oggetto di classe XmlNode. Una volta letti i valori degli attributi del nodo section, il metodo li copia negli attributi dell’oggetto di configurazione di classe OdbcConnection. Per ottenete un codice più snello ed un funzionamento più flessibile si è usato un ciclo di impostazione degli attributi dell’oggetto di classe OdbcConfiguration che sfrutta il meccanismo della “reflection”.

Nel nostro esempio abbiamo creato una sezione di configurazione semplificata costituita da soli attributi. In generale, però, questa sezione può avere sotto nodi, come nel seguente esempio.

<OdbcConfig>

 <Driver>SQL ServerDriver>

 <Server>PC-DENITTISServer>

 <Database Uid="myuser" Pwd="mypassword">TempDatabaseDataBase>

OdbcConfig>

In questo caso, all’interno del metodo Create() dell’oggetto OdbcConnectionConfigurationHandler e, più precisamente nel ciclo di esame del nodo XmlNode, avremmo dovuto effettuare una visita di tutti i sottonodi: elementi ed attributi.

Errori Comuni

  1. La parte dichiarativa delle sezioni di configurazione personalizzate non è il primo figlio del nodo . Il messaggio mostrato a video è il seguente:

Descrizione: Si è verificato un errore durante l'elaborazione di un file di configurazione necessario per soddisfare la richiesta. Verificare i dettagli dell'errore specifico riportati di seguito e modificare il file di configurazione in modo appropriato.
Messaggio di errore del parser: È ammesso un solo elemento per file di configurazione. Ove presente, questo deve essere il primo figlio dell'elemento principale.

  1. Non specificare correttamente, nell’attributo Type dell’elemento
    , i riferimenti alla classe che implementa l’interfaccia IConfigurationSectionHandler o all’assembly relativo.
Inserisci un commento   |   Indietro

  [da 1 a 0 di 0 commenti]     |   Indietro

Inserisci un commento

Nick: e-mail:

web:

Commento: