Domanda

Quando IIS riavvia un (2.0) di applicazioni web ASP.Net, è possibile:

  • riciclare all'AppDomain : Scaricare all'AppDomain e caricare un nuovo dominio di applicazione sul stesso processo (ad esempio quando HttpRuntime.UnloadAppDomain() viene chiamato, quando web.config viene modificato)
  • riciclare il processo : scarico all'AppDomain e caricare un nuovo su una nuovo processo (per esempio quando viene richiamato il comando riciclare su un AppPool via inetmgr, o quando limite di memoria è raggiunto).

A causa di alcuni motivi interni (problemi con codice nativo precedente dipendiamo), non possiamo permettere la prima opzione. Non possiamo caricare l'applicazione due volte sullo stesso processo.

Can IIS essere in qualche modo detto di non consentire il riutilizzo del processo di lavoro?

ho provato io stesso impedendo rintracciando se un'applicazione è già iniziato un processo, una volta utilizzando un mutex, e in tal caso - un'eccezione durante Application_Start()); Ho anche provato chiude il processo chiamando Environment.Exit() durante Application_End(). Il problema con entrambi i metodi è che causa tutte le richieste che arrivano durante Application_End o Application_Start a fallire (a differenza di un riciclo processo manuale, che non riesce assolutamente nessuna richiesta perché sono reindirizzati al nuovo processo subito).

È stato utile?

Soluzione 2

Non è stato possibile trovare un modo per dire a IIS che processi di lavoro non devono essere riutilizzati. Non può permettersi che fissa il problema di fondo che proibisce elaborano il riutilizzo. Pertanto, ha finito per chiamare Environment.Exit(0) in Application_End, anche se può causare un piccolo numero di richieste di fallire con un reset della connessione.

Altri suggerimenti

Credo che "Riciclare il dominio di applicazione" rientra anteprima di runtime ASP.NET e IIS non è davvero coinvolto da nessuna parte (non sono sicuro al 100% su questo, in caso di conduttura integrata di IIS7). Quindi non credo che ciò che si vuole è fattibile. Ma ci sono un paio di soluzione che si può prendere in considerazione per il vostro problema:

  1. Assicurarsi di eseguire codice di avvio (la manipolazione di codice legacy) per eseguire una sola volta - questo dovrebbe essere possibile tramite sistema denominato semafori . Una volta semaforo di sistema è stato creato da app di start-up nel processo di lavoro, lo farà esiste fino processo è riciclato in modo da avere per l'inizializzazione del processo.

  2. Se 1 # non è possibile quindi prendere in considerazione che ospita il codice manipolare codice legacy in un processo separato tutti insieme - questo processo può esporre la funzionalità in questione tramite servizi WCF su named pipe. ASP.NET consumerà loro di utilizzare codice legacy.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top