Comment éviter les ASP.NET redémarrage de l'application lorsque le web.la config est modifié?
Je suis d'hébergement de la ASP.NET runtime par le ApplicationHost.CreateApplicationHost
méthode. Quand je modifie le web.config
alors que l'application est en cours d'exécution, je vois beaucoup de chance premier ThreadAbortException
s levée. C'est juste avant mon application vient s'écraser vers le bas. Je suppose que c'est parce que le runtime a détecté des modifications de la configuration et veut relancer.
Ce n'est pas vraiment un scénario pris en charge pour nous, donc je préfère si seulement je pouvais désactiver le rechargement automatique.
Personne ne sait comment faire cela?
- <compilation debug="true" numRecompilesBeforeAppRestart="15000">
Vous devez vous connecter pour publier un commentaire.
pour autant Que je suis conscient qu'il n'existe aucun moyen de désactiver ce comportement, modifications de la webconfig forcer le redémarrage de l'application.Mise à jour: il est en fait possible, il y a un certain nombre de méthodes, bien documenté, comme expliqué dans cette réponse*
Réponse originale à cette question:
Il y a une question similaire ici juste pour une autre référence. J'ai trouvé des infos qui peuvent être utiles.
De Cet Article MSDN
* Avertissement: j'ai écrit l'autre réponse, et, normalement, ne serait pas faire une auto-référence, mais il trouve suffisamment pertinent pour lien ici depuis 8 ans après ce post, il est vraiment tout à fait différent: une solution est très facile en cliquant sur le IIS, et des solutions de contournement existent depuis ASP.NET 1.0.
En fait, les deux premières réponses sont incorrectes. Il est possible, et assez facile, pour éviter ce recyclage de se produire, et cette fonctionnalité est disponible depuis au moins IIS6.
Méthode 1 (à l'échelle du système)
Changer le
DWORD
paramètre de registre pourHKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode
à la valeur1
, de désactiver tous notifications de modification de fichier.Ne soyez pas confus par le lieu:
Wow6432Node
a, dans ce cas, aucune influence sur le type d'installation de votre application web.Méthode 2 (.NET 4.5+)
Si vous êtes en utilisant .NET 4.5, puis il est maintenant possible de désactiver cette fonction par niveau du site, il suffit d'utiliser la ligne suivante dans votre
web.config
:La méthode 3 (IIS6+)
Enfin, et aussi (au moins) depuis IIS6, il y a un réglage de
DisallowRotationOnConfigChange
comme un paramètre pour que l'application de la piscine (c'est du moins ce que je pense que le texte sur MSDN essaye de dire, mais je ne l'ai pas testé). Mis àtrue
et des modifications à la configuration de l'application de la piscine ne sera pas de suite immédiate du recyclage.Ce dernier paramètre peut également être défini à partir des Paramètres Avancées de l'application de la piscine:
Méthode 4 (ASP.NET 1.0 et 1.1)
Pour les (anciens) sites web à l'aide de ASP.NET 1.0 ou 1.1, il s'agit d'un bug qui peut causer rapide et répétée recycle sur les modifications de fichiers. La solution de contournement à l'époque était similaire à ce que MartinHN suggérée dans le cadre de la question principale, à savoir, quelque chose comme ce qui suit dans votre
web.config
:Cela ne désactive pas le recyclage, mais il ne le fait qu'après 5000 recompilations ont eu lieu. Si ce nombre est utile dépend de la taille de votre application. Microsoft ne veut pas dire clairement ce qu'est un recompilation est vraiment. La valeur par défaut, cependant, est 15.
En aparté: indépendamment de la version de .NET ou Windows, nous constatons que lorsque l'application est exécutée à partir d'un partage et utilisé dans un environnement à charge équilibrée, que le site recycle en permanence. La seule façon de résoudre ce fut en ajoutant que
FNCMode
réglage de la base de registre (mais il y a maintenant plus fine des options).web.config
et empêcher le rechargement sur toutes les modifications de fichier? Remarque que ce n'était pas en cours d'exécution via IIS, il a été un ASP.NET domaine d'application hébergé à l'intérieur d'une application WPF. Méthode 1 n'est pas vraiment une option, car cela va affecter les autres applications.fcnMode
dans leweb.config
(méthode 2). Le même siteweb.config
peut être utilisé par plusieurs AppPools, même si c'est plus commun que le même pool d'applications est utilisé pour plusieurs sites, dans lequel cas, il est probablement préférable d'utiliser la méthode 2 avecfcnMode
(mieux par site de granularité). Notez que vous pouvez définirfcnMode
même pour les répertoires distincts dans un seul site par l'ajout d'unweb.config
en elle.disallowRotationOnConfigChange
peut être défini dans laApplicationHost.config
fichier, mais en fonction de votre niveau d'accès à votre serveur de production, il peut ou peut ne pas être directement accessibles. Cependant, ce lien montre un exemple de code sur la façon de modifier ces paramètres avec C#.DisallowRotationOnConfigChange
paramètre n'est pas valide pour les changements dans le web.config mais seulement dans les paramètres de pool d'applications. Voir ce thread pour plus d'info.J'ai couru dans un problème encore plus grand dans le même sens - les modifications de la tout fichier ou un sous-dossier dans le domaine d'application dans le répertoire de base de provoquer l'environnement d'hébergement à l'arrêt. C'est un assez gros problème pour notre application que l'on utilise une INTERFACE utilisateur WPF dans le même domaine d'application et nous ne pouvons pas le redémarrer sans être distruptive à l'utilisateur.
Je voulais vraiment éviter d'avoir à exécuter un AppDomain séparé pour le web en fonction de la partie de l'application, j'ai donc fait quelques recherches avec Réflecteur. J'ai trouvé que le coupable était la classe interne
FileChangesMonitor
.J'ai donc écrit un horrible horrible réflexion hack pour résoudre le problème. Je pensais que je poste ici comme une solution potentielle pour toute autre personne ayant le même problème. Vous avez juste besoin d'appeler
HttpInternals.StopFileMonitoring()
pour désactiver l'arrêt sur le fichier/dossier des changements.Une solution serait l'ajout d'élément suivant dans le site web.section config :
Comme mentionné par jfburdet la solution est d'utiliser waitChangeNotification et maxWaitChangeNotification.
Cela étant dit, vous devez savoir qu'ils ne fonctionnent pas sur IIS 7 si ASP.NET est exécuté en mode mixte: http://forums.iis.net/t/1149344.aspx