asp.net - net - w3wp exe server 2008




Distribuzione senza interruzioni in ASP.NET(IIS interrompe il processo di lavoro prima che il nuovo processo di lavoro sia pronto) (4)

Sono d'accordo con la risposta di Smirkin: l'aggiornamento di una seconda cartella e la modifica della home directory di IIS per puntare all'altra cartella. Un altro vantaggio è che si dispone di un facile percorso di rollback (basta riaccendere la home directory IIS).

Ho scritto un post con uno script su come farlo usando Powershell - spero che aiuti: http://davidduffett.net/post/4833657659/blue-green-deployment-to-iis-with-powershell

Dovresti essere in grado di utilizzare questo script direttamente dal tuo sistema di integrazione continua.

Sto cercando di distribuire un'applicazione Web .NET su IIS (7.5) senza problemi per gli utenti. Mi sono assicurato che Disable Overlapped Recycle fosse False, ma continuo a incontrare sempre lo stesso problema.

Ogni volta che carico nuovi file binari per il sito, IIS interrompe il processo di lavoro prima che ne abbia avviato uno nuovo. Quindi ogni volta che carico nuovi binari, gli utenti ricevono questo messaggio di errore:

Errore del server nell'applicazione '/' Impossibile caricare il file o l'assembly "MyApplicationWeb" o una delle sue dipendenze. Il processo non può accedere al file perché è utilizzato da un altro processo. (Eccezione da HRESULT: 0x80070020)

Non ho idea di come farlo senza problemi. Come è ora ho appena caricato il file binario; ma mentre il caricamento avviene (o copia locale) darà il comportamento sopra citato. Ho anche provato ad usare un giardino Web ma con lo stesso risultato.

Cosa non sto cercando:

  • Come risolverlo con i bilanciatori di carico esterni (è una soluzione funzionale ma è perfettamante una soluzione sbagliata per pochi server e non funzionerà affatto se c'è un solo server)
  • Come creare un hack-around con un aggiornamento in una pagina di errore personalizzata (in quanto ha alcuni problemi evidenti ma, soprattutto, non funzionerà affatto con i servizi web / ajax).

Penso che questo dovrebbe essere fattibile http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/24e3c22e-79a9-4f07-a407-dbd0e7f35432.mspx?mfr=true

Aggiornamento: nell'articolo sopra si dice:

Tuttavia, poiché il valore di timeout di spegnimento di un arresto o di un avvio è configurabile, il processo di lavoro può essere terminato mentre continua a servire le richieste se non termina la manutenzione delle richieste esistenti entro il limite di tempo.

Non ho idea di dove trovare questo valore né quale sia l'impostazione predefinita. Se è inferiore a qualche secondo, potrebbe spiegare i miei risultati.

ps. La sto postando su SO piuttosto che su SF / Webmasters ecc. Perché penso che questo tipo di conoscenza sarà probabilmente minima tra le persone che non sono attive nello sviluppo, spero che vada tutto bene.


La mia ipotesi è che si disponga di uno scanner antivirus o di un altro tipo di processo di indicizzazione che blocchi il file non appena lo copi.


Quando si distribuiscono applicazioni ASP.Net, creo una nuova cartella sul server e cambio la directory home del sito Web in IIS. Questo fornisce zero downtime deployment e una rapida posizione di rollback in caso di problemi imprevisti. In un prossimo aggiornamento scarto la vecchia versione e ripeto il processo in modo che ci sia sempre una singola posizione di rollback.

Aggiornamento - Limite di tempo di arresto

I dettagli sulla configurazione del limite di tempo di spegnimento per i lavoratori sono dettagliati all'indirizzo http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/processModel . L'impostazione predefinita è 1 minuto e 30 secondi. Cerca la sezione shutdownTimeLimit nella pagina collegata.

Aggiornamento: ulteriori informazioni

Domanda simile con una grande risposta

L'essenza di questo è che, a causa della sovrascrittura dei file esistenti, il meccanismo di copia prende un blocco esclusivo sui file e che non è possibile avere una distribuzione apparentemente senza l'uso di app_offline.htm o un meccanismo come suggerito sopra. Prendi una lettura della risposta collegata mentre entra in profondità.


Sebbene la risposta di Smirkin fornisca un modo semplice e senza interruzioni per un amministratore di distribuire un sito con tempi di inattività minimi o nulli , e dovrebbe risolvere il problema con assembly / riferimenti mancanti, se si verificano delle interruzioni nella base di codice (ad esempio rimuovendo le vecchie pagine, si passa a forme, ecc.), quindi l'utilizzo di questo metodo potrebbe ancora causare alcuni "problemi" per gli utenti che avviano un processo prima dello switch e lo completano dopo lo switch (cioè richiedono una pagina prima di passare, iniziano a riempirla e quindi inviare la pagina dopo aver passato alla nuova directory).

So che non vuoi che lo dica, ma senza un load balancer con Sticky-Sessions abilitato, non sarai in grado di permettere alle persone di continuare a utilizzare la vecchia versione del sito fino a quando non avranno finito mentre gestiscono nuove sessioni sulla nuova versione - cambiando la directory home dell'applicazione, IIS eseguirà una ricompilazione dell'app e riavvierà i processi. In questo modo è possibile impostare il vecchio server per continuare a servire le sue attuali connessioni, ma dire al bilanciamento del carico di non inviare nuove connessioni ad esso.

C'è tuttavia un altro passo che puoi compiere per contribuire a mitigare i problemi spesso visti intorno a questo:

Configura MachineKey come valore costante anziché AutoGenerate : ciò significa che quando l'AppPool ricicla utilizzerà la stessa chiave e sarà quindi in grado di decrittografare cookie di sessione, viewstate, ecc.





worker-process