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

标签 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 站点中生成文件和文件夹。

用户可以创建/修改/删除文件并将这些文件推送到网络场。

我们注意到的一个问题:

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[] { }); 

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

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

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

关于创建、重命名或删除文件夹时 ASP.NET 重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248825/

相关文章:

silverlight - Silverlight 是否为每个浏览器选项卡使用单独的应用程序域?

c# - 在回发 asp.net 之间保存变量的最佳方法?

drupal - View 正在从输出中剥离标签

c# - AppDomain.AppendPrivatePath 替代方案?

php - 如果我从另一个 GNU GPL 应用程序中获得灵感开发一个程序会发生什么?

php - 实时 API 调用的数据库模式建议

c# - 跨 AppDomain 调用破坏了运行时

c# - HTML 表格的位置低于应有的位置

c# - 标识符必须声明为 ORA-06550 和 PLS-00201

c# - 在 ASP.Net 中将数据更新到 SQL Server 的最佳实践是什么