Program.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. using AipGateway.API.Application.Pipeline.Middlewares;
  2. using AipGateway.API.Domain;
  3. using AipGateway.API.Services;
  4. using AipGateway.API.Job;
  5. using Microsoft.OpenApi.Models;
  6. using Microsoft.AspNetCore.HttpOverrides;
  7. using System.Net;
  8. using AipGateway.API.Configurations;
  9. using AutoMapper;
  10. using AipGateway.AIP;
  11. using AipGateway.API.Services.impl;
  12. using Serilog;
  13. using Serilog.Events;
  14. internal class Program
  15. {
  16. private static void Main(string[] args)
  17. {
  18. Log.Logger = new LoggerConfiguration().WriteTo.Console(LogEventLevel.Information)
  19. .MinimumLevel.Debug()
  20. .CreateBootstrapLogger();
  21. Log.Information("Start Azure Information RESTFull API Service... [{0}]", Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"));
  22. try
  23. {
  24. var builder = WebApplication.CreateBuilder(args);
  25. builder.Host.UseSerilog((context, services, configuration) => configuration
  26. .ReadFrom.Configuration(context.Configuration)
  27. .ReadFrom.Services(services)
  28. .Enrich.FromLogContext(), true);
  29. //builder.Host.UseSerilog((context, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(context.Configuration));
  30. ConfigureSettings(builder.Host, builder.Environment); // 환경설정 파일 설정
  31. AddApplicationSettings(builder.Services, builder.Configuration); // 어플리케이션 환경파일 DI(dependency injection)-의존성 주입
  32. builder.Services.AddControllers();
  33. builder.Services.AddSwaggerGen(c => {
  34. c.SwaggerDoc("v1", new OpenApiInfo { Title = "Azure Information Protection RESTFull API Service Gateway", Version = "v1" });
  35. });
  36. builder.Services.Configure<ForwardedHeadersOptions>(options =>
  37. {
  38. options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
  39. options.KnownNetworks.Clear();
  40. options.KnownProxies.Clear();
  41. });
  42. int Port = 9871;
  43. if (!int.TryParse(builder.Configuration["Port"], out Port))
  44. {
  45. Port = 9871;
  46. }
  47. //https://learn.microsoft.com/ko-kr/aspnet/core/fundamentals/servers/kestrel/options?view=aspnetcore-8.0
  48. //builder.WebHost.ConfigureKestrel((context, serverOptions) =>
  49. //{
  50. // serverOptions.ListenAnyIP(Port);
  51. //});
  52. builder.WebHost.ConfigureKestrel((context, serverOptions) =>
  53. {
  54. //serverOptions.Limits.MaxRequestBodySize = 100_000_000; // [RequestSizeLimit(100_000_000)] --> Controller 위에 선언, IHttpMaxRequestBodySizeFeature
  55. //serverOptions.Limits.MaxConcurrentConnections = 100;
  56. //serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
  57. serverOptions.Listen(IPAddress.Any, Port, listenOptions =>
  58. {
  59. //listenOptions.UseHttps("testCert.pfx", "testPassword");
  60. //listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
  61. });
  62. });
  63. builder.Services.InjectDependencies(builder.Configuration);
  64. builder.Services.AddScoped<AipFileApiService>();
  65. builder.Services.AddSingleton<AipFileJobService>();
  66. builder.Services.AddSingleton<ScheduleService>();
  67. builder.Services.AddScoped<IApiAipService, ApiAipService>();
  68. builder.Services.AddScoped<IApiDbService, ApiDbService>();
  69. builder.Services.AddScoped<IApiDummyService, ApiDummyService>();
  70. builder.Services.AddScoped<IApiFileService, ApiFileService>();
  71. builder.Services.AddScoped<IApiStreamService, ApiStreamService>();
  72. var mappingConfig = new MapperConfiguration(mc =>
  73. {
  74. mc.AddProfile(new MappingProfile());
  75. });
  76. IMapper mapper = mappingConfig.CreateMapper();
  77. builder.Services.AddSingleton(mapper);
  78. builder.Services.AddHealthChecks();
  79. builder.Services.AddCors(p => p.AddPolicy("corsapp", builder =>
  80. {
  81. //builder.WithOrigins("*", "http://localhost:3011", "https://localhost:3011", "https://localhost:7261").AllowAnyMethod().AllowAnyHeader();
  82. }));
  83. ContainerService.provider = builder.Services.BuildServiceProvider();
  84. AipFileApiService? aipFileApiService = ContainerService.provider.GetService<AipFileApiService>();
  85. if (aipFileApiService == null)
  86. {
  87. Log.Error("Not Found AipFileApiService...");
  88. return;
  89. }
  90. aipFileApiService.LoadConfig();
  91. ContainerService.aipConfig = aipFileApiService.GetAipSettings();
  92. string supportedFileExt = ContainerService.aipConfig.SupportedFileExt;
  93. string protectedFileExt = ContainerService.aipConfig.ProtectedFileExt;
  94. string[] fileExts = supportedFileExt.Split(';');
  95. foreach (string ext in fileExts)
  96. {
  97. if (ext.Trim() == "") continue;
  98. ContainerService.supportedFileExtMap[ext.Trim()] = ext.Trim();
  99. ContainerService.protectedFileExtMap[ext.Trim()] = ext.Trim();
  100. ContainerService.supportedDelFileExtMap[ext.Trim()] = ext.Trim();
  101. ContainerService.protectedDelFileExtMap[ext.Trim()] = ext.Trim();
  102. }
  103. string[] protectedExts = protectedFileExt.Split(';');
  104. foreach (string ext in protectedExts)
  105. {
  106. if (ext.Trim() == "") continue;
  107. string[] extFile = ext.Split('-');
  108. if (extFile.Length == 2)
  109. {
  110. ContainerService.protectedFileExtMap[extFile[0].Trim()] = extFile[1].Trim();
  111. if (ContainerService.protectedDelFileExtMap.Contains(extFile[0].Trim()))
  112. {
  113. ContainerService.protectedDelFileExtMap.Remove(extFile[0].Trim());
  114. }
  115. ContainerService.protectedDelFileExtMap[extFile[1].Trim()] = extFile[0].Trim();
  116. }
  117. }
  118. ContainerService.aipFileManager = new AipFileManager(aipFileApiService.GetAipSettings().GetConfig());
  119. if (!AipFileInitialize(ContainerService.aipFileManager))
  120. {
  121. Log.Error("AipFileInitialize: Failed. {0}, {1}", ContainerService.aipFileManager.LastErrNo, ContainerService.aipFileManager.LastErrMsg);
  122. return;
  123. }
  124. aipFileApiService.DownloadAipFileInformations();
  125. aipFileApiService.LoadLinkedApiKeys();
  126. aipFileApiService.LoadLinkedDecryptKeys();
  127. AipFileJobService? aipFileJobService = ContainerService.provider.GetService<AipFileJobService>();
  128. if (aipFileJobService != null)
  129. {
  130. aipFileJobService.Start();
  131. }
  132. var app = builder.Build();
  133. //app.UseExceptionHandler("/Error");
  134. app.UseSerilogRequestLogging();
  135. //HTTP Strict Transport Security : Method used by server to declare that they should only be accessed using HTTPS (secure connection) only
  136. app.UseHsts();
  137. app.UseHttpsRedirection();
  138. app.UseStaticFiles();
  139. app.UseRouting();
  140. app.UseCors("corsapp");
  141. app.UseAuthentication();
  142. app.UseAuthorization();
  143. app.UseMiddlewares();
  144. //app.UseMiddleware<ApiValidationMiddleware>();
  145. //app.UseMiddleware<ApiGuidGeneratorMiddleware>();
  146. app.UseHealthChecks("/health");
  147. //if (app.Environment.IsDevelopment())
  148. {
  149. app.UseSwagger();
  150. app.UseSwaggerUI();
  151. }
  152. app.MapControllers();
  153. app.Run();
  154. //
  155. // 프로그램 종료 후 처리 수행
  156. //
  157. }
  158. catch (Exception ex) when (ex.GetType().Name is not "StopTheHostException"
  159. && ex.GetType().Name is not "HostAbortedException")
  160. {
  161. Log.Fatal(ex, "Program Unhandled exception");
  162. }
  163. finally
  164. {
  165. Log.Information("Shut down complete");
  166. Log.CloseAndFlush();
  167. }
  168. }
  169. private static bool AipFileInitialize(AipFileManager aipFileManager)
  170. {
  171. if (!aipFileManager.Initialize())
  172. {
  173. Log.Error("AipFileInitialize, aipFileManager.Initialize Failed, {0}, {1}", aipFileManager.LastErrNo, aipFileManager.LastErrMsg);
  174. return false;
  175. }
  176. if (!aipFileManager.CreateProfile())
  177. {
  178. Log.Error("AipFileInitialize, aipFileManager.CreateProfile Failed, {0}, {1}", aipFileManager.LastErrNo, aipFileManager.LastErrMsg);
  179. return false;
  180. }
  181. if (!aipFileManager.CreateEngine())
  182. {
  183. Log.Error("AipFileInitialize, aipFileManager.CreateEngine Failed, {0}, {1}", aipFileManager.LastErrNo, aipFileManager.LastErrMsg);
  184. return false;
  185. }
  186. return true;
  187. }
  188. private static void ConfigureSettings(IHostBuilder hostBuilder, IHostEnvironment environment)
  189. {
  190. hostBuilder.ConfigureAppConfiguration(config =>
  191. {
  192. config
  193. .SetBasePath(Directory.GetCurrentDirectory())
  194. .AddJsonFile(
  195. path: "appsettings.json",
  196. optional: false,
  197. reloadOnChange: true)
  198. .AddJsonFile(
  199. path: $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json",
  200. optional: true,
  201. reloadOnChange: true)
  202. .AddEnvironmentVariables();
  203. });
  204. }
  205. private static void AddApplicationSettings(IServiceCollection services, IConfiguration configuration)
  206. {
  207. services.Configure<AipSettings>(configuration.GetSection(nameof(AipSettings)));
  208. //services.Configure<EmailSenderSettings>(configuration.GetSection(nameof(EmailSenderSettings)));
  209. //services.Configure<RequestLocalizationSettings>(configuration.GetSection(nameof(RequestLocalizationSettings)));
  210. //if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development")
  211. //{
  212. // services.Configure<SwaggerSettings>(configuration.GetSection(nameof(SwaggerSettings)));
  213. //}
  214. }
  215. }