如何在修改web.config时阻止ASP.NET应用程序重新启动?

时间:2009-03-05 06:58:27

标签: asp.net iis web-config recycle httpruntime

我通过ApplicationHost.CreateApplicationHost方法托管ASP.NET运行时。当我在应用程序运行时修改web.config时,我看到很多第一次机会ThreadAbortException被抛出。这是在我的应用程序崩溃之前。我假设这是因为运行时已检测到配置更改并想重新启动。

这对我们来说并不是一个真正支持的场景,所以我更愿意我可以关闭自动重新加载。

有谁知道怎么做?

5 个答案:

答案 0 :(得分:26)

据我所知,没有办法禁用此行为,对webconfig的更改会强制重新启动应用程序。

更新:实际上有可能,有许多方法,有详细记录,如explained in this answer *

原始回答:

有一个类似的问题here仅供其他参考。我发现了其他可能有用的信息。

  

配置更改导致重新启动   应用领域
  改变为   Web.config中的配置设置   文件间接导致应用程序   域重启。这种行为   通过设计发生。你可以选择   使用configSource属性   引用外部配置文件   当a时不会导致重启   改变了。欲获得更多信息,   请参阅General Attributes Inherited by Section Elements.

中的configSource

来自This MSDN Article

* 免责声明:我写了另一个答案,通常不会自我引用,但发现它足够相关链接到这里,因为这篇文章发布后8年真的很不一样:解决方案很容易通过单击IIS前端,自ASP.NET 1.0以来存在解决方法。

答案 1 :(得分:23)

实际上,前两个答案是不正确的。它 是可能的,并且非常容易,以防止这种回收发生,并且至少从IIS6开始就可以使用此功能。

方法1(系统范围)

DWORD的{​​{1}}注册表设置更改为值HKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode,这将禁用所有文件更改通知。

不要被位置混淆:在这种情况下,1对您的网络应用程序的位数没有影响。

方法2(.NET 4.5 +)

如果您使用的是.NET 4.5,然后使用it is now possible to disable this on a per-site level,只需在Wow6432Node中使用以下内容:

web.config

方法3(IIS6 +)

最后,并且(至少)自IIS6以来,there's a setting called DisallowRotationOnConfigChange仅作为应用程序池的设置(至少我认为MSDN上的文本试图说,但我还没有测试过它)。将其设置为<httpRuntime fcnMode="Disabled"/> ,更改应用程序池的配置将不会立即回收。

也可以从应用程序池的高级设置中设置最后一个设置:

Disable Recycling for Configuration Change

方法4(ASP.NET 1.0和1.1)

对于使用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