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.
L’elemento del file XML di configurazione in cui inserire i parametri
di configurazione personali è
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.
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.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:
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.
L’elemento del file XML di configurazione in cui inserire i
parametri di configurazione personali è
Esempio:
E’ possibile leggere dal codice questo parametro attraverso la proprietà statica AppSettings della classe ConfigurationSettings:
String
ConnString = ConfigurationSettings.AppSettings[“ConnString”];
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.
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(). ??????p>
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.
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
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.
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
///
///
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
//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.
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
[da 1 a 0 di 0 commenti] | Indietro