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

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

有谁知道怎么做?

有帮助吗?

解决方案

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

更新:实际上有可能,有很多方法,有详细记录,如在此答复中解释 *

原始回答:

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

  

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

来自此MSDN文章

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

其他提示

实际上,前两个答案是不正确的。它 是可能的,并且非常容易,以防止这种回收发生,并且至少从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以来,有一个名为 DisallowRotationOnConfigChange 的设置仅作为应用程序池的设置(至少这是我认为MSDN上的文本试图说的,但我还没有测试过它)。将其设置为 true ,更改为应用程序池的配置将不会立即回收。

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

方法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 设置添加到注册表中(但现在有更多细粒度的选项)。

我在同一行中遇到了更大的问题 - 对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);
    }
}

解决方案是将以下元素添加到web.config部分:

<httpRuntime
    waitChangeNotification="315360000"
    maxWaitChangeNotification="315360000"
/>

如jfburdet所述,解决方案是使用waitChangeNotification和maxWaitChangeNotification。

话虽如此,如果ASP.NET以混合模式运行,您应该知道它们不能在IIS 7上运行: http://forums.iis.net/t/1149344.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top