using System; using System.Globalization; using System.Net.Http; using System.Reflection; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using Volo.Abp.Modularity; namespace Win_in.Sfs.Shared.Host; public static class HostBuilderExtensions { public static int BuildAndRun(this WebApplicationBuilder builder, Action builderAction = null, Action appAction = null) where TModule : IAbpModule { Serilog.Debugging.SelfLog.Enable(Console.WriteLine); Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .WriteTo.Console(formatProvider: CultureInfo.InvariantCulture) .CreateBootstrapLogger(); try { Log.Information($"Starting web host ${Assembly.GetEntryAssembly().GetName().Name}"); builder.Host.ConfigureAppConfiguration((hc, cb) => { var defaultUrl = builder.Environment.IsDevelopment() ? "http://localhost:21093/" : "http://gateway/"; var configUrl = cb.Build().GetValue("", defaultUrl.TrimEnd('/')); AddJsonByUrl(cb, $"{configUrl}/appsettings.json"); if (builder.Environment.IsDevelopment()) { AddJsonByUrl(cb, $"{configUrl}/appsettings.{builder.Environment.EnvironmentName}.json"); } }); builder.Host.UseAutofac(); builder.AddApplicationAsync().Wait(); builder.Host.UseSerilog((hostingContext, services, configBuilder) => { configBuilder .ReadFrom.Configuration(hostingContext.Configuration) .ReadFrom.Services(services) .Enrich.FromLogContext() .WriteTo.Console(formatProvider: CultureInfo.InvariantCulture); }, writeToProviders: false); builderAction?.Invoke(builder); var app = builder.Build(); app.UseSerilogRequestLogging(); app.InitializeApplicationAsync().Wait(); appAction?.Invoke(app); app.RunAsync().Wait(); return 0; } catch (Exception ex) { Log.Fatal(ex, "Host terminated unexpectedly!"); return 1; } finally { Log.CloseAndFlush(); } } private static void AddJsonByUrl(IConfigurationBuilder configurationBuilder, string url) { var stream = new HttpClient().GetStreamAsync(url).Result; configurationBuilder.AddJsonStream(stream); } }