17

更新 - 过程复制问题:ASP.NET重新启动时创建一个文件夹,重命名或删除

1)c。创建一个网站项目:\项目\重启演示

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

3)地图IIS指向的根文件夹C:\项目\重启演示

4)使用性能监视器,健康监测监控应用程序重新启动,在Global.asax的Application_End跟踪等

5)在浏览器请求页面http://localhost/test.aspx

应用程序启动

6)创建新的文件夹C:\项目\重启演示\ ASDF

结束应用程序

7)在浏览器请求页面http://localhost/test.aspx

应用程序启动

8)重命名文件夹C:\项目\重启演示\ ASDFC:\项目\重启演示\ asdf1

应用结束

结束更新

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

用户能够创建/修改/删除文件,推动这些到了Web农场。

的一个问题,我们注意到:

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

注意它并不需要像/ bin或/ App_Code文件的特殊文件夹两种。

有什么办法来防止这种行为?

这实在是阻碍业绩的原因有两个:

  • 缓存被转储应用程序域重新启动时
  • 应用程序域需要重新启动后重新建立
+1

这是否发生在100%的时间,或者说,创造了某个数字,就像每第15次更改一样? – 2010-02-12 00:37:12

+0

你描述的行为并不典型。你能否给我们提供一些更具说明性的信息代码? – 2010-02-12 00:39:47

+0

@尼克:每次都会发生这种情况。 – frankadelic 2010-02-12 00:47:52

回答

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

看起来像一个巨大的黑客,但如果它的作品,我猜你没有选择。 +1用于报告您的解决方案。 – mxmissile 2010-02-12 21:23:29

+0

另外还有一个更完整的示例,说明如何在此处执行此操作:http://www.aaronblake.co.uk/blog/2009/09/28/bug-fix-application-restarts-on-directory-delete-in- ASP-NET / – 2010-03-16 08:25:54

0

启用ASP.NET Health Monitoring,并期待在事件日志以查看为什么AppDomain重新启动。


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

另外,你有没有运行任何防病毒或索引软件?此类软件会通知何时创建和/或修改文件夹。

+0

事件消息:应用程序正在关闭。原因:未知。 – frankadelic 2010-02-12 01:07:41

+0

刚刚尝试使用Web应用程序项目。同样的问题。 – frankadelic 2010-02-12 01:45:12

+0

感谢您的检查。在这种情况下,我建议你寻找反病毒软件和索引软件。每当创建文件夹时,ASP.NET都不会导致重新启动 - 其他情况_is_。 – 2010-02-12 01:50:50

2

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

要做到这一点,设置numRecompilesBeforeAppRestart attribute on the compilation element,你的web.config必须连接元件是这样的:

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

默认值是15,你可以把它改成任何你想要的,读的链接以获得更多信息。但是,这是因为的原因,不建议将动态内容放在应用程序的虚拟目录中,最好将其放在应用程序的旁边或其他位置。

+0

没有重新编译。我只是创建空文件夹。 此外,我已经调整了numRecompilesBeforeAppRestart,每次创建/修改/删除文件夹时,Application_End仍会触发。 – frankadelic 2010-02-12 00:53:03

+0

@frankadelic - 你可以更新一个正在创建的几个文件夹的例子吗? – 2010-02-12 01:01:56

+0

添加了复制问题的步骤。 – frankadelic 2010-02-12 01:08:25

9

也许有点迟了,但是将临时文件存储并处理到应用程序wwwroot之外的其他文件夹中也可以解决此问题。

2

添加"fcnMode="Disabled"web.config<httpRuntime>设置禁用的AppDomain回收时,Web根文件夹的内容被改变。