diff --git a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs index 0104993b0..bc36cbac8 100644 --- a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs +++ b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs @@ -586,6 +586,9 @@ public static void Run() System.Console.WriteLine("Press any key to quit"); System.Console.ReadKey(); + + server.Stop(); + server.Dispose(); } } } \ No newline at end of file diff --git a/src/WireMock.Net/Server/WireMockServer.Admin.cs b/src/WireMock.Net/Server/WireMockServer.Admin.cs index 44ecab2ba..c87f5c4b8 100644 --- a/src/WireMock.Net/Server/WireMockServer.Admin.cs +++ b/src/WireMock.Net/Server/WireMockServer.Admin.cs @@ -33,7 +33,7 @@ namespace WireMock.Server /// public partial class WireMockServer { - private const int EnhancedFileSystemWatcherTimeoutMs = 10000; // Changed from 1000 to 10000 (#726) + private const int EnhancedFileSystemWatcherTimeoutMs = 1000; private const int AdminPriority = int.MinValue; private const int ProxyPriority = 1000; private const string ContentTypeJson = "application/json"; @@ -49,6 +49,8 @@ public partial class WireMockServer private readonly RegexMatcher _adminMappingsGuidPathMatcher = new RegexMatcher(@"^\/__admin\/mappings\/([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$"); private readonly RegexMatcher _adminRequestsGuidPathMatcher = new RegexMatcher(@"^\/__admin\/requests\/([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$"); + private EnhancedFileSystemWatcher _enhancedFileSystemWatcher; + #region InitAdmin private void InitAdmin() { @@ -163,45 +165,17 @@ public void WatchStaticMappings([CanBeNull] string folder = null) _settings.Logger.Info($"Watching folder '{folder}'{includeSubdirectoriesText} for new, updated and deleted MappingFiles."); - var watcher = new EnhancedFileSystemWatcher(folder, "*.json", EnhancedFileSystemWatcherTimeoutMs) + DisposeEnhancedFileSystemWatcher(); + _enhancedFileSystemWatcher = new EnhancedFileSystemWatcher(folder, "*.json", EnhancedFileSystemWatcherTimeoutMs) { IncludeSubdirectories = includeSubdirectories }; - - watcher.Created += (sender, args) => - { - _settings.Logger.Info("MappingFile created : '{0}', reading file.", args.FullPath); - if (!ReadStaticMappingAndAddOrUpdate(args.FullPath)) - { - _settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); - } - }; - watcher.Changed += (sender, args) => - { - _settings.Logger.Info("MappingFile updated : '{0}', reading file.", args.FullPath); - if (!ReadStaticMappingAndAddOrUpdate(args.FullPath)) - { - _settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); - } - }; - watcher.Deleted += (sender, args) => - { - _settings.Logger.Info("MappingFile deleted : '{0}'", args.FullPath); - string filenameWithoutExtension = Path.GetFileNameWithoutExtension(args.FullPath); - - if (Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) - { - DeleteMapping(guidFromFilename); - } - else - { - DeleteMapping(args.FullPath); - } - }; - - watcher.EnableRaisingEvents = true; + _enhancedFileSystemWatcher.Created += EnhancedFileSystemWatcherCreated; + _enhancedFileSystemWatcher.Changed += EnhancedFileSystemWatcherChanged; + _enhancedFileSystemWatcher.Deleted += EnhancedFileSystemWatcherDeleted; + _enhancedFileSystemWatcher.EnableRaisingEvents = true; } - + /// [PublicAPI] public bool ReadStaticMappingAndAddOrUpdate([NotNull] string path) @@ -940,5 +914,52 @@ private T[] DeserializeJsonToArray(string value) { return DeserializeObjectToArray(JsonUtils.DeserializeObject(value)); } + + private void DisposeEnhancedFileSystemWatcher() + { + if (_enhancedFileSystemWatcher != null) + { + _enhancedFileSystemWatcher.EnableRaisingEvents = false; + + _enhancedFileSystemWatcher.Created -= EnhancedFileSystemWatcherCreated; + _enhancedFileSystemWatcher.Changed -= EnhancedFileSystemWatcherChanged; + _enhancedFileSystemWatcher.Deleted -= EnhancedFileSystemWatcherDeleted; + + _enhancedFileSystemWatcher.Dispose(); + } + } + + private void EnhancedFileSystemWatcherCreated(object sender, FileSystemEventArgs args) + { + _settings.Logger.Info("MappingFile created : '{0}', reading file.", args.FullPath); + if (!ReadStaticMappingAndAddOrUpdate(args.FullPath)) + { + _settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); + } + } + + private void EnhancedFileSystemWatcherChanged(object sender, FileSystemEventArgs args) + { + _settings.Logger.Info("MappingFile updated : '{0}', reading file.", args.FullPath); + if (!ReadStaticMappingAndAddOrUpdate(args.FullPath)) + { + _settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); + } + } + + private void EnhancedFileSystemWatcherDeleted(object sender, FileSystemEventArgs args) + { + _settings.Logger.Info("MappingFile deleted : '{0}'", args.FullPath); + string filenameWithoutExtension = Path.GetFileNameWithoutExtension(args.FullPath); + + if (Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) + { + DeleteMapping(guidFromFilename); + } + else + { + DeleteMapping(args.FullPath); + } + } } } \ No newline at end of file diff --git a/src/WireMock.Net/Server/WireMockServer.cs b/src/WireMock.Net/Server/WireMockServer.cs index 602f31eba..219e15199 100644 --- a/src/WireMock.Net/Server/WireMockServer.cs +++ b/src/WireMock.Net/Server/WireMockServer.cs @@ -80,6 +80,7 @@ public void Dispose() /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected virtual void Dispose(bool disposing) { + DisposeEnhancedFileSystemWatcher(); _httpServer?.StopAsync(); } #endregion