Ad essere sincero, ho provato a trasformare un brutto scherzo in IIS e proprio quando pensavo che stavo per cavarmela, mi sono reso conto che la mia soluzione alternativa non funzionava. Ecco cosa ho provato a fare:
1) Ho un'applicazione ASP.NET che ha la classe Preloader che eredita IProcessHostPreloadClient e fa tutta l'inizializzazione pesante nell'implementazione del metodo Preload (l'applicazione è complessa e fa parte di un sistema enorme, quindi richiede circa 2 minuti per stabilire connessioni a tutto il necessario servizi e pre-istanza di alcune registrazioni di Unity).
2) Ho molto lavoro da fare sull'arresto dell'applicazione (annullamento dell'iscrizione, disconnessione, eliminazione, ...) e immagino che il posto migliore per farlo sia nel metodo * Application_End * che si trova in Global.asax .
3) Tutto funziona perfettamente quando ho attività dell'utente (la prima richiesta dopo l'avvio del pool di applicazioni che contiene l'applicazione Web di cui sopra farà sì che * Application_Start * venga chiamato e successivamente * Application_End * venga chiamato all'arresto o al riciclo del pool di applicazioni), ma i problemi si verifica quando non vi sono attività dell'utente e l'applicazione tenta di riavviarsi dopo essere stata attiva per 48 ore (requisito configurato). Poiché non vi erano richieste, l'applicazione non è stata ufficialmente avviata. Ergo, non può essere fermato con garbo poiché * Application_End * non verrà chiamato.
4) Ora arriva la parte disordinata ... Ho provato a fare una richiesta GET dal codice alla fine del metodo Preload , e ha funzionato. Ma questa soluzione mi è sembrata male, anche se ha funzionato. Quindi, ho provato molte cose e l'ultima cosa che ho provato è stata questa:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... e quello ha fatto il suo scopo. È stato chiamato * Application_Start * (ho controllato la risposta, conteneva una pagina di accesso che doveva essere visualizzata nella richiesta iniziale) e sull'applicazione di arresto del pool di applicazioni è terminata correttamente facendo il lavoro necessario in * Application_End *.
MA
Dopo che l'applicazione è stata avviata (precaricata e avviata) in questo modo, questo è quello che è successo quando volevo raggiungere l'applicazione tramite browser Web:
Errore HTTP 500.21 - Il gestore di errori del server interno "ExtensionlessUrlHandler-Integrated-4.0" ha un modulo errato "ManagedPipelineHandler" nell'elenco dei moduli
Non riesco a capirlo. Qualcuno può dirmi perché questo accade e come risolverlo?
Se non lo capisco, tornerò alla prima soluzione (invio della richiesta GET dal codice) ma questo problema mi guasterà dal momento che non ho nemmeno idea di cosa non vada.