Pour être honnête, j'ai essayé de tourner un sale tour sur IIS et juste au moment où je pensais que j'allais m'en tirer, j'ai réalisé que ma solution de contournement ne fonctionnait pas. Voici ce que j'ai essayé de faire:
1) Je application ASP.NET qui a Preloader classe héritant IProcessHostPreloadClient et fait tout l'initialisation du lourd dans préchargement implémentation de la méthode (application est complexe et il est une partie d'un système énorme, donc il faut environ 2 minutes pour établir des connexions à tous nécessaires et pré-instancier certaines inscriptions Unity).
2) J'ai beaucoup de travail à faire sur l'arrêt de l'application (désinscription, déconnexion, suppression, ...), et je suppose que le meilleur endroit pour le faire est dans la méthode * Application_End * située dans Global.asax .
3) Tout fonctionne très bien lorsque j'ai une activité utilisateur (la première demande après le démarrage du pool d'applications qui contient l'application Web susmentionnée provoquera l'appel de * Application_Start * et ensuite * Application_End * à l'arrêt ou au recyclage du pool d'applications), mais des problèmes se produit lorsqu'il n'y a aucune activité utilisateur et que l'application essaie de se redémarrer après avoir été active pendant 48 heures (configuration requise). Puisqu'il n'y a eu aucune demande, la demande n'a officiellement pas été lancée. Ergo, il ne peut pas être gracieusement arrêté car * Application_End * ne sera pas appelé.
4) Vient maintenant la partie désordonnée ... J'ai essayé de faire une demande GET à partir du code à la fin de la méthode de préchargement , et cela a fonctionné. Mais cette solution me semblait mauvaise, même si elle fonctionnait. Donc, j'ai essayé beaucoup de choses, et la dernière chose que j'ai essayée était la suivante:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
... et cela a fait son but. * Application_Start * a été appelé, (j'ai vérifié la réponse, il contenait une page de connexion qui était censée être affichée dans la demande initiale) et sur l'application Application shutdown shutdown s'est terminée gracieusement en effectuant le travail nécessaire dans * Application_End *.
MAIS
Après le démarrage de l'application (préchargée et lancée) de cette manière, voici ce qui s'est passé lorsque j'ai voulu accéder à l'application via un navigateur Web:
Erreur HTTP 500.21 - Le gestionnaire d'erreurs du serveur interne "ExtensionlessUrlHandler-Integrated-4.0" a un mauvais module "ManagedPipelineHandler" dans sa liste de modules
Je suis incapable de comprendre cela. Quelqu'un peut-il me dire pourquoi cela se produit et comment y remédier?
Si je ne comprends pas cela, je vais revenir à la première solution (envoyer une demande GET à partir du code), mais ce problème me dérangera car je n'ai même aucune idée de ce qui ne va pas.