Как я могу заставить ASP.NET перезагружаться при изменении файла? - PullRequest
1 голос
/ 19 мая 2009

У меня есть приложение ASP.NET, которое является частью гораздо большей системы; он читает большую часть своей конфигурации из файлов, которые находятся выше корневого уровня веб-приложения.

Поскольку приложение уже написано и формат файлов конфигурации был выбран для упрощения редактирования пользователями, я не могу использовать решение в «Совместно используемые файлы конфигурации в .NET».

Я надеюсь, что в ASP.NET есть API, который я могу вызвать во время запуска, чтобы сообщить ему, какой файл смотреть. (Я мог бы написать это непросто, используя FileSystemWatcher и перехватывая события, а затем сам перезапускать, но было бы жаль, поскольку в ASP.NET уже есть код для просмотра файлов и перезапуска при их изменении.)

Кроме того, какой ASP.NET API я вызываю, чтобы ASP.NET перезапустился?

Вот некоторые ссылки, которые я нашел, которые могут помочь: Использование FileSystemWatcher из ASP.NET и Расширение FileSystemWatcher до ASP.NET


В одном случае я кэшировал конфигурацию в ASP.NET Cache и установил CacheDependency к файлу. В другом случае, когда требовался более быстрый доступ, я использовал FileSystemWatcher и обновлял статическое поле при изменении конфигурации.

(я так и не узнал, как разумно перезапустить ASP.NET из кода.)

Ответы [ 5 ]

4 голосов
/ 06 октября 2011
  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();
  }
4 голосов
/ 19 мая 2009

Если вы знаете, что ваше приложение никогда не получит доступ к конфигурации вне 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;
}
1 голос
/ 27 августа 2009

Во второй части вы можете использовать следующий фрагмент кода для запуска перезапуска 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);
}

(из здесь )

0 голосов
/ 20 мая 2009

Возможно, глупый ответ, но вы всегда можете «дотронуться» (добавить пробел или что-то еще) до вашего файла web.config, и это вызовет перезапуск. Это iisreset бедняков =)

(хочу еще раз подчеркнуть, что это не идеальное решение для общего перезапуска веб-сайтов или сброса IIS)

0 голосов
/ 19 мая 2009

Я думаю, что вам понадобится создать службу, которая использует FileSystemWatcher для отслеживания изменений в файлах конфигурации вне каталога веб-приложения, а затем, когда изменение обнаружено, внесите незначительное изменение в веб-приложение. Файл web.config и сохраните его, чтобы перезапустить приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...