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

fra*_*lic 17 asp.net appdomain application-pool content-management-system

更新 - 复制问题的过程:

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场.

我们注意到的一个问题:

当用户创建,重命名或删除文件夹时,会导致App Domain重新启动.结果,会话,缓存等都丢失了.

请注意,它不需要是/ bin或/ App_Code之类的特殊文件夹.

有什么方法可以防止这种行为吗?

它实际上阻碍了性能,原因有两个:

  • 应用程序域重新启动时会转储缓存
  • 重新启动后需要重新构建应用程序域

fra*_*lic 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[] { }); 
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ple*_*eun 9

也许有点晚了,但是在应用程序的wwwroot之外的不同文件夹中存储和处理临时文件也可以解决问题.