private static void Main() { OutputTitle(); InitLogger(); var exit = CreateExitEvent(); var baseUrl = $"http://{Config.Domain}:{Config.Port}"; var nano = new NanoConfiguration { ApplicationName = "MiniWebServer", EnableVerboseErrors = true }; // logging nano.GlobalEventHandler.PostInvokeHandlers.Add(context => { var level = context.Response.HttpStatusCode == 200 ? LogEventLevel.Information : LogEventLevel.Warning; var address = context.Request.Url.ToString().Replace(baseUrl, "/").Replace("//", "/"); var statusName = Enum.GetName(typeof(Constants.HttpStatusCode), context.Response.HttpStatusCode); Log.Write(level, "{address} => {HttpStatusCode} {statusName}", address, context.Response.HttpStatusCode, statusName); }); nano.GlobalEventHandler.UnhandledExceptionHandlers.Add((exception, context) => { var address = context.Request.Url.ToString().Replace(baseUrl, "/").Replace("//", "/"); Log.Error(exception, "{address} => Exception: {Message}", address, exception.Message); }); // pulse var startTime = DateTime.Now; nano.AddBackgroundTask("Uptime", (int)TimeSpan.FromMinutes(1).TotalMilliseconds, () => { var uptime = DateTime.Now - startTime; Log.Information("Uptime {uptime}", uptime); return(uptime); }); // hosting HttpHost.Init(nano, Config.WebRoot); ApiHost.Init(nano, Config.WebRoot); nano.DisableCorrelationId(); nano.EnableCors(); // start server using (var server = HttpListenerNanoServer.Start(nano, baseUrl)) { Log.Information("Listening on {url}", baseUrl); Log.Information("Press Ctrl+C to exit."); Process.Start(File.Exists($"{Environment.CurrentDirectory}\\index.html") ? baseUrl : $"{baseUrl}/ApiExplorer"); exit.WaitOne(); } }
public WebServer(IAppSettings appSettings) { var port = GetUnusedPort(); baseUrl = $"http://localhost:{port}"; nano = new NanoConfiguration { ApplicationName = "Turbine", EnableVerboseErrors = appSettings.Verbose, }; // logging if (appSettings.Verbose) { nano.GlobalEventHandler.PostInvokeHandlers.Add(context => { var address = context.Request.Url.ToString().Replace(baseUrl, "/").Replace("//", "/"); var statusName = Enum.GetName(typeof(Constants.HttpStatusCode), context.Response.HttpStatusCode); Colorizer.WriteLine($"WebServer: [DarkYellow!{address} => {context.Response.HttpStatusCode} {statusName}]"); }); } nano.GlobalEventHandler.UnhandledExceptionHandlers.Add((exception, context) => { var address = context.Request.Url.ToString().Replace(baseUrl, "/").Replace("//", "/"); Colorizer.WriteLine($"WebServer: [DarkRed!{address} => Exception: {exception.Message}]"); }); // pulse var startTime = DateTime.Now; if (appSettings.Verbose) { nano.AddBackgroundTask("Uptime", (int)TimeSpan.FromMinutes(1).TotalMilliseconds, () => { var uptime = DateTime.Now - startTime; Colorizer.WriteLine($"WebServer: [DarkYellow!Uptime {uptime}]"); return(uptime); }); } // hosting nano.AddDirectory("/", appSettings.Output, returnHttp404WhenFileWasNotFound: true); nano.DisableCorrelationId(); nano.EnableCors(); }