play nice to allow for embedding into other host processes e.g. tests

This commit is contained in:
Michael Becker 2025-01-05 23:39:00 -05:00
parent e6b974f651
commit 19d4876834

View File

@ -8,6 +8,8 @@ namespace MBS.Web;
public abstract class WebApplication : Application
{
protected abstract int DefaultPort { get; }
public int Port { get { return WebServer.EndPoint.Port; } }
public WebServer WebServer { get; private set; }
public string VirtualBasePath { get; set; } = "/";
@ -40,20 +42,39 @@ public abstract class WebApplication : Application
return new WebServer(new IPEndPoint(IPAddress.Any, DefaultPort));
}
private bool shuttingDown = false;
protected override void StopInternal(int exitCode = 0)
{
shuttingDown = true;
if (!SupportEmbeddedHosting)
{
// we do not want to System.Environment.Exit() here
// if we are hosted in another process (e.g. for tests)
base.StopInternal(exitCode);
}
}
public bool SupportEmbeddedHosting { get; set; } = false;
protected override void OnStartup(EventArgs e)
{
base.OnStartup(e);
WebServer server = CreateWebServer();
WebServer = CreateWebServer();
Console.WriteLine("attempting to start server listening on port {0}", DefaultPort);
OnServerCreated(new WebServerCreatedEventArgs(server));
server.ProcessRequest += server_OnProcessRequest;
server.Start();
OnServerCreated(new WebServerCreatedEventArgs(WebServer));
WebServer.ProcessRequest += server_OnProcessRequest;
WebServer.Start();
while (true)
if (!SupportEmbeddedHosting)
{
Thread.Sleep(50);
while (!shuttingDown)
{
Thread.Sleep(50);
}
WebServer.Stop();
}
}