首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止在修改web.config时重启ASP.NET应用程序?

如何防止在修改web.config时重启ASP.NET应用程序?
EN

Stack Overflow用户
提问于 2009-03-05 06:58:27
回答 4查看 44.2K关注 0票数 37

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

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

有人知道怎么做吗?

EN

回答 4

Stack Overflow用户

发布于 2015-07-17 15:04:45

实际上,前两个答案是不正确的。防止这种回收的发生是可能的,也是相当容易的,至少从IIS6开始就可以使用这个特性。

方法1(系统范围)

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

不要被位置所迷惑:在这种情况下,Wow6432Node对您的web应用程序的位数没有任何影响。

方法2 (.NET 4.5+)

如果您使用的是.NET 4.5,那么只需在您的web.config中使用以下内容

代码语言:javascript
运行
复制
<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中类似以下内容

代码语言:javascript
运行
复制
<compilation 
   debug="false"
   defaultLanguage="vb"
   numRecompilesBeforeAppRestart="5000">

这不会禁用回收,但只有在进行了5000次重新编译之后才会禁用。这个数字是否有用取决于应用程序的大小。微软并没有明确说明什么是重新编译。但是,默认值是15。

顺便说一句:无论.NET或Windows的版本是什么,我们都会发现,当应用程序从共享环境中运行并在负载平衡环境中使用时,站点会持续回收。解决这个问题的唯一方法是将FNCMode设置添加到注册表中(但现在有了更多细粒度的选项)。

票数 33
EN

Stack Overflow用户

发布于 2009-03-10 12:16:28

同样,我遇到了一个更大的问题--更改AppDomain基目录中的任何文件或子文件夹都会导致主机环境关闭。这对我们的应用程序来说是一个很大的问题,因为我们在同一个AppDomain中运行WPF,并且我们无法在不干扰用户的情况下重新启动它。

我真的想避免不得不为应用程序的基于web的部分运行单独的AppDomain,所以我用Reflector做了一些挖掘。我发现罪魁祸首是内部类FileChangesMonitor

所以我写了一个可怕的,可怕的反射黑客来解决这个问题。我想我应该把它贴在这里,作为其他有同样问题的人的潜在解决方案。您只需要调用HttpInternals.StopFileMonitoring()来禁用对文件/文件夹更改的关闭。

代码语言:javascript
运行
复制
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);
    }
}
票数 20
EN

Stack Overflow用户

发布于 2009-08-24 09:54:05

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

代码语言:javascript
运行
复制
<httpRuntime
    waitChangeNotification="315360000"
    maxWaitChangeNotification="315360000"
/>
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/613824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档