public IActionResult Ready([FromServices] ReadyChecker readChecker) { if (readChecker.Check()) { return(Ok()); } return(BadRequest()); }
private void Awake() { if (instance == null) { instance = this; } PhotonNetwork.AllocateViewID(); }
static async Task Main(string[] args) { string basePath = (Debugger.IsAttached) ? Directory.GetCurrentDirectory() : AppDomain.CurrentDomain.BaseDirectory; var configBuilder = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false) .AddEnvironmentVariables(); var config = configBuilder.Build(); // connect to RabbitMQ var conn = Utils.ConnectRabbitMQ(config); // token signing key byte[] tokenKey = null; // configure keys through RabbitMQ exchange await KeyDistributor.ConfigureAsync( config["RabbitMQ:Exchanges:KeyDistribution"], conn, keys => { TelemetryConfiguration.Active.InstrumentationKey = keys.AppInsightsInstrumKey; tokenKey = keys.JwtIssuerKey; }); // set app insights developer mode (remove lags when sending telemetry) TelemetryConfiguration.Active.TelemetryChannel.DeveloperMode = true; // set service name in app insights TelemetryConfiguration.Active.TelemetryInitializers.Add(new CustomTelemetryInitializer(serviceName)); // telemetry client instance var telemetry = new TelemetryClient(); // token validation parameters var tokenValidationParameters = new TokenValidationParameters { ValidateAudience = false, ValidateIssuer = false, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(tokenKey) }; // security options for RabbitMQ service var securityOptions = new SecurityOptions( // map of request types to scope names new Dictionary <string, string>() { { nameof(Ping1), "1" }, { nameof(Ping2), "2" }, { nameof(Ping3), "3" }, { nameof(Ping4), "4" } }, tokenValidationParameters); // set host configuration var hostBuilder = new HostBuilder() .ConfigureHostConfiguration(c => c .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)) .ConfigureServices((context, services) => { services.AddSingleton <TelemetryClient>(telemetry); services.AddSingleton <SecurityOptions>(securityOptions); services.AddSingleton <IConnection>(conn); services.AddHostedService <BangService>(); }); var host = hostBuilder.Build(); // send ready signal await ReadyChecker.SendReadyAsync(config["RabbitMQ:Exchanges:ReadyCheck"], conn, serviceName); // run host and wait for shutdown signal await host.StartAsync(); await Shutdowner.ShutdownAsync(config["RabbitMQ:Exchanges:Shutdown"], conn, () => host.StopAsync()); // flush telemetry telemetry?.Flush(); Task.Delay(1000).Wait(); Console.WriteLine("Bye!"); }
static async Task Main(string[] args) { string basePath = (Debugger.IsAttached) ? Directory.GetCurrentDirectory() : AppDomain.CurrentDomain.BaseDirectory; var configBuilder = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false) .AddEnvironmentVariables(); if (Debugger.IsAttached) { configBuilder.AddJsonFile("appsettings.Development.json", optional: true, reloadOnChange: false); } var config = configBuilder.Build(); // connect to RabbitMQ var conn = Utils.ConnectRabbitMQ(config); // token signing key byte[] tokenKey = null; // app insights key string appInsKey = null; // configure keys through RabbitMQ exchange await KeyDistributor.ConfigureAsync( config["RabbitMQ:Exchanges:KeyDistribution"], conn, keys => { appInsKey = keys.AppInsightsInstrumKey; tokenKey = keys.JwtIssuerKey; }); // set app insights developer mode (remove lags when sending telemetry) TelemetryConfiguration.Active.TelemetryChannel.DeveloperMode = true; // token validation parameters var tokenValidationParameters = new TokenValidationParameters { ValidateAudience = false, ValidateIssuer = false, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(tokenKey) }; // set host configuration var hostBuilder = new WebHostBuilder() .UseConfiguration(config) .ConfigureLogging(logging => { logging.AddConfiguration(config.GetSection("Logging")); logging.AddConsole(); }) .ConfigureServices(services => { services.AddSingleton <IConnection>(conn); services.AddSingleton <ITelemetryInitializer>(new CustomTelemetryInitializer("apigw")); services.AddApplicationInsightsTelemetry(appInsKey); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = tokenValidationParameters; options.SaveToken = true; }); services.AddMvc(options => options.Filters.Add(new ExceptionFilter())); }) .Configure(app => { app.UseAuthentication(); app.UseMvc(); }) .UseKestrel(); var host = hostBuilder.Build(); // send ready signal await ReadyChecker.SendReadyAsync(config["RabbitMQ:Exchanges:ReadyCheck"], conn, serviceName); // run host and wait for shutdown signal await host.StartAsync(); await Shutdowner.ShutdownAsync(config["RabbitMQ:Exchanges:Shutdown"], conn, () => host.StopAsync()); // telemetry client instance var telemetry = host.Services.GetService <TelemetryClient>(); // flush telemetry telemetry?.Flush(); Task.Delay(1000).Wait(); Console.WriteLine("Bye!"); }
static async Task Main(string[] args) { string basePath = (Debugger.IsAttached) ? Directory.GetCurrentDirectory() : AppDomain.CurrentDomain.BaseDirectory; // build config var configBuilder = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false) .AddEnvironmentVariables(); if (Debugger.IsAttached) { configBuilder.AddJsonFile("appsettings.Development.json", optional: true, reloadOnChange: false); } var config = configBuilder.Build(); // connect to RabbitMQ var conn = Utils.ConnectRabbitMQ(config); // wait peers to be ready var waitPeers = ReadyChecker.WaitPeersAsync(config["RabbitMQ:Exchanges:ReadyCheck"], conn, new List <string> { "apigw", "bang", "bar", "fib", "foo" }); // get App Insights instrumentation key from CLI Console.WriteLine("Please enter your Application Insights instrumentation key: "); var instrumKey = Console.ReadLine(); // generate key and token var tokenKey = GenKey(); // distribute keys await KeyDistributor.ConfigurePeersAsync(config["RabbitMQ:Exchanges:KeyDistribution"], conn, new Keys { AppInsightsInstrumKey = instrumKey, JwtIssuerKey = tokenKey }); // if peers are ready if (await Task.WhenAny(waitPeers, Task.Delay(15000)) == waitPeers) { // Task completed within timeout. // Consider that the task may have faulted or been canceled. // We re-await the task so that any exceptions/cancellation is rethrown. await waitPeers; bool shutdown = false; // perform demo scenarios based on user choise using (var http = new HttpClient()) { http.BaseAddress = new Uri(config["ApiGW:Url"]); while (!shutdown) { try { string url = null; switch (MainDialog()) { case '1': url = "api/demo/fooping1"; break; case '2': url = "api/demo/barping2"; break; case '3': url = "api/demo/fibping3"; break; case '4': url = "api/demo/fibping4"; break; case 'q': shutdown = true; break; } if (shutdown) { await Shutdowner.ShutdownPeersAsync(config["RabbitMQ:Exchanges:Shutdown"], conn); } else { HttpResponseMessage resp = await http.GetAsync(url); if (resp.StatusCode == HttpStatusCode.Unauthorized) { var username = LoginDialog(); var token = GenToken(tokenKey, username); http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); Console.WriteLine($"Bearer JWT for user '{username}' will be sent in the header of every request since now."); } else { resp.EnsureSuccessStatusCode(); Console.WriteLine(); Console.WriteLine("----------------------------------------"); Console.WriteLine($"HTTP GET '/{url}' completed at {DateTime.Now.ToString()}."); Console.WriteLine("----------------------------------------"); } } } catch (HttpRequestException ex) { Console.WriteLine(); Console.WriteLine("----------------------------------------"); Console.WriteLine("Message: " + ex.Message); Console.WriteLine("----------------------------------------"); } } } } else { // timeout/cancellation logic Console.WriteLine(); Console.WriteLine("Sorry, but not all services are ready for demo."); await Shutdowner.ShutdownPeersAsync(config["RabbitMQ:Exchanges:Shutdown"], conn); return; } Console.WriteLine("Bye!"); }