autore: Tiziana Loporchio
Generalmente configuriamo una applicazione ASP.NET utilizzando i file Machine.config, web.config del sito web o della root del server.
E’ possibile amministrare il sito modificando tali file direttamente, oppure utilizzando lo snap-in ASP.NET Microsoft Management Console (MMC) che fornisce una interfaccia grafica per la configurazione del sito web.
E’ possibile altresì utilizzare l’ASP.NET Web Site Administration Tool da Visual Studio 2005.
In alcuni casi, però, questi Tool non ci permettono di fornire particolari combinazioni di configurazioni di cui abbiamo bisogno risultando, spesso, scomodi da utilizzare.
Potrebbero, per esempio, aprirsi scenari in cui non si ha accesso diretto al server ovvero potrebbe nascere sia la necessità di modificare le configurazioni in maniera frequente sia di concentrare la modifica di più siti in un unico tool di configurazione.
Soccorre, in questi casi, ASP.NET 2.0. Infatti una delle sue caratteristiche peculiari è la possibilità di accedere in modalità remota e aprire file di configurazione utilizzando la classe Configuration del Framework 2.0 come vedremo nell’articolo.
ASP.NET Configuration API
E’ possibile utilizzare l’ASP.NET Configuration API (Application Programming Interface) per scrivere codice che configuri l’applicazione senza editare direttamente il file di configurazione in formato XML (Extensible Markup Language). E’ possibile utilizzare questa API per accedere ai file di configurazione del sito web corrente o file su differenti web server.
Perché creare un tool personalizzato
Tool di amministrazione come lo snap-in ASP.NET MMC ed il Web Site Administration Tool forniscono accesso a tutte le proprietà di un sito.
Se dovesse sorgere la necessità di far eseguire specifiche attività a differenti amministratori e non si volessero esporre valori di configurazione per noi importanti e che potrebbero comportare malfunzionamenti dell’applicazione, potremmo realizzare un nostro tool di amministrazione per accedere solo a settings di configurazione di particolare interesse o di immediato utilizzo.
Il design di un tool di questo tipo ci permetterebbe di gestire completamente l’interfaccia e fornire qualsiasi caratteristica di impostazione necessaria con una interfaccia a noi più confacente.
Per esempio risulterebbe facile raggruppare in un'unica interfaccia settings presenti in diverse aree di tools esistenti, per velocizzare e facilitare le attività degli amministratori del sito web. Ancor più comodo sarebbe raggruppare settings presenti su differenti server, in un’unica interfaccia di gestione.
Accedere al web.config
Leggere in formato stringa impostazioni applicative e stringhe di connessione sono due delle più comuni attività su un file di configurazione. In ASP.NET 2.0 queste impostazioni risiedono nei tag <appSettings> e <connectionStrings>.
[Esempio di web.config]
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<appSettings>
<add key="uploadPath" value="..." />
</appSettings>
<connectionStrings>
<add name="pubs" connectionString="..."/>
</connectionStrings>
<system.web>
<compilation debug="true" />
<authentication mode="Windows"/>
<identity impersonate="true"/>
<trace enabled="true"/>
</system.web>
</configuration>
La classe WebConfigurationManager nel namespace System.Web.Configuration ci permette di accedere ai file di configurazione nelle applicazioni Web.
La differenza dalla versione precedente ASP.NET 1.x è la possibilità di separare in sezioni differenti appSettings e ConnectionStrings ed utilizzare proprietà diverse per leggerne i valori.
[C#]
// Lettura della sezione appSettings
string message;
message = WebConfigurationManager.AppSettings["uploadPath"];
// Lettura della sezione connectionStrings
string connectionString = WebConfigurationManager.ConnectionStrings["pubs"].ConnectionString;
Il web.config e l’Application Restart
L’ASP.NET Runtime esegue il riavvio dell’applicazione web ad ogni modifica del web.config.
Questo significa che il runtime creerà una nuova istanza dell’applicazione in un nuovo AppDomain, avendo un impatto sulle performance, sulle sessioni correnti e per questo la scrittura sul file web.config non dovrebbe avvenire spesso.
Nel caso in cui invece avessimo necessità di lavorare con il file di configurazione potremmo avere maggiore controllo sul riavvio dell’applicazione utilizzando una nuova caratteristica introdotta con la versione 2.0 di ASP.NET : “configuration sources” esterne.
Configuration Source : la soluzione
E’ possibile utilizzare sezioni di configurazione e posizionarle in un file dedicato. Sposteremo quindi tutti gli appSettings e le connectionStrings in file separati.
L’esempio di seguito prevede l’utilizzo di due file separati, appSettings.config e connections.config, che conterranno le sole informazioni xml relative alla specifica sezione.
[web.config]
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<appSettings configSource="appSettings.config"/>
<connectionStrings configSource="connections.config"/>
<system.web>
<compilation debug="true" />
<authentication mode="Windows"/>
<identity impersonate="true"/>
</system.web>
</configuration>
[file appSettings.config]
<appSettings>
<add key="uploadPath" value="..." />
</appSettings>
[file connections.config]
<connectionStrings>
<add name="pubs" connectionString="..."/>
</connectionStrings>
L’utilizzo di “configuration sources” esterne può tornare utile in moltissime situazioni, ma il beneficio maggiore è la possibilità di poter controllare il riavvio dell’applicazione. Se viene spostata una sezione del web.config in un file esterno, è possibile utilizzare una impostazione che definisce se il runtime debba o no eseguire il riavvio dell’applicazione quando viene effettuata una modifica sul file esterno di “configuration source”.
Se esaminiamo attentamente il file machine.config, noteremo che nella sezione <configSections>, ogni <section> può utilizzare l’attributo restartOnExternalChanges e la sezione appSettings utilizza il restartOnExternalChanges="false". Questo sta ad indicare che se la sezione appSettings viene spostata in un file esterno l’applicazione non eseguirà il riavvio se vengono eseguite delle modifiche sul file e le stesse informazioni saranno disponibili ed aggiornate tramite la chiamata a WebConfigurationManager.AppSettings.
Configuration API
Primo obiettivo nella creazione di un custom tool è aprire il file di configurazione. Utilizzando il namespace System.Configuration o System.Web.Configuration è possibile utilizzare i metodi statici OpenMachineConfiguration (machine.config) e OpenWebConfiguration (web.config) per accedere ai file.
Visual Basic]
-- Imports System.Web.Configuration --
Dim myConfig as Configuration
myConfig = WebConfigurationManager.OpenWebConfiguration(“~”)
[C#]
-- using System.Web.Configuration --
Configuration myConfig;
myConfig = WebConfigurationManager.OpenWebConfiguration(“~”);
Il percorso passato al metodo OpenWebConfiguration è relativo al percorso della cartella contenente il web.config. In questo caso la cartella principale del sito web (~).
Aprire e modificare file in remoto
E’ possibile, inoltre, aprire e modificare file Machine.config o Web.config in applicazioni Microsoft Internet Information Services (IIS) su server remoti.
Configuration config = WebConfigurationManager.OpenWebConfiguration("/", "Default Web Site", null, machineName);
L’accesso a server remoti, implica che il client abbia le necessarie autorizzazioni per stabilire la comunicazione. Ciò è possibile tramite un “remote configuration component” installato sul server.Il client a questo punto potrà accedere al file di configurazione server utilizzando l’ ASP.NET configuration API attraverso il “remote configuration component”. Si utilizza, a questo scopo, l’ ASP.NET IIS Registration tool (Aspnet_regiis.exe) insieme al comando config+
Aspnet_regiis config+
L’esempio allegato è una applicazione console dimostrativa che aggiorna il web.config del Default Web Site di un server remoto utilizzando privilegi amministrativi.
Nota : Si può facilmente comprendere, alla luce di quanto precedentemente detto, come sia possibile accedere da codice ai file connections.config e appSettings.config utilizzati come “Configuration Sources”, per eseguire le nostre modifiche remote senza provocare l’application restart .
L’esecuzione da command prompt dell’eseguibile, seguito dai dati di input ci permetterà di dimostrare l’accesso al file e la sua modifica.
[Command Prompt]
>RemoteconfigTooL machineName
>RemoteconfiguTooL machineName domainName\userName password
L’esempio utilizza anche il metodo GetSection, utile nel caso in cui sia necessario accedere ad una specifica sezione del web.config programmaticamente. Si accede, infatti, alla sezione system.web/trace per abilitarla.
Il metodo Save ha il compito, infine, di apportare le modifiche al file.
System.Web.Configuration.TraceSection trace = (TraceSection) config.GetSection("system.web/trace");
trace.Enabled = true;
// Save changes to the file.
config.Save();
Conclusioni
L’ASP.NET Configuration API dalla nuova versione del framework 2.0 ci permette di aggiornare, criptare e gestire files di configurazione, quindi :
- Rende più veloce la scrittura di tools personalizzati per l’accesso e la modifica delle impostazioni relative alle nostre applicazioni web;
- Permette l’accesso a server remoti ed a Web Site IIS
In conclusione rende il lavoro di gestione delle applicazioni web realizzate e pubblicate nella Intranet aziendale o nella Web Farm più facile ed ottimizzato.