更新--复制问题的过程:
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
应用程序端
结束更新
我们正在使用后端内容管理系统在ASP.NET站点中生成文件和文件夹。
用户可以创建/修改/删除文件,并将这些文件推送到web场。
我们注意到的一个问题是:
当用户创建、重命名或删除文件夹时,它会导致应用程序域重新启动。因此,会话、缓存等都会丢失。
注意:它也不需要是像/bin或/App_Code这样的特殊文件夹。
有什么方法可以防止这种行为吗?
它确实会影响性能,原因有两个:
应用程序域重新启动时
后重新构建
发布于 2010-02-13 01:25:35
当添加到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[] { });
通过这些更改,我可以创建/修改/删除文件夹,而不会导致应用程序重新启动。
不清楚这是否是最好的解决方案--不知道调用StopMonitoring是否会产生有害的副作用。
发布于 2011-04-29 00:04:54
也许有点晚,但是在应用程序的wwwroot之外的另一个文件夹中存储和处理临时文件也可以解决这个问题。
发布于 2010-02-12 08:42:20
默认情况下,asp.net应用程序将在其虚拟目录中的文件更改的每第15次重启,这是为了超过部分重新编译,它们的内存重量与总体performance...you可以改变这一行为,但内存使用量可能会随着时间的推移而上升和性能下降。
要执行此操作,请设置numRecompilesBeforeAppRestart attribute on the compilation element,您的web.config将具有如下元素:
<configuration>
<system.web>
<compilation numRecompilesBeforeAppRestart="15">
默认值是15,您可以将其更改为您想要的任何内容,请阅读链接以获取更多信息。然而,这样做是有原因的,,不建议将你的动态内容放在应用程序的虚拟目录中,最好将它放在它旁边或其他地方。
https://stackoverflow.com/questions/2248825
复制相似问题