Pour être honnête, j’ai essayé de tourner un sale tour sur IIS et juste au moment où je pensais que je pourrais m'en tirer, je me suis rendu compte que ma solution de contournement ne fonctionnait pas. Voici ce que j'ai essayé de faire:
1) J'ai une application ASP.NET qui a Preloader class qui hérite de IProcessHostPreloadClient et effectue toute l'initialisation lourde dans l'implémentation de la méthode Preload (l'application est complexe et fait partie d'un système énorme, il faut donc environ 2 minutes pour établir les connexions avec tous les services nécessaires et pré-instancier certaines inscriptions Unity).
2) J'ai beaucoup de travail à faire lors de l'arrêt de l'application (désinscription, déconnexion, élimination, ...), 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 correctement lorsque l'activité des utilisateurs est activée (la première demande suivant le démarrage du pool d'applications contenant l'application Web susmentionnée entraînera l'appel de * Application_Start * et ensuite, * Application_End * sera appelée à l'arrêt ou au recyclage du pool d'applications), mais des problèmes se posent. se produit lorsqu'il n'y a aucune activité de l'utilisateur et que l'application essaie de se redémarrer après 48 heures d'activité (condition configurée). Comme il n'y avait pas de demandes, l'application n'a officiellement pas été lancée. Donc, il ne peut pas être arrêté gracieusement puisque * Application_End * ne sera pas appelé.
4) Maintenant vient la partie confuse ... J'ai essayé de faire une requête GET à partir du code à la fin de la méthode Preload, et cela a fonctionné. Mais cette solution m'a semblé mauvaise, même si cela a fonctionné. 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é (la réponse a été vérifiée, elle contenait une page de connexion censée être affichée dans la demande initiale) et, lors de la fermeture de l'application Pool Application, s'est terminée correctement en effectuant le travail nécessaire dans * Application_End *.
MAIS
Une fois que l'application a été démarrée (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 - Erreur interne du serveur Le gestionnaire "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 découvre pas cela, je reviendrai à la première solution (envoi d'une requête GET à partir de code), mais ce problème me mettra en berne puisque je n'ai même pas la moindre idée de ce qui ne va pas.
Le problème
Vous utilisez SimpleWorkerRequest dans un scénario pour lequel il n'a pas été conçu. Vous l'utilisez (à l'intérieur de IIS} _. Si vous regardez le lien précédent MSDN (c'est moi qui souligne):
Fournit une implémentation simple de la classe abstraite HttpWorkerRequest pouvant être utilisé pour héberger des applications ASP.NET en dehors d'une application IIS (Internet Information Services)}. Vous pouvez utiliser SimpleWorkerRequest directement ou l’étendre.
De même, si vous consultez la documentation MSDN pour l'espace de noms System.Web.Hosting (SimpleWorkerRequest
se trouve dans cet espace de noms), vous verrez également quelque chose de similaire à ce qui précède (encore une fois, je souligne)
L'espace de noms System.Web.Hosting fournit la fonctionnalité pour l'hébergement d'applications ASP.NET à partir d'applications gérées en dehors de Microsoft Internet Information Services (IIS).
La solution
Je recommanderais de supprimer l'appel à SimpleWorkerRequest
. Au lieu de cela, vous pouvez utiliser une solution Microsoft pour vous assurer que votre site Web démarre automatiquement après son recyclage. Ce dont vous avez besoin, c’est du module d’initialisation d’application Microsoft pour IIS 7.5 . Ce n'est pas compliqué à configurer, mais vous devez comprendre les options exactes. C'est pourquoi je recommande également l'interface utilisateur Application Initialization pour IIS 7.5 . L'interface utilisateur est écrite par un blogueur MSDN.
Alors, que fait exactement la solution Microsoft? Il fait ce que vous essayez de faire - IIS envoie une demande "get" à votre site Web après le démarrage du pool d'applications.
Essayez de ré-enregistrer ASP.NET avec aspnet_regiis -i
. Cela a fonctionné pour moi.
Un chemin probable pour .NET 4 (à partir de l'invite de commande élevée):
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
Si vous rencontrez cette erreur avec Windows 8/Windows Server 2012 et .Net 4.5, suivez les instructions suivantes: http://www.britishdeveloper.co.uk/2013/01/handler-extensionlessurlhandler.html
Allez à "Activer ou désactiver des fonctionnalités Windows" Puis Internet Information Services Puis World Wide Web Services Ensuite, fonctionnalités de développement d'applications Et activez ASP.NET 4.5.
Cela a fonctionné pour moi (bien que l'assistant et la formulation soient légèrement différents dans Windows Server 2012, mais vous l'aurez compris). Cela étant dit, pourquoi cela est nécessaire après avoir tout installé via Web Platform Installer, y compris toutes les dépendances, me dépasse totalement ...
Malgré les nombreux conseils donnés sur cette page, des problèmes persistaient sous Windows Server 2012. L'installation de .NET Extensibility 4.5 l'a résolu pour moi:
Add Roles and Features > Server Roles > Web Server (IIS) > Web Server > Application Development > .NET Extensibility 4.5
Exécutez l'une de ces commandes:
Pour Windows 32 bits:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
Pour un système d'exploitation Windows 64 bits:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -I
Pour Windows 10/Windows Server 2016, utilisez la commande suivante:
dism /online /enable-feature /featurename:IIS-ASPNET45 /all
Les réponses suggérées avec aspnet_regiis
ne fonctionnent pas sous Windows 10 (Creators Update et versions ultérieures) ou Windows Server 2016:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
Microsoft (R) ASP.NET RegIIS version 4.0.30319.0
Utilitaire d'administration pour installer et désinstaller ASP.NET sur la machine locale.
Copyright (C) Microsoft Corporation. Tous les droits sont réservés.
Commencez à installer ASP.NET (4.0.30319.0).
Cette option n'est pas prise en charge sur cette version du système d'exploitation. Les administrateurs doivent plutôt installer/désinstaller ASP.NET 4.5 avec IIS8 à l'aide de la boîte de dialogue "Activer/désactiver des fonctionnalités Windows", de l'outil de gestion du gestionnaire de serveur ou de l'outil de ligne de commande dism.exe. Pour plus de détails, veuillez consulter http://go.Microsoft.com/fwlink/?LinkID=216771 .
Terminé l'installation d'ASP.NET (4.0.30319.0).
Fait intéressant, la boîte de dialogue "Activer/désactiver les fonctionnalités Windows" ne m'a pas permis de décocher .NET ni ASP.NET 4.6, et seule la commande DISM ci-dessus fonctionnait. Pas sûr que le featurename soit correct, mais cela a fonctionné pour moi.
Ceci https://stackoverflow.com/a/13266763/1277458 fonctionne parfaitement. Mais si vous avez un système d’exploitation 64 bits, utilisez Framework64 au lieu de Framework dans le chemin:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
Dans mon cas (Windows 10 + IIS 10), je devais ouvrir " Activer ou désactiver des fonctionnalités Windows " puis accéder à Internet Information Services> Services World Wide Web> Fonctionnalités de développement d'applications> et vérifier ASP.NET 4.6
Faire de ce message son propre parce que cela m'a eu aller pendant des heures.
J'ai vu peut-être une douzaine d'articles similaires ici et ailleurs sur ce problème et le correctif aspnet_regiis. Ils ne travaillaient pas pour moi et aspnet_regiis agissait de façon étrange, ne faisant qu'énumérer les options, etc.
Comme l'utilisateur ryan-anderson indiqué ci-dessus, vous ne pouvez pas entrer .exe
Pour ceux qui sont moins à l'aise avec des éléments extérieurs à IIS sur le serveur, voici ce que vous faites en étapes simples.
Recherchez aspnet_regiis dans un dossier similaire à ce chemin. c:\Windows\Microsoft.NET\Framework\v4.0.30319 \
Cliquez avec le bouton droit de la souris sur Invite de commande dans le menu Démarrer ou ailleurs et indiquez-lui de s'exécuter en tant qu'administrateur. Utiliser la fonctionnalité "Exécuter" de Windows ne fonctionnera tout simplement pas ou ne fonctionnera pas pour moi.
Retournez à l'exécutable aspnet_regiis. Cliquez dessus et faites-le glisser dans l'invite de commande ou copiez-collez l'adresse dans l'invite de commande.
Supprimez, le cas échéant, le fichier .exe à la fin. C'est la clé. Ajoutez le -i (espace moins l'oeil) à la fin. Entrer.
Si vous l'avez fait correctement, vous constaterez qu'il commence à installer asp.net, puis vous indique que l'opération a réussi.
Je sais que c'est un vieil homme, mais je pourrais ajouter de la valeur. Pour ceux d'entre nous qui exécutons Server Core en dehors d'un domaine (les membres du domaine peuvent simplement exécuter le Gestionnaire de serveur à distance pour ajouter/supprimer des fonctionnalités/des rôles), vous devez recourir aux lignes de commande.
Les utilisateurs de Powershell peuvent taper "Install-WindowsFeature Web-Asp-Net45"
Cela devrait être équivalent à utiliser le gestionnaire de serveur.
Le même message d'erreur, avec .net 4.7, m'a interpellé.
La solution consistait à suivre un article mentionné précédemment pour aller avec "Activer ou désactiver la fonctionnalité Windows", où les "Services avancés .NET Framework 4.7" -> "ASP.NET 4.7" étaient déjà cochés.
Plus bas dans la liste, il y a les "Services Internet" et la sous-note "Fonctionnalités de développement d'applications" -> "ASP.NET 4.7", qui doivent également être vérifiés.
Lorsque vous activez cette option, de nombreuses autres fonctionnalités sont activées ... J'ai simplement appuyé sur le bouton Ok, et le problème a été résolu . Refonte complète du dialogue des fonctionnalités de Windows
Assurez-vous que vous avez défini votre version application-site
de v2.0
à v4.0
dans IIS Manager :
Pools d'applications> Votre application> Paramètres avancés> Version .NET Framework
Après cela, installez votre ASP.NET
.
Pour un système d'exploitation 32 bits (Windows):
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
Pour un système d'exploitation 64 bits (Windows):
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
Redémarrez votre application-site
dans IIS Manager et profitez-en.
J'ai eu ce problème et j'ai constaté que la suppression du dossier suivant était utile, même avec l'édition non-Express.Express:
C:\Users\<user>\Documents\IISExpress
Je travaille sur Windows Server 2012. La fonctionnalité .NET Extensibility 4.5 est activée. WebDAVModule supprimé. Je recevais toujours une erreur 500.21 sur la route ASP.NET '/ docs'.
Changer 'skipManagedModules' en false a résolu le problème.
<applicationInitialization doAppInitAfterRestart="true" skipManagedModules="false">
<add initializationPage="/docs" />
</applicationInitialization>
Merci à https://groups.google.com/forum/#!topic/bonobo-git-server/GbdMXdDO4tI
Cette erreur a commencé à me arriver de nulle part la semaine dernière, affectant les sites Web existants sur ma machine. Je n'ai pas eu de chance en essayant l'une des suggestions ici. J'ai finalement supprimé WebDAV de IIS complètement (Fonctionnalités Windows -> Internet Information Services -> Services World Wide Web -> Fonctionnalités HTTP communes -> Publication WebDAV). J'ai fait une réinitialisation IIS après cela pour faire bonne mesure, et mon erreur a finalement été résolue.
Je peux seulement deviner qu’une mise à jour de Windows a été à l’origine du problème, mais je ne peux pas en être sûr.
J'ai résolu ce problème en ajoutant "Activer ou désactiver les fonctionnalités Windows" L'option ASP.NET 4.7
Je faisais face à ce problème dans une application Web hébergée sur un serveur d'hébergement partagé. Donc, évidemment, n'avait pas d'accès direct à IIS, donc ne pouvait pas appliquer beaucoup de solutions proposées ici.
Sur le panneau de commande du fournisseur d'hébergement, j'ai activé la journalisation des erreurs pour IIS et ASP.Net. Et puis j'ai appris que cette erreur était en fait dans un cshtml manquant.
Ce n'est peut-être pas une solution utile pour OP mais cela concerne le même message "d'erreur".
Nous hébergeons des pages PHP sur IIS8.5 avec .NET 4.5 installé correctement.
Nous utilisons la fonctionnalité de préchargement pour nous assurer que notre application est toujours réactive à tous les niveaux.
Après un moment, nous avons commencé à avoir cette erreur au hasard.
Dans le fichier web.config: je mets skipManagedModules à true, -> ne fais pas ça!
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<applicationInitialization skipManagedModules="false" doAppInitAfterRestart="true">
<add initializationPage="/" />
</applicationInitialization>
...
Bien que le site Web soit en php, le routage vers la pagination est géré par les modules !!!
J'ai aussi rencontré ce problème. Mon application MVC4 s'exécute sur Windows Server 2012 R2 avec IIS 8.5. Aucune de ces solutions publiées ne fonctionnait pour moi. L'installation des cadres manquants via IIS a été résolue, mais l'installation a toujours échoué.
Je devais utiliser le Web Platform Installer
et installer les packages suivants:
Pour moi, la suppression de WebDAV de mon serveur a obligé l'application à renvoyer un message d'erreur 503 Service Unavailable
lors de l'utilisation de PUT
ou DELETE
. J'ai également essayé de supprimer complètement .NET Framework 4.5 et de le réinstaller, ainsi que de ré-enregistrer comme suggéré, mais en vain.
J'ai pu résoudre ce problème en désactivant WebDAV pour le pool d'applications individual. Cela a arrêté l'erreur 'module incorrect' lors de l'utilisation de PUT
ou DELETE
.
WebDAV Authoring Tools
dans la listeDisable WebDAV
en haut à droite.Ta daaaa!
J'ai encore laissé les éléments à supprimer dans mon fichier web.config
.
<system.webServer>
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
<system.webServer>
Ce lien est l'endroit où j'ai trouvé les instructions, mais ce n'est pas très clair.
Vous pouvez le réparer en changeant le type "ExtensionlessUrlHandler-Integrated-4.0" dans iis en System.Web.DefaultHttpHandler.