2013-01-19 11 views
26

Possiedo un progetto di applicazione Web ASP.NET che si collega a un database remoto tramite Entity Framework. Durante il debug (ad esempio, l'esecuzione del progetto sul mio computer locale), l'indirizzo IP del database è diverso rispetto al momento del rilascio (ad esempio dopo aver caricato il progetto sul mio server web e averlo eseguito dal browser). Fino ad ora ho sempre modificato manualmente la stringa di connessione del database nel file Web.config per passare tra i due (in pratica ho dovuto stringere le stringhe, una chiamata "Debug" e una "Release" e ho appena scambiato i nomi ogni volta che ho distribuito).Web.config Build vs Release transform non funziona

Ora ho appena notato che dovrebbe essere possibile farlo avvenire automaticamente tramite lo Web.config Transformation Syntax dove si inserisce la stringa di connessione modificata nella versione Web.Release.config e dovrebbe quindi utilizzarlo quando la DLL viene creata in Configurazione di rilascio .

Tuttavia non sembra funzionare per me ...

Ecco la parte rilevante del mio file web.config regolare (che detiene la stringa di connessione di debug per l'uso locale):

<?xml version="1.0"?> 
<configuration> 

    <connectionStrings> 
    <!-- Debug connection string. Release connection string is in Web.Release.config file --> 
    <add name="DatabaseEntities" connectionString="A" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 

</configuration> 

Ecco il file Web.Release.config, che secondo gli esempi dovrebbe sostituire la stringa di connessione 'DatabaseEntities' "a" con "B" se la DLL è in modalità di rilascio:

<?xml version="1.0"?> 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 

    <!-- Replace the DatabaseEntities connection string with the Release version (local IP address) --> 
    <connectionStrings> 
    <add name="DatabaseEntities" 
     connectionString="B" 
     xdt:Transform="Replace" xdt:Locator="Match(name)"/> 
    </connectionStrings> 

</configuration> 

(Ovviamente "A" e "B" sono solo segnaposto per le mie stringhe di connessione reali)

Quando eseguo il debug dell'applicazione (ad es. basta premere F5) viene utilizzato il web.config predefinito e posso accedere al database. Quindi cambio la configurazione di build in Release tramite Configuration Manager. Tutti i progetti nella soluzione sono impostati su Rilascio configurazione. Quindi costruisco la soluzione (solo tramite Build o anche tramite una ricostruzione completa (ad esempio, Pulisci, Ricostruisci)). Carico le DLL appena create sul server web, così come i file Web.config e Web.Release.config, e quando provo ad accedere al database che non riesco, sta ancora tentando di accedere al database tramite l'indirizzo IP di debug e quindi non riesco a trovarlo ...

Sembra che il file Web.Release.config sia completamente ignorato, o almeno la stringa di connessione non viene sostituita.

Cosa sto sbagliando? La sintassi della trasformazione è errata? Non sto creando l'applicazione in modalità di rilascio correttamente?

Grazie per qualsiasi aiuto ...

+0

Questo a volte può essere un po 'complicato, se si ottiene un'impostazione errata non funzionerà. Se puoi aggiungere uno screenshot di Configuration Manager, potremmo essere in grado di vedere qualcosa che hai ignorato. –

+0

Questo post mi ha aiutato: [http://stackoverflow.com/questions/3305096/how-can-i-use-web-debug-config-in-the-built-in-visual-studio-debugger-server] [1] [1]: http://stackoverflow.com/questions/3305096/how-can-i-use-web-debug-config-in-the-built-in-visual-studio -debugger-server –

risposta

51

Then I Build the solution (just via Build or even via a complete rebuild (e.g. Clean, Rebuild)). I upload the newly built DLLs to the webserver, as well as the Web.config and Web.Release.config files

C'è il vostro errore: trasforma Web di configurazione non funziona per il vostro ambiente locale, se semplicemente costruire. Devi pubblicare.

Il processo di distribuzione sembra strano: si stanno solo copiando DLL, Web.config e web.Release.config. A quanto pare, tu copi il tuo codice sorgente e non un'applicazione compilata. Una WebApplication pubblicata non contiene web.release.config.

È necessario pubblicare il progetto (fare clic con il pulsante destro su WebApplication -> Pubblica) sul proprio file system locale e copiare i file da lì, oppure utilizzare un altro metodo di distribuzione di propria scelta.

2 anni fa Ho scritto un articolo sulle trasformazioni di web.config.Ti dà un tutorial step-by-step per VS 2010 (la finestra di pubblicare cambiato in VS 2012): http://www.tomot.de/en-us/article/5/asp.net/how-to-use-web.config-transforms-to-replace-appsettings-and-connectionstrings

+16

C'è un modo per fare la trasformazione su build/F5? Renderebbe la vita più facile. –

+0

Si potrebbe provare ad assegnare un collegamento a Build.PublishSelection, per salvare alcuni clic del mouse. – citronas

+1

L'ho appena pubblicato nella mia cartella C:/Publish e poi ho impostato il database con cui voglio testare le impostazioni di rilascio. È possibile impostare la richiesta nelle impostazioni di Windows/system32/drivers/etc/hosts "127.0.0.1 pubblicato" e configurare un'applicazione in IIS per la stessa (http: // published). Quindi pubblica e prova in qualsiasi momento. – jwize

3

Ho pensato che la trasformazione venga eseguita solo quando pubblichi il sito/l'app. Non è fatto quando si costruisce un'applicazione. Quest'ultimo cambierebbe costantemente il web.config sotto il controllo del codice sorgente (che sarebbe una vera seccatura)

1

Se sono solo le stringhe di connessioni che non vengono sovrascritte durante la trasformazione di web.config, allora questo è quello che ho fatto: Ho eliminato il Casella "Usa questa stringa di connessione in fase di esecuzione" nella sezione "Impostazioni" della procedura guidata "Pubblica Web". Questa impostazione stava sovrascrivendo la trasformazione di web.config della stringa di connessione.