Program.cs 2.4 KB

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