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

时间:2010-02-12 00:28:32

标签: 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 Application_End等跟踪监控应用程序重启

5)浏览器http://localhost/test.aspx

中的请求页面

应用程序启动

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

申请结束

7)浏览器http://localhost/test.aspx

中的请求页面

应用程序启动

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

申请结束

结束更新

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

用户可以创建/修改/删除文件并将其推送到Web场。

我们注意到一个问题:

  

当用户创建,重命名或删除文件夹时,会导致该应用   要重新启动的域。作为结果,   会话,缓存等都丢失了。

请注意,它不需要是/ bin或/ App_Code之类的特殊文件夹。

有什么方法可以阻止这种行为吗?

这实际上阻碍了表现,原因有两个:

  • 在应用程序域重新启动时转储缓存
  • 重新启动后需要重新构建应用程序域

5 个答案:

答案 0 :(得分:15)

当在Global.asax中添加到Application_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[] { }); 

http://dotnetslackers.com/Community/blogs/haissam/archive/2008/11/12/disable-session-expiration-when-using-directory-delete.aspx

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

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

答案 1 :(得分:9)

也许有点晚了,但是在应用程序的wwwroot之外的不同文件夹中存储和处理临时文件也可以解决问题。

答案 2 :(得分:2)

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

要执行此操作,请设置numRecompilesBeforeAppRestart attribute on the compilation element,您的web.config将具有以下元素:

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

默认值为15,您可以将其更改为您想要的任何内容,请阅读链接以获取更多信息。但是,出于某种原因,就是这种方式,不建议您将动态内容放在应用程序的虚拟目录中,最好将其放在旁边或其他地方。

答案 3 :(得分:2)

"fcnMode="Disabled"的{​​{1}}设置中添加<httpRuntime>会在更改Web根文件夹的内容时禁用AppDomain回收。

答案 4 :(得分:0)

启用ASP.NET Health Monitoring并查看事件日志以查看AppDomain重新启动的原因。


我敢打赌,这是因为您使用的是网站项目,而不是Web应用程序项目。尝试使用Web应用程序项目重现这一点。

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