Ho bisogno di cambiare la mia stringa di connessione nel file web.config in base a una variabile di ambiente (per diversi ambienti, come dev/staging/production, ecc.). Ho visto altre soluzioni che utilizzano compiti di compilazione per realizzare modifiche a configurazioni diverse, ma non sono stato in grado di trovare qualcosa che mi consenta di cambiare la mia stringa di connessione in base a una variabile di ambiente. Qualcuno sa di qualsiasi modo per farlo?Modifica del file web.config basato su una variabile di ambiente in ASP.NET
risposta
Facciamo Questo attributo configSource per gli elementi AppSettings e connectionStrings nel web.config.
Fondamentalmente, abbiamo lo stesso file web.config per tutti i nostri ambienti: dev, qa e production.
Poi utilizziamo separato "ambiente specifici" file .. per esempio ...
Nel web.config:
<?xml version="1.0"?>
<configuration>
<appSettings configSource="local.appsettings.config" />
<connectionStrings configSource="local.connectionstrings.config" />
</configuration>
Poi manteniamo i seguenti file:
local.appsettings.config.development
local.appsettings.config.qa
local.appsettings.config.production
local.connectionstrings.config.development
local.connectionstrings.config.qa
local.connectionstrings.config.production
Dal momento che pre-compiliamo tutte le nostre applicazioni asp.net prima della distribuzione, abbiamo un task msBuild personalizzato utilizzato dalla nostra soluzione CI che copia i file di configurazione corretti (in base all'ambiente di destinazione mento) al file .config corretta ...
Quindi, se stiamo schierando a dev, local.appsettings.config.development -> local.appsettings.config
Se stiamo schierando a qa, locali .appsettings.config.qa -> local.appsettings.config
Ciò ci consente di mantenere il nucleo web.config lo stesso in tutti i nostri ambienti.
Che ne dici di avere due stringhe di connessione e un'altra variabile, come "" nel tuo web.config, quindi in base al valore di isTesting
scegli quale stringa di connessione utilizzare?
è anche possibile utilizzare le sezioni di configurazione e in base al nome del server passare da una sezione all'altra. in questo modo puoi avere le chiavi con lo stesso nome.
È possibile impostare un web.config per ogni ambiente nel Configuration Manager utilizzando gli eventi di pre-costruzione. Ho provato questo con risultati eccellenti.
http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx
Quando si dispone di eseguire il debug e costruire si può avere/preproduzione/produzione locale ... ecc
Ehi, grazie, c'è un modo per fare questo in base a una variabile d'ambiente però? Mi piacerebbe farlo in questo modo ma il mio cliente ha chiesto di farlo basandosi su una variabile di ambiente che hanno impostato in ciascuno dei loro diversi ambienti. Se lo fa, mi manca quella parte (dove guarda una variabile di ambiente). Grazie – Ryan
Dovresti mantenere le stringhe di connessione per ogni ambiente in un unico file .config .. qualcosa come: connectionStrings> poi, nel codice (supponendo che si dispone di una sorta di una classe "configurazione degli oggetti", allora si può leggere nella stringa di destra in base alla variabile d'ambiente. il * MAJOR * difetto con quello piano è .. ora hai tutte le informazioni di configurazione di produzione nello stesso file del tuo dev e qa. –
datacop
Io uso questo metodo con i file configSource nella cartella App_Data. Puoi pubblicare il tuo sito senza la cartella App_Data, mescolandola in seguito con la configurazione del proprio ambiente server. –