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