diff --git a/TemplateNETService/Program.cs b/TemplateNETService/Program.cs index e465052..b0378d2 100644 --- a/TemplateNETService/Program.cs +++ b/TemplateNETService/Program.cs @@ -1,55 +1,102 @@ -using Microsoft.AspNetCore.Hosting; +using System.Reflection; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json.Serialization; using Serilog; using Serilog.Events; using TemplateNETService.Business; using TemplateNETService.Models; -using Log = Serilog.Log; namespace TemplateNETService; public class Program { public static void Main(string[] args) + { + RunWebApp(args); + } + + private static void RunWebApp(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + ConfigureConfiguration(builder); + ConfigureLogging(builder); + ConfigureServices(builder.Services); + + var app = builder.Build(); + ConfigureApp(app); + app.Run(); + } + + private static void ConfigureConfiguration(WebApplicationBuilder builder) + { + builder.Configuration + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) + .AddEnvironmentVariables(); + var generalConfig = builder.Configuration.GetSection("General").Get(); + if (generalConfig == null) + { + throw new InvalidOperationException("Configuration section 'General' is missing or invalid in appsettings.json"); + } + Config.general = generalConfig; + } + + private static void ConfigureLogging(WebApplicationBuilder builder) { Directory.CreateDirectory("_LOG"); + Log.Logger = new LoggerConfiguration() .WriteTo.Console() .MinimumLevel.Debug() - .MinimumLevel.Override("Microsoft", LogEventLevel.Error) // Für Microsoft-Komponenten nur Warning+ - .WriteTo.File(Path.Combine(AppContext.BaseDirectory, "_LOG/TEST.log"), rollingInterval: RollingInterval.Day) - .Filter.ByExcluding(logEvent => logEvent.Level == LogEventLevel.Information) + .MinimumLevel.Override("Microsoft", LogEventLevel.Error) + .WriteTo.File( + Path.Combine(AppContext.BaseDirectory, "_LOG/TemplateNETService.log"), + rollingInterval: RollingInterval.Day, + fileSizeLimitBytes: 100000000, + rollOnFileSizeLimit: true, + retainedFileTimeLimit: TimeSpan.FromDays(14) + ) + .WriteTo.File( + Path.Combine(AppContext.BaseDirectory, "_LOG/TemplateNETService.error.log"), + rollingInterval: RollingInterval.Day, + restrictedToMinimumLevel: LogEventLevel.Error + ) .CreateLogger(); - CreateHostBuilder(args).Build().Run(); + builder.Logging.ClearProviders(); + builder.Logging.AddSerilog(Log.Logger); + builder.Host.UseSerilog(); } + + private static void ConfigureServices(IServiceCollection services) + { + services.AddControllers().AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); }); - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .UseWindowsService() - .ConfigureAppConfiguration((context, config) => - { - config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); - }) - .UseSerilog() - .ConfigureWebHostDefaults(webBuilder => - { - var config = new ConfigurationBuilder() - .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) - .Build(); + services.AddEndpointsApiExplorer(); + services.AddSwaggerGen(c => + { + var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; + c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); + }); - Config.general = config.GetSection("General").Get(); + services.AddWindowsService(); + services.AddHostedService(); + } + + private static void ConfigureApp(WebApplication app) + { + app.UseSwagger(); + app.UseSwaggerUI(); - webBuilder.UseStartup(); - webBuilder.UseKestrel(options => - { - options.ListenAnyIP(Config.general.ThisPort); - }) - .ConfigureServices(services => - { - services.AddHostedService(); - }); - }); + app.UseHttpsRedirection(); + app.UseAuthorization(); + app.MapControllers(); + + app.Urls.Add($"http://*:{Config.general.ThisPort}"); + } } \ No newline at end of file