如何防止修改web.config时重新启动ASP.NET应用程序?
我通过ApplicationHost.CreateApplicationHost
方法托pipeASP.NET运行时。 当我在应用程序运行时修改web.config
时,我看到很多第一次抛出ThreadAbortException
的机会。 这是在我的应用程序崩溃之前。 我假设这是因为运行时检测到configuration的变化,并希望重新启动。
对于我们来说,这不是一个真正的支持场景,所以我更喜欢如果我可以closures自动重新加载。
有谁知道如何做到这一点?
据我所知,有没有办法来禁用此行为,更改到webconfig强制应用程序重新启动。
更新:这实际上是可能的,有很多方法,有据可查, 在这个答案中解释 *
原始答案:
这里也有类似的问题,仅供参考。 我发现可能有用的其他信息。
configuration更改导致重新启动应用程序域
Web.config文件中configuration设置的更改间接导致应用程序域重新启动。 这种行为通过devise发生。 您可以select使用configSource属性来引用在进行更改时不会导致重新启动的外部configuration文件。 有关更多信息,请参阅章节元素inheritance的常规属性中的 configSource 。
从这个MSDN文章
* 免责声明:我写了另一个答案,通常不会自我引用,但发现它有足够的相关性足以链接到这个post后的8年,这是非常不同的:一个解决scheme是非常容易的点击通过IIS前自从ASP.NET 1.0以来,就已经有了解决方法。
我沿着相同的路线运行一个更大的问题 – 对AppDomain基本目录中的任何文件或子文件夹的更改导致主机环境closures。 对于我们的应用程序来说,这是一个相当大的问题,因为我们在同一个AppDomain中运行WPF UI,并且我们不能在不破坏用户的情况下重启它。
我真的想避免为应用程序的基于Web的部分运行单独的AppDomain,所以我做了一些reflection器的挖掘。 我发现罪魁祸首是内部类FileChangesMonitor
。
所以我写了一个可怕的反省黑客来解决这个问题。 我想我会在这里发布它作为一个潜在的解决scheme,为任何其他人有同样的问题。 你只需要调用HttpInternals.StopFileMonitoring()
来禁用文件/文件夹更改的closures。
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); } }
事实上,前两个答案是不正确的。 这是可能的,也是相当容易的,可以防止这种再循环的发生,至lessIIS6以后这个function就可以使用了。
方法1(系统范围)
将HKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode
的DWORD
registry设置更改为值1
,这将禁用所有文件更改通知。
不要被位置混淆:在这种情况下, Wow6432Node
对Web应用程序的位数没有影响。
方法2(.NET 4.5 +)
如果您使用的是.NET 4.5,那么现在可以在每个站点级别禁用它 ,只需在web.config
使用以下内容即可:
<httpRuntime fcnMode="Disabled"/>
方法3(IIS6 +)
最后,也是(至less)从IIS6开始, 有一个名为DisallowRotationOnConfigChange
的设置,仅作为应用程序池的设置(至less这是我认为MSDN上的文本试图说的,但我没有testing过)。 将其设置为true
,对应用程序池configuration的更改不会导致立即回收。
最后的设置也可以从应用程序池的高级设置中设置:
方法4(ASP.NET 1.0和1.1)
对于使用ASP.NET 1.0或1.1的(旧)网站, 存在一个确认的错误 ,可能会导致文件更改快速重复循环。 当时的解决方法与Martinhn在主要问题中提出的类似,即类似于web.config
的以下内容:
<compilation debug="false" defaultLanguage="vb" numRecompilesBeforeAppRestart="5000">
这并不禁用循环,但只有在5000次重新编译之后才能这样做。 这个数字是否有用取决于你的应用程序的大小。 微软并没有清楚地说出重新编译是什么。 默认值是15 。
顺便说一句:无论.NET或Windows的版本如何,我们都会发现当应用程序从共享运行并用于负载平衡的环境中时,网站会不断循环。 解决这个问题的唯一方法是将FNCMode
设置添加到registry中(但是现在有更多细粒度的选项)。
一个解决scheme将添加以下元素到web.config部分:
<httpRuntime waitChangeNotification="315360000" maxWaitChangeNotification="315360000" />
正如jfburdet提到的解决scheme是使用waitChangeNotification和maxWaitChangeNotification。
这就是说,如果ASP.NET以混合模式运行,您应该知道它们不能在IIS 7上工作: http : //forums.iis.net/t/1149344.aspx