我通过ApplicationHost.CreateApplicationHost方法托管ASP.NET运行时。当我在应用程序运行时修改web.config时,我看到很多ThreadAbortException抛出的第一次机会。这是在我的应用程序崩溃之前。我假设这是因为运行时检测到配置发生了变化,并希望重新启动。
对于我们来说,这并不是一个真正支持的场景,所以我更希望我可以关闭自动重新加载。
有人知道怎么做吗?
发布于 2015-07-17 15:04:45
实际上,前两个答案是不正确的。防止这种回收的发生是可能的,也是相当容易的,至少从IIS6开始就可以使用这个特性。
方法1(系统范围)
将HKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode的DWORD注册表设置更改为值1,这将禁用所有文件更改通知。
不要被位置所迷惑:在这种情况下,Wow6432Node对您的web应用程序的位数没有任何影响。
方法2 (.NET 4.5+)
如果您使用的是.NET 4.5,那么只需在您的web.config中使用以下内容
<httpRuntime fcnMode="Disabled"/> 方法3 (IIS6+)
最后,也是(至少)从IIS6开始,there's a setting called DisallowRotationOnConfigChange仅作为应用程序池的设置(至少我认为MSDN上的文本试图这么说,但我还没有测试过它)。将其设置为true,对应用程序池的配置所做的更改不会导致立即回收。
最后一个设置也可以在应用程序池的高级设置中进行设置:

方法4 (ASP.NET 1.0和1.1)
对于使用ASP.NET 1.0或1.1的(旧)网站,there is a confirmed bug可能会导致快速重复回收文件更改。当时的解决方法类似于MartinHN在主要问题下提出的建议,即在您的web.config中类似以下内容
<compilation
debug="false"
defaultLanguage="vb"
numRecompilesBeforeAppRestart="5000">这不会禁用回收,但只有在进行了5000次重新编译之后才会禁用。这个数字是否有用取决于应用程序的大小。微软并没有明确说明什么是重新编译。但是,默认值是15。
顺便说一句:无论.NET或Windows的版本是什么,我们都会发现,当应用程序从共享环境中运行并在负载平衡环境中使用时,站点会持续回收。解决这个问题的唯一方法是将FNCMode设置添加到注册表中(但现在有了更多细粒度的选项)。
发布于 2009-03-10 12:16:28
同样,我遇到了一个更大的问题--更改AppDomain基目录中的任何文件或子文件夹都会导致主机环境关闭。这对我们的应用程序来说是一个很大的问题,因为我们在同一个AppDomain中运行WPF,并且我们无法在不干扰用户的情况下重新启动它。
我真的想避免不得不为应用程序的基于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);
}
}发布于 2009-08-24 09:54:05
一个解决方案是将以下元素添加到web.config部分:
<httpRuntime
waitChangeNotification="315360000"
maxWaitChangeNotification="315360000"
/>https://stackoverflow.com/questions/613824
复制相似问题