【问题标题】:How can I get ASP.NET to restart when a file is changed?更改文件时如何让 ASP.NET 重新启动?
【发布时间】:2010-10-27 08:42:37
【问题描述】:

我有一个 ASP.NET 应用程序,它是一个更大系统的一部分;它从 Web 应用程序根级别以上的文件中读取大部分配置。

由于已经编写了应用程序并且选择了配置文件的格式以方便客户编辑,我无法使用“Shared configuration files in .NET”.中的解决方案

我希望 ASP.NET 有一个 API,我可以在启动时调用它来告诉它要观看哪个文件。 (我可以使用“FileSystemWatcher”以艰难的方式编写此代码并捕获事件然后自己重​​新启动,但是这将是一个遗憾,因为 ASP.NET 已经有代码来监视文件并在更改时重新启动。)

我还需要调用什么 ASP.NET API 才能让 ASP.NET 以一种好的方式重新启动?

这些是我发现的一些可能有帮助的链接: Using the FileSystemWatcher from ASP.NETExtending FileSystemWatcher to ASP.NET


在一种情况下,我将配置缓存在 ASP.NET 缓存中,并为文件设置了 CacheDependency。在另一种需要更快访问的情况下,我使用了 FileSystemWatcher 并在配置更改时更新了一个静态字段。

(我从未发现如何以合理的方式从代码中重新启动 ASP.NET。)

【问题讨论】:

    标签: .net asp.net configuration


    【解决方案1】:
      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();
      }
    

    【讨论】:

    • HttpRuntime.UnloadAppDomain() 方法是我所缺少的。
    【解决方案2】:

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

    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);
    }
    

    (来自here

    【讨论】:

      【解决方案3】:

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

      (我想再次强调,这不是一般重启网站或重置 IIS 的理想解决方案)

      【讨论】:

      • 问题是当人们忘记这样做时,我们会收到很多错误报告!
      • 然后我会寻找一个自动化部署解决方案,例如 TeamCity 或 CruiseControl.net,它可以自动部署,并且可以配置到足以“触摸”web.config 文件。
      • 我们的客户在他们自己的服务器等自己的网络中运行我们的应用程序。 (这是一个我们出售的应用程序,它只是碰巧将 HTML 用于它的部分 UI)
      【解决方案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;
      }
      

      【讨论】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        • 2020-11-08
        相关资源
        最近更新 更多