diff --git a/README.md b/README.md
index 82e3f810f..54d40890c 100644
--- a/README.md
+++ b/README.md
@@ -59,9 +59,13 @@ WireMock.Net can be used in several ways:
You can use your favorite test framework and use WireMock within your tests, see
[Wiki : UnitTesting](https://github.com/StefH/WireMock.Net/wiki/Using-WireMock-in-UnitTests).
+### As a dotnet tool
+It's simple to install WireMock.Net as (global) dotnet tool, see [Wiki : Standalone Process](https://github.com/StefH/WireMock.Net/wiki/WireMock-as-dotnet-tool).
+
### As standalone process / console application
This is quite straight forward to launch a mock server within a console application, see [Wiki : Standalone Process](https://github.com/StefH/WireMock.Net/wiki/WireMock-as-a-standalone-process).
+
### As a Windows Service
You can also run WireMock.Net as a Windows Service, follow this [WireMock-as-a-Windows-Service](https://github.com/WireMock-Net/WireMock.Net/wiki/WireMock-as-a-Windows-Service).
diff --git a/WireMock.Net Solution.sln b/WireMock.Net Solution.sln
index e295c7e7c..ea9086e57 100644
--- a/WireMock.Net Solution.sln
+++ b/WireMock.Net Solution.sln
@@ -71,7 +71,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.WebApplication
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.WebApplication.NETCore3", "examples\WireMock.Net.WebApplication.NETCore3\WireMock.Net.WebApplication.NETCore3.csproj", "{E1C56967-3DC7-46CB-A1DF-B13167A0D9D4}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WireMock.Net.Console.NETCoreApp3WithCertificate", "examples\WireMock.Net.Console.NETCoreApp3WithCertificate\WireMock.Net.Console.NETCoreApp3WithCertificate.csproj", "{925E421A-1B3F-4202-B48F-734743573A4B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WireMock.Net.Console.NETCoreApp3WithCertificate", "examples\WireMock.Net.Console.NETCoreApp3WithCertificate\WireMock.Net.Console.NETCoreApp3WithCertificate.csproj", "{925E421A-1B3F-4202-B48F-734743573A4B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-WireMock", "src\dotnet-WireMock.Net\dotnet-WireMock.csproj", "{40BF24B5-12E6-4610-9489-138798632E28}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -179,6 +181,10 @@ Global
{925E421A-1B3F-4202-B48F-734743573A4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{925E421A-1B3F-4202-B48F-734743573A4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{925E421A-1B3F-4202-B48F-734743573A4B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {40BF24B5-12E6-4610-9489-138798632E28}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -209,6 +215,7 @@ Global
{6F38CB3A-6DA1-408A-AECD-E434523C2838} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
{E1C56967-3DC7-46CB-A1DF-B13167A0D9D4} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
{925E421A-1B3F-4202-B48F-734743573A4B} = {985E0ADB-D4B4-473A-AA40-567E279B7946}
+ {40BF24B5-12E6-4610-9489-138798632E28} = {8F890C6F-9ACC-438D-928A-AD61CDA862F2}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DC539027-9852-430C-B19F-FD035D018458}
diff --git a/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs b/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs
index 2af771983..5ccabe7ba 100644
--- a/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs
+++ b/examples/WireMock.Net.StandAlone.NETCoreApp/Program.cs
@@ -23,7 +23,11 @@ static void Main(string[] args)
{
XmlConfigurator.Configure(LogRepository, new FileInfo("log4net.config"));
- var settings = WireMockServerSettingsParser.ParseArguments(args, new WireMockLog4NetLogger());
+ if (WireMockServerSettingsParser.TryParseArguments(args, out var settings, new WireMockLog4NetLogger()))
+ {
+ return;
+ }
+
settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
_server = WireMockServer.Start(settings);
diff --git a/examples/WireMock.Net.StandAlone.Net452/Program.cs b/examples/WireMock.Net.StandAlone.Net452/Program.cs
index 83240774d..ff2acda3f 100644
--- a/examples/WireMock.Net.StandAlone.Net452/Program.cs
+++ b/examples/WireMock.Net.StandAlone.Net452/Program.cs
@@ -13,13 +13,15 @@ static void Main(params string[] args)
{
XmlConfigurator.Configure(new FileInfo("log4net.config"));
- var settings = WireMockServerSettingsParser.ParseArguments(args);
- settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
-
- WireMockServer.Start(settings);
-
- Console.WriteLine("Press any key to stop the server");
- Console.ReadKey();
+ if (WireMockServerSettingsParser.TryParseArguments(args, out var settings))
+ {
+ settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
+
+ WireMockServer.Start(settings);
+
+ Console.WriteLine("Press any key to stop the server");
+ Console.ReadKey();
+ }
}
}
}
\ No newline at end of file
diff --git a/examples/WireMock.Net.StandAlone.Net461/Program.cs b/examples/WireMock.Net.StandAlone.Net461/Program.cs
index 72787ce14..172aed7f0 100644
--- a/examples/WireMock.Net.StandAlone.Net461/Program.cs
+++ b/examples/WireMock.Net.StandAlone.Net461/Program.cs
@@ -9,13 +9,15 @@ static class Program
{
static void Main(string[] args)
{
- var settings = WireMockServerSettingsParser.ParseArguments(args);
- settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
-
- WireMockServer.Start(settings);
-
- Console.WriteLine("Press any key to stop the server");
- Console.ReadKey();
+ if (WireMockServerSettingsParser.TryParseArguments(args, out var settings))
+ {
+ settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
+
+ WireMockServer.Start(settings);
+
+ Console.WriteLine("Press any key to stop the server");
+ Console.ReadKey();
+ }
}
}
}
\ No newline at end of file
diff --git a/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj b/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj
index f013e3595..1d9f0f78d 100644
--- a/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj
+++ b/src/WireMock.Net.Abstractions/WireMock.Net.Abstractions.csproj
@@ -21,6 +21,7 @@
../WireMock.Net/WireMock.Net.snk
true
+ MIT
diff --git a/src/WireMock.Net.FluentAssertions/WireMock.Net.FluentAssertions.csproj b/src/WireMock.Net.FluentAssertions/WireMock.Net.FluentAssertions.csproj
index 96b5f09d5..08b9e4b2b 100644
--- a/src/WireMock.Net.FluentAssertions/WireMock.Net.FluentAssertions.csproj
+++ b/src/WireMock.Net.FluentAssertions/WireMock.Net.FluentAssertions.csproj
@@ -21,6 +21,7 @@
../WireMock.Net/WireMock.Net.snk
true
+ MIT
diff --git a/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj b/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj
index d1dd4c45a..e3d507baf 100644
--- a/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj
+++ b/src/WireMock.Net.OpenApiParser/WireMock.Net.OpenApiParser.csproj
@@ -11,6 +11,7 @@
true
../WireMock.Net/WireMock.Net.snk
true
+ MIT
diff --git a/src/WireMock.Net.RestClient/WireMock.Net.RestClient.csproj b/src/WireMock.Net.RestClient/WireMock.Net.RestClient.csproj
index 8c7740367..1d26a8167 100644
--- a/src/WireMock.Net.RestClient/WireMock.Net.RestClient.csproj
+++ b/src/WireMock.Net.RestClient/WireMock.Net.RestClient.csproj
@@ -21,6 +21,7 @@
../WireMock.Net/WireMock.Net.snk
true
+ MIT
diff --git a/src/WireMock.Net.StandAlone/StandAloneApp.cs b/src/WireMock.Net.StandAlone/StandAloneApp.cs
index 12f2a91a4..26cb4521d 100644
--- a/src/WireMock.Net.StandAlone/StandAloneApp.cs
+++ b/src/WireMock.Net.StandAlone/StandAloneApp.cs
@@ -1,5 +1,5 @@
-using JetBrains.Annotations;
-using System.Linq;
+using System.Linq;
+using JetBrains.Annotations;
using WireMock.Logging;
using WireMock.Server;
using WireMock.Settings;
@@ -38,11 +38,37 @@ public static WireMockServer Start([NotNull] string[] args, [CanBeNull] IWireMoc
{
Check.NotNull(args, nameof(args));
- var settings = WireMockServerSettingsParser.ParseArguments(args, logger);
+ if (WireMockServerSettingsParser.TryParseArguments(args, out var settings, logger))
+ {
+ settings.Logger?.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
+
+ return Start(settings);
+ }
- settings.Logger?.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
+ return null;
+ }
+
+ ///
+ /// Try to start WireMock.Net standalone Server based on the commandline arguments.
+ ///
+ /// The commandline arguments
+ /// The logger
+ /// The WireMockServer
+ [PublicAPI]
+ public static bool TryStart([NotNull] string[] args, out WireMockServer server, [CanBeNull] IWireMockLogger logger = null)
+ {
+ Check.NotNull(args, nameof(args));
+
+ if (WireMockServerSettingsParser.TryParseArguments(args, out var settings, logger))
+ {
+ settings.Logger?.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
+
+ server = Start(settings);
+ return true;
+ }
- return Start(settings);
+ server = null;
+ return false;
}
}
}
\ No newline at end of file
diff --git a/src/WireMock.Net/Settings/SimpleCommandLineParser.cs b/src/WireMock.Net/Settings/SimpleCommandLineParser.cs
index 063b2c46c..1e31a7de9 100644
--- a/src/WireMock.Net/Settings/SimpleCommandLineParser.cs
+++ b/src/WireMock.Net/Settings/SimpleCommandLineParser.cs
@@ -9,7 +9,7 @@ internal class SimpleCommandLineParser
{
private const string Sigil = "--";
- private IDictionary Arguments { get; } = new Dictionary();
+ private IDictionary Arguments { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase);
public void Parse(string[] arguments)
{
@@ -70,6 +70,11 @@ public bool GetBoolValue(string name, bool defaultValue = false)
}, defaultValue);
}
+ public bool GetBoolSwitchValue(string name)
+ {
+ return Contains(name);
+ }
+
public int? GetIntValue(string name, int? defaultValue = null)
{
return GetValue(name, values =>
diff --git a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs
index ff00bac5b..b5ab5c39e 100644
--- a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs
+++ b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs
@@ -1,106 +1,114 @@
-using JetBrains.Annotations;
-using WireMock.Logging;
-using WireMock.Validation;
-
-namespace WireMock.Settings
-{
- ///
- /// A static helper class to parse commandline arguments into IWireMockServerSettings.
- ///
- public static class WireMockServerSettingsParser
- {
- ///
- /// Parse commandline arguments into WireMockServerSettings.
- ///
- /// The commandline arguments
- /// The logger (optional, can be null)
- [PublicAPI]
- public static IWireMockServerSettings ParseArguments([NotNull] string[] args, [CanBeNull] IWireMockLogger logger = null)
- {
- Check.HasNoNulls(args, nameof(args));
-
- var parser = new SimpleCommandLineParser();
- parser.Parse(args);
-
- var settings = new WireMockServerSettings
- {
- StartAdminInterface = parser.GetBoolValue("StartAdminInterface", true),
- ReadStaticMappings = parser.GetBoolValue("ReadStaticMappings"),
- WatchStaticMappings = parser.GetBoolValue("WatchStaticMappings"),
- AllowPartialMapping = parser.GetBoolValue("AllowPartialMapping"),
- WatchStaticMappingsInSubdirectories = parser.GetBoolValue("WatchStaticMappingsInSubdirectories"),
- AdminUsername = parser.GetStringValue("AdminUsername"),
- AdminPassword = parser.GetStringValue("AdminPassword"),
- MaxRequestLogCount = parser.GetIntValue("MaxRequestLogCount"),
- RequestLogExpirationDuration = parser.GetIntValue("RequestLogExpirationDuration"),
- AllowCSharpCodeMatcher = parser.GetBoolValue("AllowCSharpCodeMatcher"),
- AllowBodyForAllHttpMethods = parser.GetBoolValue("AllowBodyForAllHttpMethods"),
- AllowOnlyDefinedHttpStatusCodeInResponse = parser.GetBoolValue("AllowOnlyDefinedHttpStatusCodeInResponse"),
- DisableJsonBodyParsing = parser.GetBoolValue("DisableJsonBodyParsing"),
- HandleRequestsSynchronously = parser.GetBoolValue("HandleRequestsSynchronously"),
- ThrowExceptionWhenMatcherFails = parser.GetBoolValue("ThrowExceptionWhenMatcherFails")
- };
-
- if (logger != null)
- {
- settings.Logger = logger;
- }
-
- if (parser.GetStringValue("WireMockLogger") == "WireMockConsoleLogger")
- {
- settings.Logger = new WireMockConsoleLogger();
- }
-
- if (parser.Contains("Port"))
- {
- settings.Port = parser.GetIntValue("Port");
- }
- else
- {
- settings.Urls = parser.GetValues("Urls", new[] { "http://*:9091/" });
- }
-
- string proxyUrl = parser.GetStringValue("ProxyURL") ?? parser.GetStringValue("ProxyUrl");
- if (!string.IsNullOrEmpty(proxyUrl))
- {
- settings.ProxyAndRecordSettings = new ProxyAndRecordSettings
- {
- Url = proxyUrl,
- SaveMapping = parser.GetBoolValue("SaveMapping"),
- SaveMappingToFile = parser.GetBoolValue("SaveMappingToFile"),
- SaveMappingForStatusCodePattern = parser.GetStringValue("SaveMappingForStatusCodePattern"),
- ClientX509Certificate2ThumbprintOrSubjectName = parser.GetStringValue("ClientX509Certificate2ThumbprintOrSubjectName"),
- ExcludedHeaders = parser.GetValues("ExcludedHeaders"),
- ExcludedCookies = parser.GetValues("ExcludedCookies"),
- AllowAutoRedirect = parser.GetBoolValue("AllowAutoRedirect")
- };
-
- string proxyAddress = parser.GetStringValue("WebProxyAddress");
- if (!string.IsNullOrEmpty(proxyAddress))
- {
- settings.ProxyAndRecordSettings.WebProxySettings = new WebProxySettings
- {
- Address = proxyAddress,
- UserName = parser.GetStringValue("WebProxyUserName"),
- Password = parser.GetStringValue("WebProxyPassword")
- };
- }
- }
-
- var certificateSettings = new WireMockCertificateSettings
- {
- X509StoreName = parser.GetStringValue("X509StoreName"),
- X509StoreLocation = parser.GetStringValue("X509StoreLocation"),
- X509StoreThumbprintOrSubjectName = parser.GetStringValue("X509StoreThumbprintOrSubjectName"),
- X509CertificateFilePath = parser.GetStringValue("X509CertificateFilePath"),
- X509CertificatePassword = parser.GetStringValue("X509CertificatePassword")
- };
- if (certificateSettings.IsDefined)
- {
- settings.CertificateSettings = certificateSettings;
- }
-
- return settings;
- }
- }
+using JetBrains.Annotations;
+using WireMock.Logging;
+using WireMock.Validation;
+
+namespace WireMock.Settings
+{
+ ///
+ /// A static helper class to parse commandline arguments into IWireMockServerSettings.
+ ///
+ public static class WireMockServerSettingsParser
+ {
+ ///
+ /// Parse commandline arguments into WireMockServerSettings.
+ ///
+ /// The commandline arguments
+ /// The logger (optional, can be null)
+ /// The parsed settings
+ [PublicAPI]
+ public static bool TryParseArguments([NotNull] string[] args, out IWireMockServerSettings settings, [CanBeNull] IWireMockLogger logger = null)
+ {
+ Check.HasNoNulls(args, nameof(args));
+
+ var parser = new SimpleCommandLineParser();
+ parser.Parse(args);
+
+ if (parser.GetBoolSwitchValue("help"))
+ {
+ logger.Info("See https://github.com/WireMock-Net/WireMock.Net/wiki/WireMock-commandline-parameters for details on all commandline options.");
+ settings = null;
+ return false;
+ }
+
+ settings = new WireMockServerSettings
+ {
+ StartAdminInterface = parser.GetBoolValue("StartAdminInterface", true),
+ ReadStaticMappings = parser.GetBoolValue("ReadStaticMappings"),
+ WatchStaticMappings = parser.GetBoolValue("WatchStaticMappings"),
+ AllowPartialMapping = parser.GetBoolValue("AllowPartialMapping"),
+ WatchStaticMappingsInSubdirectories = parser.GetBoolValue("WatchStaticMappingsInSubdirectories"),
+ AdminUsername = parser.GetStringValue("AdminUsername"),
+ AdminPassword = parser.GetStringValue("AdminPassword"),
+ MaxRequestLogCount = parser.GetIntValue("MaxRequestLogCount"),
+ RequestLogExpirationDuration = parser.GetIntValue("RequestLogExpirationDuration"),
+ AllowCSharpCodeMatcher = parser.GetBoolValue("AllowCSharpCodeMatcher"),
+ AllowBodyForAllHttpMethods = parser.GetBoolValue("AllowBodyForAllHttpMethods"),
+ AllowOnlyDefinedHttpStatusCodeInResponse = parser.GetBoolValue("AllowOnlyDefinedHttpStatusCodeInResponse"),
+ DisableJsonBodyParsing = parser.GetBoolValue("DisableJsonBodyParsing"),
+ HandleRequestsSynchronously = parser.GetBoolValue("HandleRequestsSynchronously"),
+ ThrowExceptionWhenMatcherFails = parser.GetBoolValue("ThrowExceptionWhenMatcherFails")
+ };
+
+ if (logger != null)
+ {
+ settings.Logger = logger;
+ }
+
+ if (parser.GetStringValue("WireMockLogger") == "WireMockConsoleLogger")
+ {
+ settings.Logger = new WireMockConsoleLogger();
+ }
+
+ if (parser.Contains("Port"))
+ {
+ settings.Port = parser.GetIntValue("Port");
+ }
+ else
+ {
+ settings.Urls = parser.GetValues("Urls", new[] { "http://*:9091/" });
+ }
+
+ string proxyUrl = parser.GetStringValue("ProxyURL") ?? parser.GetStringValue("ProxyUrl");
+ if (!string.IsNullOrEmpty(proxyUrl))
+ {
+ settings.ProxyAndRecordSettings = new ProxyAndRecordSettings
+ {
+ Url = proxyUrl,
+ SaveMapping = parser.GetBoolValue("SaveMapping"),
+ SaveMappingToFile = parser.GetBoolValue("SaveMappingToFile"),
+ SaveMappingForStatusCodePattern = parser.GetStringValue("SaveMappingForStatusCodePattern"),
+ ClientX509Certificate2ThumbprintOrSubjectName = parser.GetStringValue("ClientX509Certificate2ThumbprintOrSubjectName"),
+ ExcludedHeaders = parser.GetValues("ExcludedHeaders"),
+ ExcludedCookies = parser.GetValues("ExcludedCookies"),
+ AllowAutoRedirect = parser.GetBoolValue("AllowAutoRedirect")
+ };
+
+ string proxyAddress = parser.GetStringValue("WebProxyAddress");
+ if (!string.IsNullOrEmpty(proxyAddress))
+ {
+ settings.ProxyAndRecordSettings.WebProxySettings = new WebProxySettings
+ {
+ Address = proxyAddress,
+ UserName = parser.GetStringValue("WebProxyUserName"),
+ Password = parser.GetStringValue("WebProxyPassword")
+ };
+ }
+ }
+
+ var certificateSettings = new WireMockCertificateSettings
+ {
+ X509StoreName = parser.GetStringValue("X509StoreName"),
+ X509StoreLocation = parser.GetStringValue("X509StoreLocation"),
+ X509StoreThumbprintOrSubjectName = parser.GetStringValue("X509StoreThumbprintOrSubjectName"),
+ X509CertificateFilePath = parser.GetStringValue("X509CertificateFilePath"),
+ X509CertificatePassword = parser.GetStringValue("X509CertificatePassword")
+ };
+ if (certificateSettings.IsDefined)
+ {
+ settings.CertificateSettings = certificateSettings;
+ }
+
+ return true;
+ }
+ }
}
\ No newline at end of file
diff --git a/src/dotnet-WireMock.Net/Program.cs b/src/dotnet-WireMock.Net/Program.cs
new file mode 100644
index 000000000..a4e742d54
--- /dev/null
+++ b/src/dotnet-WireMock.Net/Program.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
+using WireMock.Net.StandAlone;
+using WireMock.Server;
+
+namespace WireMock
+{
+ public class Program
+ {
+ private static int SleepTime = 30000;
+ private static readonly ILogger Logger = LoggerFactory.Create(o =>
+ {
+ o.SetMinimumLevel(LogLevel.Debug);
+ o.AddSimpleConsole(options =>
+ {
+ options.IncludeScopes = true;
+ options.SingleLine = false;
+ options.TimestampFormat = "yyyy-MM-ddTHH:mm:ss ";
+ });
+ }).CreateLogger(string.Empty);
+
+ private static WireMockServer Server;
+
+ static async Task Main(string[] args)
+ {
+ if (!StandAloneApp.TryStart(args, out Server, new WireMockLogger(Logger)))
+ {
+ return;
+ }
+
+ Logger.LogInformation("Press Ctrl+C to shut down");
+
+ Console.CancelKeyPress += (s, e) =>
+ {
+ Stop("CancelKeyPress");
+ };
+
+ System.Runtime.Loader.AssemblyLoadContext.Default.Unloading += ctx =>
+ {
+ Stop("AssemblyLoadContext.Default.Unloading");
+ };
+
+ while (true)
+ {
+ Logger.LogInformation("WireMock.Net server running : {IsStarted}", Server.IsStarted);
+ await Task.Delay(SleepTime);
+ }
+ }
+
+ private static void Stop(string why)
+ {
+ Logger.LogInformation("WireMock.Net server stopping because '{why}'", why);
+ Server.Stop();
+ Logger.LogInformation("WireMock.Net server stopped");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/dotnet-WireMock.Net/Properties/launchSettings.json b/src/dotnet-WireMock.Net/Properties/launchSettings.json
new file mode 100644
index 000000000..e2222cce5
--- /dev/null
+++ b/src/dotnet-WireMock.Net/Properties/launchSettings.json
@@ -0,0 +1,8 @@
+{
+ "profiles": {
+ "dotnet-WireMock.Net": {
+ "commandName": "Project",
+ "commandLineArgs": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/dotnet-WireMock.Net/WireMockLogger.cs b/src/dotnet-WireMock.Net/WireMockLogger.cs
new file mode 100644
index 000000000..b765a424c
--- /dev/null
+++ b/src/dotnet-WireMock.Net/WireMockLogger.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Text.Json;
+using Microsoft.Extensions.Logging;
+using WireMock.Admin.Requests;
+using WireMock.Logging;
+
+namespace WireMock
+{
+ public class WireMockLogger : IWireMockLogger
+ {
+ private readonly JsonSerializerOptions options = new JsonSerializerOptions
+ {
+ WriteIndented = true
+ };
+
+ private readonly ILogger _logger;
+
+ public WireMockLogger(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ ///
+ public void Debug(string formatString, params object[] args)
+ {
+ _logger.LogDebug(formatString, args);
+ }
+
+ ///
+ public void Info(string formatString, params object[] args)
+ {
+ _logger.LogInformation(formatString, args);
+ }
+
+ ///
+ public void Warn(string formatString, params object[] args)
+ {
+ _logger.LogWarning(formatString, args);
+ }
+
+ ///
+ public void Error(string formatString, params object[] args)
+ {
+ _logger.LogError(formatString, args);
+ }
+
+ ///
+ public void Error(string formatString, Exception exception)
+ {
+ _logger.LogError(formatString, exception);
+ }
+
+ ///
+ public void DebugRequestResponse(LogEntryModel logEntryModel, bool isAdminRequest)
+ {
+ string message = JsonSerializer.Serialize(logEntryModel, options);
+
+ _logger.LogDebug("Admin[{IsAdmin}] {Message}", isAdminRequest, message);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/dotnet-WireMock.Net/dotnet-WireMock.csproj b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj
new file mode 100644
index 000000000..69b3e3fcb
--- /dev/null
+++ b/src/dotnet-WireMock.Net/dotnet-WireMock.csproj
@@ -0,0 +1,27 @@
+
+
+
+ Exe
+ net5
+ true
+ dotnet-wiremock
+ A dotnet commandline tool for WireMock.Net (A Lightweight Http Mocking Server for .NET)
+ tdd;mock;http;wiremock;test;server;unittest;dotnet;tool;dotnet-tool
+ MIT
+ Stef Heyenrath
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file