我通过ApplicationHost.CreateApplicationHost
方法托管ASP.NET运行时。当我在应用程序运行时修改web.config
时,我看到很多第一次机会ThreadAbortException
被抛出。这是在我的应用程序崩溃之前。我假设这是因为运行时已检测到配置更改并想重新启动。
这对我们来说并不是一个真正支持的场景,所以我更愿意我可以关闭自动重新加载。
有谁知道怎么做?
答案 0 :(得分:26)
据我所知,没有办法禁用此行为,对webconfig的更改会强制重新启动应用程序。
更新:实际上有可能,有许多方法,有详细记录,如explained in this answer *
原始回答:
有一个类似的问题here仅供其他参考。我发现了其他可能有用的信息。
配置更改导致重新启动 应用领域
中的configSource
改变为 Web.config中的配置设置 文件间接导致应用程序 域重启。这种行为 通过设计发生。你可以选择 使用configSource属性 引用外部配置文件 当a时不会导致重启 改变了。欲获得更多信息, 请参阅General Attributes Inherited by Section Elements.
* 免责声明:我写了另一个答案,通常不会自我引用,但发现它足够相关链接到这里,因为这篇文章发布后8年真的很不一样:解决方案很容易通过单击IIS前端,自ASP.NET 1.0以来存在解决方法。
答案 1 :(得分:23)
实际上,前两个答案是不正确的。它 是可能的,并且非常容易,以防止这种回收发生,并且至少从IIS6开始就可以使用此功能。
将DWORD
的{{1}}注册表设置更改为值HKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode
,这将禁用所有文件更改通知。
不要被位置混淆:在这种情况下,1
对您的网络应用程序的位数没有影响。
如果您使用的是.NET 4.5,然后使用it is now possible to disable this on a per-site level,只需在Wow6432Node
中使用以下内容:
web.config
最后,并且(至少)自IIS6以来,there's a setting called DisallowRotationOnConfigChange
仅作为应用程序池的设置(至少我认为MSDN上的文本试图说,但我还没有测试过它)。将其设置为<httpRuntime fcnMode="Disabled"/>
,更改应用程序池的配置将不会立即回收。
也可以从应用程序池的高级设置中设置最后一个设置:
对于使用ASP.NET 1.0或1.1的(旧)网站,there is a confirmed bug可能导致文件更改的快速和重复循环。当时的解决方法类似于MartinHN在主要问题下建议的内容,即true
中的以下内容:
web.config
这不会禁用回收,但只有在 5000 重新编译后才会执行此操作。此数字是否有用取决于您的应用程序的大小。微软没有明确说明重新编译究竟是什么。但是,默认值为 15 。
除了:,无论.NET或Windows版本如何,我们都会发现,当应用程序从共享运行并在负载平衡环境中使用时,该站点会不断循环。解决这个问题的唯一方法是将<compilation
debug="false"
defaultLanguage="vb"
numRecompilesBeforeAppRestart="5000">
设置添加到注册表中(但现在有更多细粒度的选项)。
答案 2 :(得分:20)
我在同一行中遇到了更大的问题 - 对AppDomain基目录中任何文件或子文件夹的更改导致托管环境关闭。这对我们的应用程序来说是一个非常大的问题,因为我们在同一个AppDomain中运行WPF UI,我们无法在不对用户造成破坏的情况下重新启动它。
我真的想避免为应用程序的基于Web的部分运行单独的AppDomain,所以我用Reflector进行了一些挖掘。我发现罪魁祸首是内部班级FileChangesMonitor
。
所以我写了一个可怕的反思黑客来解决这个问题。我想我会在这里发布它作为其他有同样问题的人的潜在解决方案。您只需要调用HttpInternals.StopFileMonitoring()
来禁用文件/文件夹更改的关闭。
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);
}
}
答案 3 :(得分:9)
解决方案是将以下元素添加到web.config部分:
<httpRuntime
waitChangeNotification="315360000"
maxWaitChangeNotification="315360000"
/>
答案 4 :(得分:0)
如jfburdet所述,解决方案是使用waitChangeNotification和maxWaitChangeNotification。
话虽如此,如果ASP.NET以混合模式运行,您应该知道它们无法在IIS 7上运行:http://forums.iis.net/t/1149344.aspx