public OutOfProcessExecutionTarget(ILogger logger, OutOfProcessOptions options, DiagnosticsCollector diagnosticsCollector) { _logger = logger; _debugMode = options.DebugMode; _buildProjects = options.BuildProjects; _diagnosticsCollector = diagnosticsCollector; }
public static async Task RunAsync(Application application, string[] args) { var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = true, }; options.Converters.Add(ReplicaStatus.JsonConverter); using var host = Host.CreateDefaultBuilder(args) .UseSerilog((context, configuration) => { // Logging for this application configuration .MinimumLevel.Verbose() .Filter.ByExcluding(Matching.FromSource("Microsoft")) .Enrich .FromLogContext() .WriteTo .Console(); }) .ConfigureWebHostDefaults(web => { web.ConfigureServices(services => { services.AddRazorPages(); services.AddServerSideBlazor(); services.AddOptions <StaticFileOptions>() .PostConfigure(o => { // Make sure we don't remove the other file providers (blazor needs this) o.FileProvider = new CompositeFileProvider(o.FileProvider, new ManifestEmbeddedFileProvider(typeof(MicronetesHost).Assembly, "wwwroot")); }); services.AddSingleton(application); }); web.ConfigureKestrel(options => { var config = options.ApplicationServices.GetRequiredService <IConfiguration>(); if (config["port"] != null && int.TryParse(config["port"], out int cpPort)) { // Use the specified port options.Listen(IPAddress.Loopback, cpPort); } else { // This is lame but it allows running multiple versions of this // we should also allow ports to be specified as input options.Listen(IPAddress.Loopback, 0); } }); web.Configure(app => { app.UseDeveloperExceptionPage(); app.UseStaticFiles(); app.UseRouting(); var api = new MicronetesApi(options); app.UseEndpoints(endpoints => { api.MapRoutes(endpoints); endpoints.MapBlazorHub(); endpoints.MapFallbackToPage("/_Host"); }); }); }) .Build(); var logger = host.Services.GetRequiredService <ILogger <MicronetesHost> >(); var lifetime = host.Services.GetRequiredService <IHostApplicationLifetime>(); var configuration = host.Services.GetRequiredService <IConfiguration>(); var serverAddressesFeature = host.Services.GetRequiredService <IServer>().Features.Get <IServerAddressesFeature>(); var diagnosticOptions = DiagnosticOptions.FromConfiguration(configuration); var diagnosticsCollector = new DiagnosticsCollector(logger, diagnosticOptions); var proxyService = new ProxyService(logger); // Print out what providers were selected and their values diagnosticOptions.DumpDiagnostics(logger); var target = new OutOfProcessExecutionTarget(logger, OutOfProcessOptions.FromArgs(args), diagnosticsCollector); await host.StartAsync(); logger.LogInformation("Dashboard running on {Address}", serverAddressesFeature.Addresses.First()); try { await proxyService.StartAsync(application); await target.StartAsync(application); } catch (Exception ex) { logger.LogError(0, ex, "Failed to launch application"); } var waitForStop = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); lifetime.ApplicationStopping.Register(obj => waitForStop.TrySetResult(null), null); await waitForStop.Task; logger.LogInformation("Shutting down..."); try { await target.StopAsync(application); await proxyService.StopAsync(application); } finally { // Stop the host after everything else has been shutdown await host.StopAsync(); } }