Para ser sincero, tentei desviar o truque do IIS e, quando pensei que iria me safar, percebi que minha solução alternativa não funciona. Aqui está o que eu tentei fazer:
1) Eu tenho o aplicativo ASP.NET que possui a classe Preloader que herda IProcessHostPreloadClient e faz toda a inicialização pesada no Preload implementação do método (o aplicativo é complexo e faz parte de um sistema enorme, portanto, são necessários aproximadamente 2 minutos para estabelecer conexões com todos os itens necessários. serviços e pré-instanciar alguns registros do Unity).
2) Tenho muito trabalho a ser feito no encerramento de aplicativos (cancelamento de inscrição, desconexão, descarte, ...) e acho que o melhor lugar para fazer isso é no método * Application_End * localizado no Global.asax .
3) Tudo funciona bem quando tenho atividade do usuário (a primeira solicitação depois que o Pool de Aplicativos que contém o aplicativo Web mencionado acima for iniciado fará com que * Application_Start * seja chamado e depois * Application_End * seja chamado na parada ou reciclagem do Application Pool), mas há problemas ocorre quando não há atividade do usuário e o aplicativo tenta reiniciar a si próprio após ficar ativo por 48 horas (requisito configurado). Como não houve solicitações, o aplicativo oficialmente não foi iniciado. Portanto, ele não pode ser interrompido normalmente, pois * Application_End * não será chamado.
4) Agora vem a parte bagunçada ... Tentei fazer uma solicitação GET a partir do código no final do método Preload , e funcionou. Mas essa solução me pareceu ruim, mesmo que funcionasse. Então, eu tentei muitas coisas, e a última coisa que tentei foi esta:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... e isso fez seu objetivo. * Application_Start * foi chamado (verifiquei a resposta, estava contendo a página de login que deveria ser exibida na solicitação inicial) e, no aplicativo Application Shutdown, o aplicativo encerrou normalmente executando o trabalho necessário em * Application_End *.
MAS
Depois que o aplicativo foi iniciado (pré-carregado e iniciado) dessa maneira, foi o que aconteceu quando eu queria acessar o aplicativo via navegador da Web:
Erro HTTP 500.21 - O manipulador de erros do servidor interno "ExtensionlessUrlHandler-Integrated-4.0" possui um módulo inválido "ManagedPipelineHandler" em sua lista de módulos
Eu sou incapaz de descobrir isso. Alguém pode me dizer por que isso acontece e como corrigi-lo?
Se eu não descobrir isso, voltarei à primeira solução (enviando solicitação GET a partir do código), mas esse problema irá me incomodar, pois nem tenho uma idéia do que está errado.