Domanda

Ho un'applicazione ASP.NET 2.0 (installata su IIS 6.0 da un MSI) che è stata compilata come " sito web " e precompilata / impacchettata usando un progetto di distribuzione web, in Visual Studio 2005. (Ho richiesto agli sviluppatori di prendere in considerazione la possibilità di passare a un'applicazione Web per la prossima versione, ma non cambierà per questa versione).

Ogni volta che l'applicazione viene riciclata (ad es. viene apportata una modifica a web.config), al primo colpo, ASP.NET JIT esegue l'applicazione. Come parte di questo, prende tutti gli assembly necessari per la pagina di accesso e li compila in codice nativo nella directory 'assembly \ dl3' dei file temporanei ASP.NET, che richiede tra 20 e 60 secondi. Questo accade solo su un riciclo, che accade raramente & # 8212; ma quando lo fa, il caricamento della pagina richiede molto più tempo e credo che sia possibile ottimizzarlo.

Sembra che ci siano 122 DLL che deve prendere in considerazione, alcune delle quali sono code-behind precompilate, altre sono componenti di terze parti per il sito Web (ad esempio NHibernate.dll, componenti di report, ecc.)

Perché ricompila / re-JIT tutto ? Perché non rileva che la maggior parte degli assembly non è cambiata e non tenta di cambiarli? Posso provare che non è la compilazione batch a causare il problema? (Ho <compilation debug="false" & Gt; impostato in web.config.)

Altre domande suggeriscono che NGEN potrebbe essere utile ma ho letto che non è possibile per usarlo su ASP.NET 1.x; stiamo usando 2.0 e non riesco a trovare una risposta chiara in entrambi i casi.

È stato utile?

Soluzione

Dalla mia esperienza personale il riciclo lento è spesso causato da NHibernate / ActiveRecord se si hanno molte entità. Vedi http://nhibernate.info/blog /2009/03/13/an-improvement-on-sessionfactory-initialization.html per spiegazione + possibile soluzione.

Altri suggerimenti

Stai utilizzando IIS? Sono abbastanza certo che se riavvii il tuo sito in IIS, esso prenderà tutte le modifiche alle configurazioni senza copiare le dll.

Potresti essere in grado di migliorare i tempi di riciclo installando DLL comuni che cambiano di rado, come NHibernate o strumenti di reporting, nel GAC. Ciò dovrebbe impedire che vengano respinti nuovamente.

Procedura: installare un assembly nella Global Assembly Cache

È strano che solo copiare la dll richieda 20 secondi. Suggerirei di fare un altro controllo e assicurarmi dove si trova il collo di bottiglia.

Come puoi essere sicuro che tutto sia nello stato corretto senza riciclare / ripristinare (o qualunque cosa accada) AppDomain? Immaginare di avere qualcosa nell'avvio dell'applicazione (global.asax) che imposta il valore di un campo statico basato su un valore di configurazione. Se non ripristini l'intero AppDomain, non puoi esserne sicuro.

Un altro motivo: non è possibile scaricare una dll .NET una volta caricata, quindi è necessario ricreare il dominio dell'app quando viene aggiornato qualcosa.

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