Пример #1
0
        private static void Main( string[] args )
        {
            const string url = "http://localhost:4545";

            var exitEvent = new ManualResetEvent( false );

            Console.CancelKeyPress += ( sender, eventArgs ) =>
            {
                eventArgs.Cancel = true;
                exitEvent.Set();
            };

            var config = new NanoConfiguration();
            config.AddDirectory( "/", "www", null, true );
            config.AddMethods<Customer>( "/api/customer/" );
            config.AddFunc( "/hi", context => "Hello World!" );

            config.AddBackgroundTask( "Test", 30000, () =>
            {
                string result = "Hi, the time is now: " + DateTime.Now;
                Console.WriteLine( result );
                return result;
            } );

            using ( HttpListenerNanoServer.Start( config, url ) )
            {
                if ( Debugger.IsAttached )
                    Process.Start( url + "/ApiExplorer/" );

                Console.WriteLine( "Nano Server is running on: " + url );
                Console.WriteLine( "Press Ctrl+C to exit." );
                exitEvent.WaitOne();
            }
        }
Пример #2
0
        public void SimpleSpeedTest(int requestCount)
        {
            ServicePointManager.UseNagleAlgorithm      = false;
            ServicePointManager.DefaultConnectionLimit = int.MaxValue;

            var nanoConfiguration = new NanoConfiguration();

            //nanoConfiguration.AddDirectory( "/", "www" );
            nanoConfiguration.AddFile("/", "www\\index.html");

            using (HttpListenerNanoServer.Start(nanoConfiguration, "http://localhost:4545"))
            {
                var stopwatch = Stopwatch.StartNew();

                Parallel.For(0, requestCount, i =>
                {
                    using (var client = new WebClient())
                    {
                        byte[] responsebytes = client.DownloadData("http://localhost:4545/");
                        string responsebody  = Encoding.UTF8.GetString(responsebytes);
                        if (requestCount == 1)
                        {
                            Trace.WriteLine(responsebody);
                        }
                    }
                });

                var elapsedTime = stopwatch.Elapsed;
                Trace.WriteLine(string.Format("{0} requests completed in {1}", requestCount, elapsedTime.GetFormattedTime()));
                var averageRequestTimeInMilliseconds = elapsedTime.TotalMilliseconds / requestCount;
                var averageRequestTimeSpan           = TimeSpan.FromTicks((long)(TimeSpan.TicksPerMillisecond * averageRequestTimeInMilliseconds));
                Trace.WriteLine(string.Format("Average request time: {0}", averageRequestTimeSpan.GetFormattedTime()));
            }
        }
Пример #3
0
        /// <summary>
        /// Creates an <see cref="HttpListenerNanoServer"/> with defaults to help write small unit tests.
        /// </summary>
        /// <returns></returns>
        public static HttpListenerNanoServer Start()
        {
            var          nanoConfiguration = new NanoConfiguration();
            const string url = "http://localhost:4545/";

            return(HttpListenerNanoServer.Start(nanoConfiguration, url));
        }
Пример #4
0
        public void SimpleSpeedTest( int requestCount )
        {
            ServicePointManager.UseNagleAlgorithm = false;
            ServicePointManager.DefaultConnectionLimit = int.MaxValue;

            var nanoConfiguration = new NanoConfiguration();
            //nanoConfiguration.AddDirectory( "/", "www" );
            nanoConfiguration.AddFile( "/", "www\\index.html" );

            using( HttpListenerNanoServer.Start( nanoConfiguration, "http://localhost:4545" ) )
            {
                var stopwatch = Stopwatch.StartNew();

                Parallel.For( 0, requestCount, i =>
                {
                    using( var client = new WebClient() )
                    {
                        byte[] responsebytes = client.DownloadData( "http://localhost:4545/" );
                        string responsebody = Encoding.UTF8.GetString( responsebytes );
                        if( requestCount == 1 ) Trace.WriteLine( responsebody );
                    }
                } );

                var elapsedTime = stopwatch.Elapsed;
                Trace.WriteLine( string.Format( "{0} requests completed in {1}", requestCount, elapsedTime.GetFormattedTime() ) );
                var averageRequestTimeInMilliseconds = elapsedTime.TotalMilliseconds / requestCount;
                var averageRequestTimeSpan = TimeSpan.FromTicks( (long)( TimeSpan.TicksPerMillisecond * averageRequestTimeInMilliseconds ) );
                Trace.WriteLine( string.Format( "Average request time: {0}", averageRequestTimeSpan.GetFormattedTime() ) );
            }
        }
Пример #5
0
        public static void Init(NanoConfiguration config, string webRoot)
        {
            InitApiExplorer(webRoot);

            var apiPath = $"{webRoot}\\Api";

            if (!Directory.Exists(apiPath))
            {
                return;
            }

            var source   = Directory.GetFiles(apiPath, "*.cs");
            var assembly = Compile(source);

            if (assembly == null)
            {
                return;
            }

            foreach (var module in assembly.GetModules())
            {
                foreach (var type in module.GetTypes())
                {
                    config.AddMethods(type);
                    Log.Information("API: {0}", type.Name);
                    foreach (var method in type.GetMethods().TakeWhile(x => x.IsPublic && x.IsStatic))
                    {
                        Log.Information("  /api/{0}/{1}", type.Name, method.Name);
                    }
                }
            }
        }
Пример #6
0
        public void SimpleSpeedTest( int requestCount )
        {
            ServicePointManager.UseNagleAlgorithm = false;
            ServicePointManager.DefaultConnectionLimit = int.MaxValue;

            var nanoConfiguration = new NanoConfiguration();
            nanoConfiguration.AddMethods<Customer>();

            using( HttpListenerNanoServer.Start( nanoConfiguration, "http://localhost:4545" ) )
            {
                var parameters = new NameValueCollection { { "firstName", "Clark" }, { "lastName", "Kent" } };
                var stopwatch = Stopwatch.StartNew();

                Parallel.For( 0, requestCount, i =>
                {
                    using( var client = new WebClient() )
                    {
                        byte[] responsebytes = client.UploadValues( "http://localhost:4545/api/Customer/CreateCustomer", "POST", parameters );
                        string responsebody = Encoding.UTF8.GetString( responsebytes );
                        if( requestCount == 1 ) Trace.WriteLine( responsebody );
                    }
                } );

                var elapsedTime = stopwatch.Elapsed;
                Trace.WriteLine( string.Format( "{0} requests completed in {1}", requestCount, elapsedTime.GetFormattedTime() ) );
                var averageRequestTimeInMilliseconds = elapsedTime.TotalMilliseconds / requestCount;
                var averageRequestTimeSpan = TimeSpan.FromTicks( (long)( TimeSpan.TicksPerMillisecond * averageRequestTimeInMilliseconds ) );
                Trace.WriteLine( string.Format( "Average request time: {0}", averageRequestTimeSpan.GetFormattedTime() ) );
            }
        }
Пример #7
0
        public static void Start(string url)
        {
            var nanoConfiguration = new NanoConfiguration();

            nanoConfiguration.AddMethods <Beatles>();

            using (HttpListenerNanoServer.Start(nanoConfiguration, url))
            {
            }
        }
Пример #8
0
        public static void Start(string url)
        {
            var nanoConfiguration = new NanoConfiguration();
            nanoConfiguration.AddMethods<Beatles>();

            using(HttpListenerNanoServer.Start(nanoConfiguration, url))
            {

            }
        }
Пример #9
0
        /// <summary>
        /// Creates an <see cref="HttpListenerNanoServer"/> with defaults to help write small unit tests.
        /// </summary>
        /// <returns></returns>
        public static HttpListenerNanoServer Start()
        {
            var nanoConfiguration = new NanoConfiguration();

            (( JsonNetSerializer )nanoConfiguration.SerializationService).JsonSerializerSettings.Formatting = Formatting.None;
            const string url    = "http://localhost:4545/";
            var          server = HttpListenerNanoServer.Start(nanoConfiguration, url);

            return(server);
        }
Пример #10
0
        public void Test_Proxy_Generated_Code()
        {
            var config = new NanoConfiguration();

            config.AddMethods <Customer>("/api/customer/");

            using (HttpListenerNanoServer.Start(config, ApiProxy.BaseApiUrl))
            {
                Trace.WriteLine("CreateCustomer");
                var createCustomerResponse = ApiProxy.CreateCustomer("Clark", "Kent");
                Trace.WriteLine(JsonConvert.SerializeObject(createCustomerResponse));
                Assert.That(createCustomerResponse.FirstName == "Clark" && createCustomerResponse.LastName == "Kent");
                Trace.WriteLine("");

                Trace.WriteLine("GetPerson");
                var getPersonResponse = ApiProxy.GetPerson(123);
                Trace.WriteLine(JsonConvert.SerializeObject(getPersonResponse));
                Assert.That(getPersonResponse.FirstName == "Clark" && getPersonResponse.LastName == "Kent" && getPersonResponse.Addresses.Count == 2);
                Trace.WriteLine("");

                Trace.WriteLine("GetCustomer");
                dynamic getCustomerResponse     = ApiProxy.GetCustomer(123);
                string  getCustomerResponseJson = JsonConvert.SerializeObject(getCustomerResponse);
                Trace.WriteLine(getCustomerResponseJson);
                Assert.That(getCustomerResponse.FirstName == "Clark" && getCustomerResponse.LastName == "Kent");
                Trace.WriteLine("");

                Trace.WriteLine("GetContext");
                dynamic getContextResponse     = ApiProxy.GetContext();
                string  getContextResponseJson = JsonConvert.SerializeObject(getContextResponse);
                Trace.WriteLine(getContextResponseJson);
                Assert.That(getContextResponse.Url != null && getContextResponse.HttpMethod == "POST");
                Trace.WriteLine("");

                Trace.WriteLine("GetCorrelationId");
                var    correlationId            = Guid.NewGuid().ToString();
                string getCorrelationIdResponse = ApiProxy.GetCorrelationId(correlationId);
                Trace.WriteLine(getCorrelationIdResponse);
                Assert.That(correlationId == getCorrelationIdResponse);
                Trace.WriteLine("");

                Trace.WriteLine("CreatePendingCustomer");
                var createPendingCustomerResponse = ApiProxy.CreatePendingCustomer("Clark", "Kent");
                Trace.WriteLine(JsonConvert.SerializeObject(createPendingCustomerResponse));
                Assert.That(createPendingCustomerResponse.FirstName == "Clark" && createPendingCustomerResponse.LastName == "Kent");
                Trace.WriteLine("");

                Trace.WriteLine("CreateDynamicCustomer");
                dynamic createDynamicCustomerResponse     = ApiProxy.CreateDynamicCustomer(new { CustomerId = 1, FirstName = "Clark", LastName = "Kent" });
                string  createDynamicCustomerResponseJson = JsonConvert.SerializeObject(createDynamicCustomerResponse);
                Trace.WriteLine(createDynamicCustomerResponseJson);
                Assert.That(createDynamicCustomerResponse.FirstName == "Clark" && createDynamicCustomerResponse.LastName == "Kent");
                Trace.WriteLine("");
            }
        }
Пример #11
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();
            }
        }
Пример #12
0
        public void Can_Handle_Void_Methods()
        {
            // Arrange
            var config = new NanoConfiguration();

            config.AddMethods <Customer2>();

            using (HttpListenerNanoServer.Start(config, ApiProxy.Configuration.BaseApiUrl))
            {
                // Act and Assert
                ApiProxy.Customer2.DoNothing(); // Just ensure we don't blow up
            }
        }
Пример #13
0
            public void Start(string urls)
            {
                var validatedUrls = ValidateUrls(urls);

                var config = new NanoConfiguration();

                // 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);
                config.AddMethods <Customer>("/api/customer/");
                config.AddFunc("/hi", context => "Hello World!");

                config.GlobalEventHandler.UnhandledExceptionHandlers.Add((exception, context) =>
                {
                    try
                    {
                        if (!EventLog.SourceExists(_applicationName))
                        {
                            EventLog.CreateEventSource(_applicationName, "Application");
                        }

                        var msg = new StringBuilder()
                                  .AppendLine("Nano Error:")
                                  .AppendLine("-----------").AppendLine()
                                  .AppendLine("URL: " + context.Request.Url).AppendLine()
                                  .AppendLine("Message: " + exception.Message).AppendLine()
                                  .AppendLine("StackTrace:")
                                  .AppendLine(exception.StackTrace)
                                  .ToString();

                        EventLog.WriteEntry(_applicationName, msg, EventLogEntryType.Error);
                    }
                    catch (Exception)
                    {
                        // Gulp: Never throw an exception in the unhandled exception handler
                    }
                });

                _server = HttpListenerNanoServer.Start(config, validatedUrls);
                _server.HttpListenerConfiguration.ApplicationPath = "YourOptionalVirtualAppPathName";

                if (Debugger.IsAttached)
                {
                    Process.Start(_server.HttpListenerConfiguration.GetFirstUrlBeingListenedOn().TrimEnd('/') + "/ApiExplorer");
                }

                Console.WriteLine("Nano Server is running on: " + _server.HttpListenerConfiguration.GetFirstUrlBeingListenedOn());
            }
Пример #14
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 );
        }
Пример #15
0
        public void DoItToIt()
        {
            var nanoConfiguration = new NanoConfiguration();
            nanoConfiguration.AddMethods<Customer>();

            using( HttpListenerNanoServer.Start( nanoConfiguration, "http://localhost:4545" ) )
            {
                var parameters = new NameValueCollection { { "customerNbr", "1" } };

                using( var client = new WebClient() )
                {
                    byte[] responsebytes = client.UploadValues( "http://localhost:4545/api/Customer/GetCustomer", "POST", parameters );
                    string responsebody = Encoding.UTF8.GetString( responsebytes );
                    Trace.WriteLine( responsebody );
                }
            }
        }
        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();
        }
Пример #17
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);
        }
Пример #18
0
            public void Start( string urls )
            {
                var validatedUrls = ValidateUrls( urls );

                var config = new NanoConfiguration();

                config.AddDirectory( "/", "www", null, true );
                config.AddMethods<Customer>( "/api/customer/" );
                config.AddFunc( "/hi", context => "Hello World!" );

                config.GlobalEventHandler.UnhandledExceptionHandlers.Add( ( exception, context ) =>
                {
                    try
                    {
                        if ( !EventLog.SourceExists( _applicationName ) )
                            EventLog.CreateEventSource( _applicationName, "Application" );

                        var msg = new StringBuilder()
                            .AppendLine( "Nano Error:" )
                            .AppendLine( "-----------" ).AppendLine()
                            .AppendLine( "URL: " + context.Request.Url ).AppendLine()
                            .AppendLine( "Message: " + exception.Message ).AppendLine()
                            .AppendLine( "StackTrace:" )
                            .AppendLine( exception.StackTrace )
                            .ToString();

                        EventLog.WriteEntry( _applicationName, msg, EventLogEntryType.Error );
                    }
                    catch ( Exception )
                    {
                        // Gulp: Never throw an exception in the unhandled exception handler
                    }
                } );

                _server = HttpListenerNanoServer.Start( config, validatedUrls );
                _server.HttpListenerConfiguration.ApplicationPath = "YourOptionalVirtualAppPathName";

                if( Debugger.IsAttached )
                    Process.Start( _server.HttpListenerConfiguration.GetFirstUrlBeingListenedOn().TrimEnd( '/' ) + "/ApiExplorer" );

                Console.WriteLine( "Nano Server is running on: " + _server.HttpListenerConfiguration.GetFirstUrlBeingListenedOn() );
            }
Пример #19
0
        public void DoItToIt()
        {
            var nanoConfiguration = new NanoConfiguration();

            nanoConfiguration.AddMethods <Customer>();

            using (HttpListenerNanoServer.Start(nanoConfiguration, "http://localhost:4545"))
            {
                var parameters = new NameValueCollection {
                    { "customerNbr", "1" }
                };

                using (var client = new WebClient())
                {
                    byte[] responsebytes = client.UploadValues("http://localhost:4545/api/Customer/GetCustomer", "POST", parameters);
                    string responsebody  = Encoding.UTF8.GetString(responsebytes);
                    Trace.WriteLine(responsebody);
                }
            }
        }
Пример #20
0
        public void SimpleSpeedTest(int requestCount)
        {
            ServicePointManager.UseNagleAlgorithm      = false;
            ServicePointManager.DefaultConnectionLimit = int.MaxValue;

            var nanoConfiguration = new NanoConfiguration();

            nanoConfiguration.AddFunc("/Customer/CreateCustomer", context => new
            {
                CustomerId = 1,
                FirstName  = context.Request.GetRequestParameterValue("firstName"),
                LastName   = context.Request.GetRequestParameterValue("lastName")
            });

            using (HttpListenerNanoServer.Start(nanoConfiguration, "http://localhost:4545"))
            {
                var parameters = new NameValueCollection {
                    { "firstName", "Clark" }, { "lastName", "Kent" }
                };
                var stopwatch = Stopwatch.StartNew();

                Parallel.For(0, requestCount, i =>
                {
                    using (var client = new WebClient())
                    {
                        byte[] responsebytes = client.UploadValues("http://localhost:4545/Customer/CreateCustomer", "POST", parameters);
                        string responsebody  = Encoding.UTF8.GetString(responsebytes);
                        if (requestCount == 1)
                        {
                            Trace.WriteLine(responsebody);
                        }
                    }
                });

                var elapsedTime = stopwatch.Elapsed;
                Trace.WriteLine(string.Format("{0} requests completed in {1}", requestCount, elapsedTime.GetFormattedTime()));
                var averageRequestTimeInMilliseconds = elapsedTime.TotalMilliseconds / requestCount;
                var averageRequestTimeSpan           = TimeSpan.FromTicks((long)(TimeSpan.TicksPerMillisecond * averageRequestTimeInMilliseconds));
                Trace.WriteLine(string.Format("Average request time: {0}", averageRequestTimeSpan.GetFormattedTime()));
            }
        }
Пример #21
0
        private static void Main(string[] args)
        {
            const string url = "http://localhost:4545";

            var exitEvent = new ManualResetEvent(false);

            Console.CancelKeyPress += (sender, eventArgs) =>
            {
                eventArgs.Cancel = true;
                exitEvent.Set();
            };

            var config = new NanoConfiguration();

            // 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);
            config.AddMethods <Customer>("/api/customer/");
            config.AddFunc("/hi", context => "Hello World!");

            config.AddBackgroundTask("Test", 30000, () =>
            {
                string result = "Hi, the time is now: " + DateTime.Now;
                Console.WriteLine(result);
                return(result);
            });

            using (HttpListenerNanoServer.Start(config, url))
            {
                if (Debugger.IsAttached)
                {
                    Process.Start(url + "/ApiExplorer/");
                }

                Console.WriteLine("Nano Server is running on: " + url);
                Console.WriteLine("Press Ctrl+C to exit.");
                Console.WriteLine(config.ToString());
                exitEvent.WaitOne();
            }
        }
Пример #22
0
        private static void Main( string[] args )
        {
            const string url = "http://localhost:4545";

            var exitEvent = new ManualResetEvent( false );

            Console.CancelKeyPress += ( sender, eventArgs ) =>
            {
                eventArgs.Cancel = true;
                exitEvent.Set();
            };

            var config = new NanoConfiguration();

            // 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 );
            config.AddMethods<Customer>();
            config.AddMethods<Customer2>();
            config.AddFunc( "/hi", context => "Hello World!" );

            config.AddBackgroundTask( "Test", 30000, () =>
            {
                string result = "Hi, the time is now: " + DateTime.Now;
                Console.WriteLine( result );
                return result;
            } );

            using ( HttpListenerNanoServer.Start( config, url ) )
            {
                if ( Debugger.IsAttached )
                    Process.Start( url + "/ApiExplorer/" );

                Console.WriteLine( "Nano Server is running on: " + url );
                Console.WriteLine( "Press Ctrl+C to exit." );
                Console.WriteLine( config.ToString() );
                exitEvent.WaitOne();
            }
        }
Пример #23
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);
        }
Пример #24
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>();

            // 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;
        }
Пример #25
0
 public static void Init(NanoConfiguration nano, string webRoot)
 {
     Log.Information("wwwRoot: {webRoot}", webRoot);
     nano.AddDirectory("/", webRoot, returnHttp404WhenFileWasNotFound: true);
 }
Пример #26
0
 /// <summary>
 /// Creates an <see cref="HttpListenerNanoServer"/> with defaults to help write small unit tests.
 /// </summary>
 /// <returns></returns>
 public static HttpListenerNanoServer Start()
 {
     var nanoConfiguration = new NanoConfiguration();
     const string url = "http://localhost:4545/";
     return HttpListenerNanoServer.Start( nanoConfiguration, url );
 }
Пример #27
0
 /// <summary>
 /// Creates an <see cref="HttpListenerNanoServer"/> with defaults to help write small unit tests.
 /// </summary>
 /// <returns></returns>
 public static HttpListenerNanoServer Start()
 {
     var nanoConfiguration = new NanoConfiguration();
     ( ( JsonNetSerializer ) nanoConfiguration.SerializationService ).JsonSerializerSettings.Formatting = Formatting.None;
     const string url = "http://localhost:4545/";
     var server = HttpListenerNanoServer.Start( nanoConfiguration, url );
     return server;
 }
Пример #28
0
            public void Start(string url)
            {
                #region NanoSetup

                var exitEvent = new ManualResetEvent(false);

                Console.CancelKeyPress += (sender, eventArgs) =>
                {
                    eventArgs.Cancel = true;
                    exitEvent.Set();
                };

                var validatedUrls = ValidateUrls(url);

                var config = new NanoConfiguration();

                config.EnableCorrelationId();

                config.AddDirectory("/", Debugger.IsAttached ? "../../www" : "www",
                                    returnHttp404WhenFileWasNotFound: true);

                #endregion

                //you will need to provide a connection string in your app.config for this to produce any events.
                //constructor will set default hardcoded values, you can then override any of those values here ( below values listed are the default values )
                var spokeConfig = new Spoke.SpokeConfiguration
                {
                    DefaultAbortAfterMinutes                = 60,
                    LiveRetryAbortAfterMinutes              = 60,
                    EventProcessingMutexTimeToLiveMinutes   = 2,
                    EventSubscriptionMutexTimeToLiveMinutes = 2,
                    FailedEventsLookbackMinutes             = 1440,
                    FailedEventsThresholdMinutes            = 60,
                    FailedNotificationsThresholdMinutes     = 60,
                    MutexAcquisitionWaitTime                = 1,
                    ClockBackfillTotalMinutes               = 10,
                    ClockBackfillOffsetMinutes              = 2,
                    ClockBackfillMutexTimeToLiveMinutes     = 2,
                    ClockSleepMilliseconds = 10000,
                    SendClockMessages      = true,
                    AppName   = $"{Environment.MachineName}-{AppDomain.CurrentDomain.FriendlyName}",
                    UserName  = WindowsIdentity.GetCurrent()?.Name,
                    GetApiUri = x => x.Uri,
                    WasApiCallSuccessfulHandlers =
                        new Dictionary <string, Func <Spoke.Models.WasApiCallSuccessfulInput, bool> >
                    {
                        {
                            "DEFAULT",
                            response => response.HttpResponse.Exception == null &&
                            response.HttpResponse.Response != null &&
                            response.HttpResponse.Response.StatusCode == HttpStatusCode.OK
                        }
                    },
                    JsonSerializer           = new Spoke.Utils.JsonSerializer(),
                    Database                 = () => new Spoke.DatabaseIO.SpokeSqlDatabase(),
                    DatabaseConnectionString = () => ConfigurationManager.ConnectionStrings["spoke"].ConnectionString,
                    SchemaName               = "Spoke"
                };

                //you can add support for "service types" by adding WasApiCallSuccessfulHandlers instead of the default.
                spokeConfig.WasApiCallSuccessfulHandlers.Add(
                    "OTHER_SERVICE_TYPE",                               //the key for the new service type
                    response => response.HttpResponse.Exception == null //func to evaluate if the service call was successful or not.
                    );

                var spoke = new Spoke(spokeConfig);
                spoke.Start();

                config.AddMethods <Spoke.ExternalApi>("/Api/Events");
                config.AddMethods <Spoke.InternalApi>("/Api/Events/Internal");

                #region NanoSetup
                config.AddBackgroundTask("GCCollect", 30000, () =>
                {
                    GC.Collect();
                    return(null);
                });

                config.GlobalEventHandler.UnhandledExceptionHandlers.Add((exception, context) =>
                {
                    try
                    {
                        if (!EventLog.SourceExists(_applicationName))
                        {
                            EventLog.CreateEventSource(_applicationName, "Application");
                        }

                        var msg = new StringBuilder()
                                  .AppendLine("Nano Error:")
                                  .AppendLine("-----------").AppendLine()
                                  .AppendLine("URL: " + context.Request.Url).AppendLine()
                                  .AppendLine("Message: " + exception.Message).AppendLine()
                                  .AppendLine("StackTrace:")
                                  .AppendLine(exception.StackTrace)
                                  .ToString();

                        EventLog.WriteEntry(_applicationName, msg, EventLogEntryType.Error);
                    }
                    catch (Exception)
                    {
                        // Gulp: Never throw an exception in the unhandled exception handler
                    }
                });

                _server = HttpListenerNanoServer.Start(config, validatedUrls);

                if (Debugger.IsAttached)
                {
                    Process.Start(_server.HttpListenerConfiguration.GetFirstUrlBeingListenedOn().TrimEnd('/') +
                                  "/ApiExplorer/");
                }

                Console.WriteLine("Nano Server is running on: " +
                                  _server.HttpListenerConfiguration.GetFirstUrlBeingListenedOn());
                #endregion
            }