更新 - 复制问题的过程:
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之类的特殊文件夹。
有什么方法可以阻止这种行为吗?
这实际上阻碍了表现,原因有两个:
答案 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[] { });
通过这些更改,我可以创建/修改/删除文件夹而不会导致应用程序重新启动。
不清楚这是否是最佳解决方案 - 不知道是否会因调用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应用程序项目重现这一点。
此外,您是否运行了任何防病毒或索引软件?此类软件会在创建和/或修改文件夹时发出通知。