当文件被更改时,我该如何使ASP.NET重新启动?

3
我有一个ASP.NET应用程序,它是一个更大系统的一部分;它从位于Web应用程序根目录之上的文件中读取大部分配置信息。
由于应用程序已经编写好,并且配置文件的格式被选择为方便客户编辑,因此我无法使用“.NET中共享配置文件”的解决方案
我希望ASP.NET有一个API可以在启动时调用告诉它要监视哪个文件。(我可以使用“FileSystemWatcher”硬编码来实现这个功能并捕获事件,然后自己进行重启操作,但是这样做很遗憾,因为ASP.NET已经有了监视文件并在文件发生更改时重新启动的代码。)
另外,我该调用哪个ASP.NET API以获取ASP.NET以良好的方式重新启动?
这些是我找到的一些链接,可能会有所帮助:从ASP.NET使用FileSystemWatcher扩展FileSystemWatcher到ASP.NET
在一个案例中,我将配置缓存到ASP.NET缓存中,并设置了一个缓存依赖于该文件。在另一种需要更快访问的情况下,我使用了FileSystemWatcher,并在配置更改时更新了一个静态字段。
(我从未找到一种合理的方式来从代码中重新启动ASP.NET。)
5个回答

6
  static FileSystemWatcher ConfigWatcher;

  static void StartWatchConfig() {

     ConfigWatcher = new FileSystemWatcher("configPath") {
        Filter = "configFile"
     };

     ConfigWatcher.Changed += new FileSystemEventHandler(ConfigWatcher_Changed);
     ConfigWatcher.EnableRaisingEvents = true;
  }

  static void ConfigWatcher_Changed(object sender, FileSystemEventArgs e) {
     HttpRuntime.UnloadAppDomain();
  }

1
HttpRuntime.UnloadAppDomain() 方法就是我所缺少的。 - Ian Ringrose

4
如果您知道您的应用程序永远不会访问HttpContext之外的配置,请考虑缓存您的配置并向文件添加CacheDependency。如果文件更改,则会删除已缓存的配置,您可以使用更新后的值重新添加它。
类似这样:
public MyConfigObj GetConfig()
{
    var config = Cache["configkey"] as MyConfigObj;
    if(config == null)
    {
        var configPath = Server.MapPath("myconfigpath");
        config = GetConfigFromFile(configPath);
        Cache.Insert("configkey", config, new CacheDependency(configPath));
    }
    return config;
}

谢谢,这个答案对很多人都有用;但是我们需要重新启动才能使用更改后的配置。如果我再开始,考虑这个选项会很有趣。 - Ian Ringrose
我例外地选择了这个答案,因为它最接近解决我的根本问题。在另一种情况下,我缓存了一个配置文件;当文件更改时,我使用FileSystemWatcher并更新了一个静态字段。 - Ian Ringrose

1

对于第二部分,您可以使用以下代码片段来触发AppPool回收(这与重新启动整个服务器不同,仅在应用程序级别上进行)。

using System.DirectoryServices;

public void RecycleAppPool(string machine, string appPoolName) 
{
    string path = "IIS://" + machine + "/W3SVC/AppPools/" + appPoolName;
    DirectoryEntry w3svc = new DirectoryEntry(path);
    w3svc.Invoke("Recycle", null);
}

(从这里


-1

我认为你需要创建一个服务,使用FileSystemWatcher来监视Web应用程序目录之外的配置文件的更改情况,当检测到更改时,对Web应用程序的web.config文件进行非重要更改并保存,这将重新启动应用程序。


-1

也许这是一个愚蠢的答案,但您始终可以“touch”(添加一些空格或其他字符)您的web.config文件,这将触发重新启动。这是穷人版的iisreset =)

(我想再强调一下,这不是通常重新启动网站或重置IIS的理想解决方案)


问题在于当人们忘记做这件事时,我们会收到很多错误报告! - Ian Ringrose
然后我会寻找自动化部署解决方案,例如TeamCity或CruiseControl.net,它们可以自动化部署,并且足够可配置以“触及”web.config文件。 - Chad Ruppert
我们的客户在自己的服务器上运行我们的应用程序,该应用程序在他们自己的网络内部运行。(这是我们销售的一种应用程序,只是它的一部分使用HTML作为界面。) - Ian Ringrose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接