更新——复制问题的过程:
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 站点中生成文件和文件夹。
用户可以创建/修改/删除文件并将这些文件推送到网络场。
我们注意到的一个问题:
When the user creates, renames or deletes a folder, it causes the App Domain to restart. As a consequence, session, cache, etc. are all lost.
请注意,它也不需要是像/bin 或/App_Code 这样的特殊文件夹。
有什么办法可以阻止这种行为吗?
这确实会影响性能,原因有两个:
- 应用域重新启动时会转储缓存
- 重启后需要重新构建应用域
最佳答案
将此代码添加到 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 是否会产生不需要的副作用。
关于创建、重命名或删除文件夹时 ASP.NET 重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248825/