Program.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using Microsoft.Extensions.FileProviders; // 정적파일 관련
  2. using Microsoft.AspNetCore.Identity.UI.Services;
  3. using Microsoft.EntityFrameworkCore;
  4. using Microsoft.AspNetCore.Mvc;
  5. using StackExchange.Redis;
  6. using bitforum.Middleware;
  7. using bitforum.Repository;
  8. using bitforum.Services;
  9. using bitforum.Workers;
  10. using bitforum.Extensions;
  11. var builder = WebApplication.CreateBuilder(args);
  12. // Add http context accessor
  13. builder.Services.AddHttpContextAccessor();
  14. // ModelState 자동 검증 비활성화
  15. builder.Services.Configure<ApiBehaviorOptions>(options =>
  16. {
  17. options.SuppressModelStateInvalidFilter = true;
  18. });
  19. /**
  20. * =======================================================================================================================================================
  21. */
  22. // SQL 연결 설정
  23. var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
  24. builder.Services.AddDbContext<DefaultDbContext>(options => options.UseSqlServer(connectionString));
  25. builder.Services.AddDbContext<UserContext>(options => options.UseSqlServer(connectionString));
  26. // Redis 연결 설정
  27. var redisConfig = builder.Configuration.GetSection("Redis").Get<RedisConfig>();
  28. var redisConnectionString = $"{redisConfig.Host}:{redisConfig.Port},password={redisConfig.Password}";
  29. builder.Services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect(redisConnectionString));
  30. /**
  31. * =======================================================================================================================================================
  32. */
  33. builder.Services.ConfigureIdentity(builder.Configuration); // Identity 인증 전달자 (관리자)
  34. builder.Services.ConfigureAuthentication(builder.Configuration); //JWT 인증 전달자 (사용자)
  35. builder.Services.ConfigureCors(builder.Configuration); // CORS 설정
  36. /**
  37. * =======================================================================================================================================================
  38. * Repository, Service 추가
  39. */
  40. builder.Services.AddSingleton<IRedisRepository, RedisRepository>();
  41. builder.Services.AddSingleton<IConfigRepository, ConfigRepository>();
  42. builder.Services.AddSingleton<ISetupService, SetupService>();
  43. builder.Services.AddSingleton<IConfigService, ConfigService>();
  44. builder.Services.AddScoped<IEmailVerifyTokenRepository, EmailVerifyTokenRepository>();
  45. builder.Services.AddScoped<IEmailVerifyNumberRepository, EmailVerifyNumberRepository>();
  46. builder.Services.AddScoped<IMemberRepository, MemberRepository>();
  47. builder.Services.AddScoped<IJwtAuthService, JwtAuthService>();
  48. builder.Services.AddScoped<IFileUploadService, FileUploadService>();
  49. builder.Services.AddScoped<IEmailSender, EmailSender>();
  50. builder.Services.AddScoped<IMailService, MailService>();
  51. builder.Services.AddHostedService<MailQueueWorker>();
  52. /**
  53. * =======================================================================================================================================================
  54. * Add services to the container.
  55. */
  56. builder.Services.AddControllersWithViews(); // MVC 패턴 활성화
  57. builder.Services.AddRazorPages(); // Razor Pages 활성화
  58. builder.Services.AddControllers(); // Web API 컨트롤러 활성화
  59. builder.Logging.ClearProviders(); // 기본 로깅 제공자를 모두 삭제
  60. builder.Logging.AddConsole(); // 터미널에 로그 출력
  61. builder.Logging.AddDebug(); // 디버깅 창에 로그 출력
  62. var app = builder.Build();
  63. /**
  64. * =======================================================================================================================================================
  65. */
  66. app.UseCors("AllowFrontend");
  67. app.UseMiddleware<Common>();
  68. app.UseMiddleware<IPFilter>();
  69. // Configure the HTTP request pipeline.
  70. if (!app.Environment.IsDevelopment())
  71. {
  72. app.UseExceptionHandler("/Home/Error");
  73. // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  74. app.UseHsts();
  75. }
  76. /**
  77. * =======================================================================================================================================================
  78. */
  79. app.UseHttpsRedirection();
  80. // 정적 파일을 제공하는 미들웨어 추가
  81. app.UseStaticFiles();
  82. app.UseStaticFiles(new StaticFileOptions
  83. {
  84. FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "node_modules")),
  85. RequestPath = "/node_modules"
  86. });
  87. /**
  88. * =======================================================================================================================================================
  89. */
  90. // 환경변수 불러오기
  91. var env = Environment.GetEnvironmentVariable("environmentVariables");
  92. // 환경변수를 static 변수로 저장
  93. app.Use(async (context, next) =>
  94. {
  95. context.Items["env"] = env;
  96. await next();
  97. });
  98. /*
  99. app.Use(async (context, next) =>
  100. {
  101. Console.WriteLine("요청 수신됨: " + context.GetClientIP());
  102. Console.WriteLine("요청 수신됨: " + context.Request.Host.Value);
  103. Console.WriteLine("요청 수신됨: " + context.Request.Path);
  104. Console.WriteLine("요청 헤더: " + context.Request.Headers["Authorization"]);
  105. Console.WriteLine("요청 쿠키: " + context.Request.Headers["Cookie"]);
  106. Console.WriteLine("요청 쿠키: " + context.Request.Headers["Host"]);
  107. var clientIp = context.Connection.RemoteIpAddress?.ToString();
  108. var clientPort = context.Connection.RemotePort;
  109. var forwardedIp = context.Request.Headers["X-Forwarded-For"].ToString();
  110. var host = context.Request.Host.Value;
  111. Console.WriteLine($"요청 수신됨 - IP: {clientIp}:{clientPort}, 프록시 IP: {forwardedIp}, 호스트: {host}");
  112. Console.WriteLine("요청 Origin" + context.Request.Headers["Origin"].ToString());
  113. await next();
  114. Console.WriteLine("응답 헤더 (Set-Cookie): " + context.Response.Headers["Set-Cookie"]);
  115. });
  116. */
  117. /**
  118. * =======================================================================================================================================================
  119. */
  120. app.UseRouting();
  121. app.UseAuthentication();
  122. app.UseAuthorization();
  123. app.MapRazorPages();
  124. // MVC 라우팅
  125. app.MapControllerRoute(
  126. name: "default",
  127. pattern: "{controller=Home}/{action=Index}/{id?}"
  128. );
  129. // API 라우팅
  130. app.MapControllers();
  131. app.Run();