17

更新——复制问题的过程:

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

用户能够创建/修改/删除文件并将它们推送到网络场。

我们注意到的一个问题:

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

请注意,它也不需要是像 /bin 或 /App_Code 这样的特殊文件夹。

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

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

  • 应用域重启时缓存被转储
  • 重启后需要重新建app域
4

5 回答 5

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

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

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

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

于 2010-02-12T17:25:35.383 回答
9

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

于 2011-04-28T16:04:54.020 回答
2

默认情况下,asp.net 应用程序将在其虚拟目录中的文件更改时每 15 次重新启动一次,这是为了超过部分重新编译及其内存权重与整体性能的关系……您可以更改此行为,但内存使用量可能会增加,性能将随着时间的推移而下降。

为此,请在编译元素上设置 numRecompilesBeforeAppRestart 属性,您的 web.config 将具有这样的 en 元素:

<configuration>
  <system.web>
    <compilation numRecompilesBeforeAppRestart="15">

默认值为 15,您可以将其更改为任何您想要的,阅读链接了解更多信息。但是,这种方式是有原因的,不建议将您的动态内容放在应用程序的虚拟目录中,最好将其放在它旁边或完全放在其他地方。

于 2010-02-12T00:42:19.657 回答
2

当 web 根文件夹的内容被更改时,添加"fcnMode="Disabled"到禁用 AppDomain 回收<httpRuntime>中的设置。web.config

于 2016-11-16T17:37:17.900 回答
0

启用ASP.NET 运行状况监视并查看事件日志以了解 AppDomain 重新启动的原因。


我敢打赌,这是因为您使用的是网站项目,而不是 Web 应用程序项目。尝试使用 Web 应用程序项目重现这一点。

另外,您是否正在运行任何防病毒或索引软件?此类软件会在创建和/或修改文件夹时发出通知。

于 2010-02-12T00:40:08.407 回答