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();
            }
        }
Exemple #2
0
        public static void Start( HttpApplication httpApplication )
        {
            var config = new NanoConfiguration();

            config.GlobalEventHandler.PreInvokeHandlers.Add( context =>
            {
            } );

            config.GlobalEventHandler.UnhandledExceptionHandlers.Add((exception, context) =>
            {
            });

            var eventHandler = new EventHandler();
            eventHandler.PreInvokeHandlers.Add( context =>
            {
            } );

            eventHandler.PostInvokeHandlers.Add( context =>
            {
            } );

            eventHandler.UnhandledExceptionHandlers.Add( ( exception, context ) =>
            {
            } );

            config.AddMethods<Customer>(); // methods will be added under '/api/customer/'
            config.AddMethods<Customer2>();

            config.AddFile( "/home", @"\www\home\index.html" );

            config.AddFunc( "/hi", x => "Hello World! " + x.Request.Url );
            
            config.AddFunc( "/howdy", x =>
            {
                var model = x.Bind<Person>( "person" ); // Looks for a complex request parameter named 'person' to bind to a 'Person' class
                return model;
            } );

            config.EnableCors();
            
            config.AddFunc( "/probe", context => true );
            config.AddFunc( "/monitoring/probe", context => true );
            
            config.AddDirectory( "/", @"\www\" );

            SystemWebNanoServer.Start( httpApplication, config );
        }
        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();
        }
Exemple #4
0
        public static void Start(HttpApplication httpApplication)
        {
            var config = new NanoConfiguration();

            config.GlobalEventHandler.PreInvokeHandlers.Add(context =>
            {
            });

            var eventHandler = new EventHandler();

            eventHandler.PreInvokeHandlers.Add(context =>
            {
            });

            eventHandler.PostInvokeHandlers.Add(context =>
            {
            });

            eventHandler.UnhandledExceptionHandlers.Add((exception, context) =>
            {
            });

            config.AddMethods <Customer>(); // methods will be added under '/api/customer/'

            config.AddFile("/home", @"\www\home\index.html");

            config.AddFunc("/hi", x => "Hello World! " + x.Request.Url);

            config.AddFunc("/howdy", x =>
            {
                var model = x.Bind <Person>("person");
                return(model);
            });

            config.EnableCors();

            config.AddFunc("/probe", context => true);
            config.AddFunc("/monitoring/probe", context => true);

            config.AddDirectory("/", @"\www\");

            SystemWebNanoServer.Start(httpApplication, config);
        }
Exemple #5
0
        /// <summary>
        /// Gets the <see cref="NanoConfiguration"/> used by all of the demo projects.
        /// </summary>
        /// <returns><see cref="NanoConfiguration"/> instance.</returns>
        public static NanoConfiguration GetNanoConfiguration()
        {
            DateTime startupDateTime = DateTime.Now;
            int      requestCounter  = 0;
            int      errorCounter    = 0;

            // Every Nano app begins with the creation of an instance of a NanoConfiguration.
            // This is *the* entry point into Nano and how all of Nano is configured.
            var config = new NanoConfiguration();

            config.GlobalEventHandler.UnhandledExceptionHandlers.Add((exception, context) =>
            {
                // Log your exception here, etc.

                Interlocked.Increment(ref errorCounter);
            });

            config.GlobalEventHandler.PreInvokeHandlers.Add(context =>
            {
                // Do stuff before an API method is called or file is accessed.
                // Examples: Logging requests, authentication, authorization, adding headers, starting timers, etc.

                Interlocked.Increment(ref requestCounter);
            });

            config.GlobalEventHandler.PostInvokeHandlers.Add(context =>
            {
                // Do stuff after an API method is called or file has been accessed.
                // Examples: Logging responses, writing cookies, adding headers, ending timers, etc.
            });

            // Serves up all methods in the Customer class under the URL: /api/customer/methodName
            config.AddMethods <Customer>();

            config.AddMethods <ComplexObject>();

            // We can also create event handlers that are not global.
            // This can be useful when certain APIs do or do not need logging, authentication, etc.
            var eventHandler = new Nano.Web.Core.EventHandler();

            // Let's add a custom header as a demonstration.
            eventHandler.PreInvokeHandlers.Add(context =>
            {
                context.Response.HeaderParameters.Add("X-Server-HostName", Dns.GetHostName());
            });

            // Add all static methods in the Time class as well as use custom event handler
            config.AddMethods <Time>(eventHandler: eventHandler);

            // Handles all requests for URL: /hi
            config.AddFunc("/hi", context => "Hello World!");

            // Handles all requests for URL: /howdy
            // Example: http://localhost:4545/howdy?person={"PersonId":1,"FirstName":"Clark","LastName":"Kent"}
            config.AddFunc("/howdy", x =>
            {
                // Looks for a complex request parameter named 'person' to bind to a 'Person' class
                var model = x.Bind <Customer.Person>("person");
                return(model);
            });

            // Example of how to serve up a single file. It's much easier to map an entire directory though.
            config.AddFile("/MultipartTester", @"\www\MultipartTester\index.html");

            // When the Debugger is attached, map two folders up so that you can live edit files in Visual Studio
            // without having to restart your application to get the files copied to your bin directory.
            config.AddDirectory("/", Debugger.IsAttached ? "../../www" : "www", returnHttp404WhenFileWasNotFound: true);

            // Enables CORS ( Cross-origin resource sharing ) requests
            config.EnableCors();

            // Configures a background task to run every 30 seconds that outputs some server stats like uptime and
            // the number of processed requests and errors encountered.
            config.AddBackgroundTask("Status Update", 30000, () =>
            {
                var result = string.Format("Uptime {0:dd\\.hh\\:mm\\:ss} | Requests Handled: {1} | Errors: {2}",
                                           DateTime.Now - startupDateTime, requestCounter, errorCounter);

                Console.WriteLine(result);
                return(result);
            });

            return(config);
        }
        /// <summary>
        /// Gets the <see cref="NanoConfiguration"/> used by all of the demo projects.
        /// </summary>
        /// <returns><see cref="NanoConfiguration"/> instance.</returns>
        public static NanoConfiguration GetNanoConfiguration()
        {
            DateTime startupDateTime = DateTime.Now;
            int requestCounter = 0;
            int errorCounter = 0;

            // Every Nano app begins with the creation of an instance of a NanoConfiguration.
            // This is *the* entry point into Nano and how all of Nano is configured.
            var config = new NanoConfiguration();

            config.GlobalEventHandler.UnhandledExceptionHandlers.Add((exception, context) =>
            {
                // Log your exception here, etc.

                Interlocked.Increment(ref errorCounter);
            });

            config.GlobalEventHandler.PreInvokeHandlers.Add(context =>
            {
                // Do stuff before an API method is called or file is accessed.
                // Examples: Logging requests, authentication, authorization, adding headers, starting timers, etc.

                Interlocked.Increment(ref requestCounter);
            });

            config.GlobalEventHandler.PostInvokeHandlers.Add(context =>
            {
                // Do stuff after an API method is called or file has been accessed.
                // Examples: Logging responses, writing cookies, adding headers, ending timers, etc.
            });

            // Serves up all methods in the Customer class under the URL: /api/customer/methodName
            config.AddMethods<Customer>();

            // We can also create event handlers that are not global.
            // This can be useful when certain APIs do or do not need logging, authentication, etc.
            var eventHandler = new Nano.Web.Core.EventHandler();

            // Let's add a custom header as a demonstration.
            eventHandler.PreInvokeHandlers.Add( context =>
            {
                context.Response.HeaderParameters.Add( "X-Server-HostName", Dns.GetHostName() );
            });

            // Add all static methods in the Time class as well as use custom event handler
            config.AddMethods<Time>( eventHandler: eventHandler );

            // Handles all requests for URL: /hi
            config.AddFunc("/hi", context => "Hello World!");

            // Handles all requests for URL: /howdy
            // Example: http://localhost:4545/howdy?person={"PersonId":1,"FirstName":"Clark","LastName":"Kent"}
            config.AddFunc("/howdy", x =>
            {
                // Looks for a complex request parameter named 'person' to bind to a 'Person' class
                var model = x.Bind<Customer.Person>("person");
                return model;
            });

            // Example of how to serve up a single file. It's much easier to map an entire directory though.
            config.AddFile( "/MultipartTester", @"\www\MultipartTester\index.html" );

            // When the Debugger is attached, map two folders up so that you can live edit files in Visual Studio
            // without having to restart your application to get the files copied to your bin directory.
            config.AddDirectory("/", Debugger.IsAttached ? "../../www" : "www", returnHttp404WhenFileWasNotFound: true);

            // Enables CORS ( Cross-origin resource sharing ) requests
            config.EnableCors();

            // Configures a background task to run every 30 seconds that outputs some server stats like uptime and
            // the number of processed requests and errors encountered.
            config.AddBackgroundTask("Status Update", 30000, () =>
            {
                var result = string.Format("Uptime {0:dd\\.hh\\:mm\\:ss} | Requests Handled: {1} | Errors: {2}",
                    DateTime.Now - startupDateTime, requestCounter, errorCounter);

                Console.WriteLine(result);
                return result;
            });

            return config;
        }