【问题标题】:Application Restart for folder deleted,added,updated删除、添加、更新文件夹的应用程序重新启动
【发布时间】:2012-09-03 08:40:20
【问题描述】:

修改、添加或删除应用程序已知文件夹中的某些类型的文件会导致应用程序重新启动。但是当更新应用程序中的日志文件时,为什么应用程序没有重新启动。 那么

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

通过这些更改,我可以创建/修改/删除文件夹,而不会导致应用程序重新启动。但是此代码适用于所有应用程序的已知文件夹。我想知道是针对一个文件夹而不会导致应用程序重新启动。

【问题讨论】:

  • 如果日志文件不是应用程序安装的一部分,它不会导致应用程序重新启动。例如,如果应用程序通过 ILog 实现日志记录,由于日志文件是由应用程序创建的,而不是在安装过程中,并且对于应用程序的运行不是必需的,因此不会导致重新启动。
  • 感谢您的解释。我还想知道一个文件夹的 System.Reflection.MethodInfo 的 StopMonitoring 而不会导致应用程序重新启动。
  • 您使用的是 ASP.Net 2.0 吗?你的会话是 InProc 吗??

标签: c# asp.net global-asax


【解决方案1】:

您的问题是因为一旦您修改或删除应用程序目录中的任何文件,就会导致 appDomain 重新启动以加载更改。据我所知,您有 4 个选项:

  1. 禁用目录监控,您已经尝试过了。
  2. 在应用程序下创建一个虚拟目录并将其指向应用程序文件夹之外的文件夹。将需要更改的内容移到此文件夹,可以进行更改。
  3. 使用进程外会话。
  4. 修改注册表以禁用给定的监控(不推荐):

注册信息

loadTOCNode(3, '分辨率'); HKLM\Software\Microsoft\ASP.NET\FCNMode

下表列出了 FCNMode DWORD 值的可能值 以及与每个值关联的行为。

值行为不存在 这是默认行为。对于每个 子目录,应用程序将创建一个对象来监控 子目录。 0 或大于 2 这是默认行为。 对于每个子目录,应用程序将创建一个对象,该对象将 监视子目录。

1 应用程序将禁用文件更改通知 (FCN)。 [:)]。

2 应用程序将创建一个对象来监控主 目录。应用程序将使用这个对象来监控每个 子目录。

以上方法取自here

此外,您可以通过以下链接了解更多信息:

好吧,这可能有助于解决您的问题,我找不到任何关于停止特定文件夹的 appDomain 更改监控的信息。它要么监视更改,要么不监视。 希望这可以帮助。干杯。

【讨论】:

    最近更新 更多