Exemple #1
0
        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();
        }