2012-09-25 12 views
16

Possiedo un'applicazione ASP.Net che esegue l'inizializzazione del database durante Application_Start in Global.asax. Sto usando IIS Express per eseguire il debug dell'applicazione.Visual Studio può riavviare IIS Express nella nuova sessione di debug?

Trovo che se smetto di eseguire il debug, svuota il database e ricomincio, il codice Application_Start non viene chiamato e il mio database non viene inizializzato correttamente, quindi l'applicazione non riesce. Questo perché l'istanza di IIS Express è ancora in esecuzione dopo l'arresto del debug. Anziché riavviarlo, Visual Studio sembra essere collegato al processo esistente.

C'è un modo per modificare questo comportamento in modo che l'avvio di una nuova sessione di debug riavvii sempre il processo dell'applicazione in IIS Express (o reimposta il pool di applicazioni in IIS normale)?

In alternativa, esiste un modo per forzare l'arresto di IIS Express al termine della sessione di debug?

Ho trovato che se si seleziona "Abilita modifica e continua" dalla finestra di dialogo Web nelle impostazioni del progetto, che ha l'effetto collaterale di arrestare IIS Express quando termina il debug. Ma non sono sicuro di voler introdurre gli effetti collaterali di Modifica e Continua al solo scopo di fermare IIS Express. Sicuramente c'è un modo migliore?

Non sicuro se è importante, ma questo è VS2012.

risposta

19

Sfortunatamente non è raggiungibile tramite la configurazione. Potrei proporti un altro trucco, ma spetta a te decidere se è meglio del tuo o no :)

È possibile creare un evento post-build che modifichi il timestamp di un file web.config. Ho usato uno strumento touch.exe da http://www.stevemiller.net/apps/. È inoltre necessario impostare "Esegui l'evento post-generazione" su Sempre. Quindi la configurazione "Build Eventi" può apparire come segue:

enter image description here

Con questa opzione impostata ogni volta che si avvia il debugger, web.config timestamp è sempre aggiornato causando il riavvio dell'applicazione (applicazione AppDomain reload) alla prima richiesta - ma a questo punto sei già collegato a questo processo, quindi i punti di interruzione dell'evento Application_ dovrebbero funzionare.

+0

Questo funziona a meraviglia. Grazie! –

+0

+1, trucco salvavita! – smirkingman

6

È possibile utilizzare un PowerShell one-liner per evitare di fare affidamento su un app esterna:

powershell -NoProfile -Command (Get-Item "<path>\Web.config").lastwritetime=(Get-Date)

ispirazione originale viene da here ...

+0

Puoi semplicemente usare la [macro] (https://msdn.microsoft.com/en-us/library/42x5kfw4.aspx?f=255&MSPPError=-2147217396) '$ (ProjectDir)' quindi non devi nemmeno imposta manualmente un valore per '' – gregmac

+0

Certo, se questo soddisfa le tue esigenze. Ma nel mio caso, avevo bisogno di riavviare un'applicazione esterna, quindi è più simile a "% ENV_VARIABLE% \ Web.config' – dstj

Problemi correlati