为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕码人2483693 2019-11-14 15:23:56

我通过该ApplicationHost.CreateApplicationHost方法托管ASP.NET运行时。当我web.config在应用程序运行时进行修改时,我发现ThreadAbortException抛出了很多第一次机会。这是在我的应用程序崩溃之前的正确时间。我认为这是因为运行时已检测到配置更改,并希望重新启动。


对于我们来说,这实际上不是受支持的方案,因此,我希望可以关闭自动重装功能。


有谁知道如何做到这一点?


查看完整描述

3 回答

?
守着一只汪


这里有一个类似的问题,仅供其他参考。我发现其他信息可能会有所帮助。


配置更改导致应用程序域重新启动对

Web.config文件中的配置设置所做的更改间接导致应用程序域重新启动。此行为是设计使然。您可以选择使用configSource属性引用进行更改时不会导致重新启动的外部配置文件。有关更多信息,请参见Section元素继承的General Attributes中的 configSource 。


从此MSDN文章


* 免责声明:我写了另一个答案,通常不会做自我参考,但是自从这篇文章发表8年以来,它找到了足够相关的内容以链接到这里,这实际上是完全不同的:通过单击IIS前端可以很容易地找到解决方案。 -end,并且自ASP.NET 1.0开始存在解决方法。


查看完整回答
反对 回复 2019-11-14
?
MMTTMM

实际上,前两个答案是不正确的。这是可能的,而且很容易,以防止这种循环的发生,并且至少自IIS6这个功能已经可用。


方法1(系统范围)

将DWORD注册表设置更改为HKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode值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设置添加到注册表中(但是现在有更多细粒度的选项)。


查看完整回答
反对 回复 2019-11-14
?
DIEA

同样,我遇到了一个更大的问题- 对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);

    }

}


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 71 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信