Web.config, App Settings e Connection Strings

Vi sarà capitato, almeno per il 90% dei casi è così, di dover avere impostazioni diverse nel web.config relative a stringhe di connessione oppure o settings generici che utilizzate nella vostra applicazione.

La strada messa disposizione da Microsoft per risolvere questo problema è la gestione della configurazione di pubblicazione dell’applicazione associando web.config diversi come in questa immagine

Web.Config

La procedura è semplice, basta modificare il file associato alla pubblicazione che facciamo inserendo gli attributi di trasformazione

xdt:Transform="SetAttributes" xdt:Locator="Match(name)"

se volete saperne di più…

Questa modalità è molto utile perché permette la trasformazione di tutti i nodi presenti nel web.config dando maggiore flessibilità in fase di pubblicazione ma… questo non è sempre un vantaggio, in quanto, almeno nel mio caso, i web.config delle applicazioni che pubblico non sempre sono gestiti e manutenuti nel tempo solo da me quindi può valere per la prima pubblicazione ma in seguito il file non viene più ripubblicato perché quello della macchina di destinazione è certamente quello da utilizzare.

Altro svantaggio di questo modello è, sempre per la mia esperienza, non pratico da gestire nel tempo, spesso, da clienti, una singola applicazione che scrivo viene pubblicata su diversi server con procedure automatiche di validazione, quasi mai la mia applicazione sulla macchina di sviluppo finisce diretta in produzione ma ci sono uno o più livelli di validazione e in queste fasi avere web.config diversi non è praticabile.

Per questo motivo mi sono scritto una semplice classe che permette di leggere la configurazione di appSettings e connectionStrings (sono gli unici casi nella quale serve realmente) da un singolo web.config in base nome della macchina.

Ovviamente questo modello può essere integrato alla trasformazione dei nodi descritta sopra.

Facciamo un esempio…

web.config:
<add key="working.directory" value="C:\temp\cartelladilavoro" />

codice C#:
var cartella = ConfigurationManager.AppSettings["working.directory"];

Su una diversa macchina potrebbe essere diverso quindi avrei necessità di modificarlo prima della pubblicazione. La mia soluzione è la seguente:

web.config:
<add key="working.directory" value="C:\temp\cartelladilavoro" />
<add key="[www.sito.it]working.directory" value="D:\temp\Web1\cartelladilavoro" />

codice C#:
var cartella = ConfigurationManagerEx.AppSettings["working.directory"];

Utilizzando la classe che ho creato chiamata ConfigurationManagerEx prelevo il valore corretto in base al nome dell’host che ospita la mia applicazione, in caso questo non esista nella mia lista, viene sempre preso il valore predefinito definito senza il nome macchina specificato. Questo modello mi permette di avere tutti i valori in un unico file, posso sempre distribuire tutto e chiunque può modificarlo e copiarlo rispettando la semplice regola del nome macchina.

Potete trovare la classe a questo indirizzo:

http://configurationmanagerex.codeplex.com/