Program.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using Application;
  2. using Application.Abstractions.Chat;
  3. using Application.Abstractions.Crypto;
  4. using Infrastructure;
  5. using SharedKernel;
  6. using System.Reflection;
  7. using Microsoft.Extensions.Hosting.WindowsServices;
  8. using Web.Api;
  9. using Web.Api.Extensions;
  10. using Web.Api.Hubs;
  11. using Web.Api.Services;
  12. var builder = WebApplication.CreateBuilder(args);
  13. var settings = builder.Configuration.Get<AppSettings>()!;
  14. if (!WindowsServiceHelpers.IsWindowsService())
  15. {
  16. Console.Title = settings.App.Name;
  17. }
  18. Console.WriteLine($"ENV={builder.Environment.EnvironmentName}");
  19. Console.WriteLine($"현재 시간: {DateTime.Now} / {TimeZoneInfo.Local.Id}");
  20. builder.Host.UseWindowsService();
  21. builder.Services.Configure<AppSettings>(builder.Configuration);
  22. builder.Services
  23. .AddApplication()
  24. .AddPresentation()
  25. .AddApiInfrastructure(builder.Configuration);
  26. // CORS
  27. builder.Services.AddCors(options =>
  28. {
  29. options.AddPolicy(settings.CorsPolicy.Name, policy =>
  30. {
  31. policy
  32. .WithOrigins(settings.CorsPolicy.AllowedOrigins.ToArray())
  33. .AllowAnyHeader()
  34. .AllowAnyMethod()
  35. .AllowCredentials()
  36. .SetPreflightMaxAge(TimeSpan.FromSeconds(settings.CorsPolicy.PreflightMaxAgeSeconds));
  37. });
  38. });
  39. // SignalR
  40. builder.Services.AddSignalR();
  41. builder.Services.AddSingleton<ICryptoHubService, CryptoHubService>();
  42. // Chat
  43. builder.Services.AddSingleton<IChatHubService, ChatHubService>();
  44. builder.Services.AddHostedService<KickSubscriberService>();
  45. // Endpoints
  46. builder.Services.AddEndpoints(Assembly.GetExecutingAssembly());
  47. builder.Logging.AddConsole();
  48. /**
  49. * =======================================================================================================================================================
  50. */
  51. var app = builder.Build();
  52. /**
  53. * =======================================================================================================================================================
  54. */
  55. if (app.Environment.IsDevelopment())
  56. {
  57. app.UseSwagger();
  58. app.UseSwaggerUI();
  59. }
  60. // 상태 확인\
  61. app.MapHealthChecks("/health");
  62. app.UseExceptionHandler();
  63. app.UseCors(settings.CorsPolicy.Name);
  64. app.UseStaticFiles();
  65. app.UseAuthentication();
  66. app.UseAuthorization();
  67. app.MapEndpoints();
  68. app.MapHub<CryptoHub>("/hubs/crypto");
  69. app.MapHub<ChatHub>("/hubs/chat");
  70. // 서버 시작 시 이전 채팅 접속자 정보 초기화 (stale 연결 제거)
  71. using (var scope = app.Services.CreateScope())
  72. {
  73. await scope.ServiceProvider.GetRequiredService<IChatConnectionTracker>().ClearAllAsync();
  74. }
  75. app.Run();