Comment prévenir ASP.NET application redémarrant lorsque le web.la configuration est modifiée?

ASP.NET exécution via la méthode ApplicationHost.CreateApplicationHost . Quand je modifie le web.config pendant que l'application est en cours d'exécution, je vois beaucoup de première chance ThreadAbortException jeté. C'est juste avant que ma demande ne s'effondre. Je suppose que c'est parce que l'exécution a détecté des changements dans la configuration et veut redémarrer.

ce n'est pas vraiment un scénario supporté pour nous, donc je préférerais si je pouvais juste éteindre le rechargement automatique.

est-ce que quelqu'un sait comment faire ça?

30
demandé sur Abel 2009-03-05 09:58:27

5 réponses

pour autant que je sache, il n'y a aucun moyen de désactiver ce comportement, les modifications apportées au webconfig obligent l'application à redémarrer.

mise à Jour: il est en fait possible, il y a un certain nombre de méthodes, bien documenté, comme , a expliqué dans cette réponse *

réponse originale:

il y a une question similaire ici juste pour autre référence. J'ai trouvé des infos qui peuvent être utiles.

les changements de Configuration provoquent un redémarrage du domaine d'Application

Les changements de paramètres de configuration dans Web.config les dossiers causent indirectement la demande domaine de redémarrer. Ce comportement se produit par la conception. Vous pouvez éventuellement utilisez l'attribut configSource pour fichiers de configuration externes de référence qui ne causent pas un redémarrez quand un le changement est fait. Pour plus d'informations, voir configSource dans attributs généraux Hérité par les éléments de la Section.

à Partir de Cet Article MSDN

* avertissement: j'ai écrit l'autre réponse et normalement ne ferait pas une auto-référence, mais le trouver assez pertinent pour le lien ici depuis 8 ans après ce post, il est vraiment très différent: une solution est très facile en cliquant sur le front-end de L'IIS, et des solutions de rechange existent depuis ASP.NET 1,0.

26
répondu Quintin Robinson 2017-05-23 10:30:08

j'ai rencontré un problème encore plus important dans le même ordre d'idées: les changements de à" n'importe quel fichier ou sous - dossier dans le répertoire de base du domaine Appdom provoquent l'arrêt de l'environnement d'hébergement. C'est un gros problème pour notre application car nous exécutons une interface utilisateur WPF dans la même Appdomaine et nous ne pouvons pas la redémarrer sans être distraits par l'utilisateur.

j'ai vraiment voulu éviter d'avoir à exécuter un AppDomain séparé pour la partie web de l'application donc je fait un peu de creuser avec Réflecteur. J'ai trouvé que le coupable était la classe interne FileChangesMonitor .

alors j'ai écrit un horrible hack de réflexion pour résoudre le problème. Je pensais le poster ici comme une solution potentielle pour n'importe qui d'autre ayant le même problème. Vous avez juste besoin d'appeler HttpInternals.StopFileMonitoring() pour désactiver l'arrêt sur les changements de fichiers/dossiers.

internal static class HttpInternals
{
    private static readonly FieldInfo s_TheRuntime = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static);

    private static readonly FieldInfo s_FileChangesMonitor = typeof(HttpRuntime).GetField("_fcm", BindingFlags.NonPublic | BindingFlags.Instance);
    private static readonly MethodInfo s_FileChangesMonitorStop = s_FileChangesMonitor.FieldType.GetMethod("Stop", BindingFlags.NonPublic | BindingFlags.Instance);

    private static object HttpRuntime
    {
        get
        {
            return s_TheRuntime.GetValue(null);
        }
    }

    private static object FileChangesMonitor
    {
        get
        {
            return s_FileChangesMonitor.GetValue(HttpRuntime);
        }
    }

    public static void StopFileMonitoring()
    {
        s_FileChangesMonitorStop.Invoke(FileChangesMonitor, null);
    }
}
20
répondu Jacob Stanley 2009-03-10 12:16:28

en Fait, les deux premières réponses sont incorrectes. est possible, et assez facile, pour éviter ce recyclage de se produire, et cette fonctionnalité est disponible depuis au moins IIS6.

la Méthode 1 (système)

Changement DWORD paramètre de registre pour HKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode à la valeur 1 , qui va désactiver tous notifications de modification de fichier.

Ne soyez pas confus par l'emplacement: Wow6432Node n'a, dans ce cas, aucune influence sur le bitness de votre application web.

Méthode 2 (.NET 4.5+)

si vous utilisez .NET 4.5, puis il est maintenant possible de désactiver ce au niveau par site , il suffit d'utiliser ce qui suit dans votre web.config :

<httpRuntime fcnMode="Disabled"/> 

Method 3 (IIS6+)

enfin, et aussi (au moins) depuis IIS6, il y a un paramètre appelé DisallowRotationOnConfigChange comme paramètre pour seulement le pool d'applications (du moins c'est ce que je pense que le texte sur MSDN essaie de dire, mais je ne l'ai pas testé). Mettez-le sur true et les changements dans la configuration du pool d'applications n'entraîneront pas un recyclage immédiat.

ce dernier paramètre peut également être paramétré à partir des paramètres avancés de l'application pool:

Disable Recycling for Configuration Change

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 y a un bogue confirmé que 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é sous la question principale, à savoir quelque chose comme le suivant dans votre web.config :

<compilation 
   debug="false"
   defaultLanguage="vb"
   numRecompilesBeforeAppRestart="5000">

ceci ne désactive pas 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 dit pas clairement ce qu'est vraiment une recompilation . La valeur par défaut, cependant, est 15 .

comme une mise à part: indépendamment de la version de .NET ou Windows, nous trouvons que lorsque l'application est exécutée à partir d'une part et utilisé dans un environnement à charge équilibrée, que le site recycle en permanence. La seule façon de le résoudre était d'ajouter ce paramètre FNCMode au registre (mais maintenant il y a plus d'options à grain fin).

19
répondu Abel 2017-05-23 12:26:38

une solution serait d'ajouter l'élément suivant à web.section de configuration:

<httpRuntime
    waitChangeNotification="315360000"
    maxWaitChangeNotification="315360000"
/>
9
répondu jfburdet 2009-08-24 09:54:04

comme mentionné par jfburdet la solution est d'utiliser waitChangeNotification et maxWaitChangeNotification.

cela 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

0
répondu Hanan Schwartzberg 2009-12-10 09:20:25