创建、重命名或删除文件夹后,ASP.NET将重新启动

创建、重命名或删除文件夹后,ASP.NET将重新启动,asp.net,content-management-system,appdomain,application-pool,Asp.net,Content Management System,Appdomain,Application Pool,更新--复制问题的过程: 1) 在c:\projects\restart demo创建网站项目 2) 添加默认web.config和虚拟aspx页面test.aspx 3) 将IIS映射到根文件夹c:\projects\restart demo 4) 使用perfmon、运行状况监视、global.asax应用程序中的跟踪等,监视应用程序重新启动 5) 浏览器中的请求页 应用程序启动 6) 创建新文件夹c:\projects\restart demo\asdf 应用端 7) 浏览器中的请求页 应

更新--复制问题的过程:

1) 在c:\projects\restart demo创建网站项目

2) 添加默认web.config和虚拟aspx页面test.aspx

3) 将IIS映射到根文件夹c:\projects\restart demo

4) 使用perfmon、运行状况监视、global.asax应用程序中的跟踪等,监视应用程序重新启动

5) 浏览器中的请求页

应用程序启动

6) 创建新文件夹c:\projects\restart demo\asdf

应用端

7) 浏览器中的请求页

应用程序启动

8) 将文件夹c:\projects\restart demo\asdf重命名为c:\projects\restart demo\asdf1

应用端

结束更新

我们正在使用后端CMS在ASP.NET站点中生成文件和文件夹

用户可以创建/修改/删除文件,并将这些文件推送到web场

我们注意到一个问题:

当用户创建、重命名或删除文件夹时,会导致应用程序 要重新启动的域。因此,, 会话、缓存等全部丢失

注意,它也不需要像/bin或/App_代码这样的特殊文件夹

有没有办法防止这种行为

由于两个原因,它确实阻碍了性能:

  • 应用程序域重新启动时转储缓存
  • 重新启动后需要重新构建应用程序域
启用并查看事件日志以了解AppDomain重新启动的原因


我打赌这是因为您使用了一个web站点项目,而不是web应用程序项目。尝试用一个web应用程序项目来重现这一点


此外,您是否有任何防病毒或索引软件在运行?此类软件会在创建和/或修改文件夹时发出通知。

默认情况下,asp.net应用程序将在其虚拟目录中每15次文件更改时重新启动一次,这将超过部分重新编译及其内存重量与总体性能的比重……您可以更改此行为,但随着时间的推移,内存使用可能会增加,性能也会下降

要执行此操作,请设置,您的web.config将有如下en元素:

<configuration>
  <system.web>
    <compilation numRecompilesBeforeAppRestart="15">


默认值为15,你可以将其更改为任何你想要的,阅读链接了解更多信息。但是,这样做是有原因的,不建议将您的动态内容放在应用程序的虚拟目录中,最好将其放在它旁边或完全放在其他地方。

当添加到Global.asax中的应用程序_Start()中时,此代码似乎可以解决此问题:

PropertyInfo p = typeof(System.Web.HttpRuntime).GetProperty("FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public |  BindingFlags.Static);
object o = p.GetValue(null, null);
FieldInfo f = o.GetType().GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
object monitor = f.GetValue(o);
MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", BindingFlags.Instance | BindingFlags.NonPublic);
m.Invoke(monitor, new object[] { }); 

通过这些更改,我可以创建/修改/删除文件夹,而不会导致应用程序重新启动


不清楚这是否是最佳解决方案--不知道调用StopMonitoring是否会产生不必要的副作用。

可能有点晚了,但将临时文件存储和处理在应用程序WWW根目录外的其他文件夹中也可以解决问题。

添加
“fcnMode=“Disabled”“
web.config中的
设置时,当web根文件夹的内容被更改时,禁用AppDomain回收。

这种情况是否100%发生,或者说,当创建了某个数字时,就像每15次更改一样?您描述的行为并不典型。你能再给我们一些上下文信息代码吗?@Nick:这种情况每次都会发生。@Nathan,我已经发布了重现问题的步骤。假设接受的答案修复了你的问题。你能告诉我你在哪里添加了下面的代码吗?你从哪里调用它的。我尝试在我的Global.asax和controller文件中这样做,但没有任何运气。如果你能编辑你的问题并把信息放在最后,那就太好了:)没有任何东西在重新编译。我只是在创建空文件夹。此外,我还调整了numRecompilesBeforeAppRestart,每次创建/修改/删除文件夹时,应用程序仍然会触发。@frankadelic-您能用一个示例更新一些正在创建的与根目录相关的文件夹吗?添加了复制问题的步骤。@frankadelic-什么操作系统会看到这个问题?FCN功能不同,因此在这种情况下很重要。我已在Windows XP(IIS 5.1)和Windows 2008(IIS7)上复制了此问题。事件消息:应用程序正在关闭。原因:未知。谢谢检查。在这种情况下,我建议你寻找防病毒软件,也许还有索引软件。无论何时创建文件夹,ASP.NET都不会导致重新启动-其他原因会导致重新启动。请在未禁用防病毒软件和索引服务的单独计算机上尝试此操作。我仍然发现应用程序正在启动。我已经在3台不同的机器上进行了测试。这似乎是一个巨大的挑战,但如果它奏效,我想你别无选择+1用于报告您的解决方案。这里还有一个更完整的示例说明如何执行此操作: