static void OnFileChanged(object sender, FileSystemEventArgs args) { if (HttpRuntime.DomainUnloading) { return; } string name = args.Name; bool isConfig = false; if (StrUtils.EndsWith(name, "onfig", true)) { if (String.Compare(Path.GetFileName(name), "web.config", true, Helpers.InvariantCulture) != 0) { return; } isConfig = true; } else if (StrUtils.EndsWith(name, "lobal.asax", true) && String.Compare(name, "global.asax", true, Helpers.InvariantCulture) != 0) { return; } Console.WriteLine("Change: " + name); // {Inotify,FAM}Watcher will notify about events for a directory regardless // of the filter pattern. This might be a bug in the watchers code, but // since I couldn't find any rationale for the code in there I'd opted for // not removing it and instead working around the issue here. Fix for bug // #495011 FileSystemWatcher watcher = sender as FileSystemWatcher; if (watcher != null && String.Compare(watcher.Filter, "?eb.?onfig", true, Helpers.InvariantCulture) == 0 && Directory.Exists(name)) { return; } // We re-enable suppression here since WebConfigurationManager will disable // it after save is done. WebConfigurationManager is called twice by // Configuration - just after opening the target file and just after closing // it. For that reason we will receive two change notifications and if we // disabled suppression here, it would reload the application on the second // change notification. if (isConfig && WebConfigurationManager.SuppressAppReload(true)) { return; } lock (watchers_lock) { if (app_shutdown) { return; } app_shutdown = true; // Disable event raising to avoid concurrent restarts DisableWatchers(); // Restart application HttpRuntime.UnloadAppDomain(); } }