Day6 ASP.NET Core API 2

1. Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace TodoApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

1) Host.CreateDefaultBuilder (args)

  • GetCurrentDirectory를 사용해서 프로젝트의 root path를 설정.
  • DOTNET_의 미리 설정된 환경변수들을 불러온다.
  • appsettings.json 과 appsettings.[Properties/launchSettings.json에 EnvironmentName 설정된 이름].json으로 부터 설정을 불러온다.
  • launchSettings.json의 EnvironmentName이 'Develpment'면 User Secrets를 불러온다.
  • console log, debug, event source의 출력을 설정한다.

2) ConfigureWebHostDefaults (this IHostBuilder builder, Action configure);

  • application's configuration providers를 이용해서 kestrel server를 설정하고 kestrel web server를 사용.
    (kestrel = cross-platform managed HTTP server-based.
    이 서버는 ASP.NET Core App을 Windows가 아닌 다른 OS 환경에서 실행될 수 있게 만든다)
  • ASPNETCORE_ 의 준비된 변수들을 불러온다.
  • 개발하는 동안 참고할 다른 래퍼런스들의 service들과 middleware를 설정하고 불러온다.

3) UseStartup (this IWebHostBuilder hostBuilder)

  • web host로 사용할 start up type을 특정함.
  • TStartup = startup methods를 포함하고 있는 type
  • hostBuilder = 환경설정을 위한 Microsoft.AspNetCore.Hosting.IWebHostBuilder

Main 함수는 CreateHostBuilder로 Host를 임명하고, 그 Host로 App을 구성해서 실행을 시키려고 한다.
CreateHostBuilder는 먼저 Host.CreateDefaultBuilder를 사용해서 위에서 설명한 5가지의 작업을 수행한다.
이 수행한 결과물을 가지고 UseStartup을 사용해서 Startup.cs 파일로 type을 특정한다.
이 값을 바탕으로 ConfigureWebHostDefaults는 위의 3가지 역할을 진행하면서 Host build 작업을 마무리한다.

2. Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.EntityFrameworkCore;
using TodoApi.Models;

namespace TodoApi
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<TodoContext>(opt => opt.UseInMemoryDatabase("TodoList"));
            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
              
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

1) ConfigureServices (IServiceCollection services)

  • app의 service들을 설정하는 부분.
  • 있어도 되고 없어도 되는 option이다.
  • IServiceCollection 안에 있다면 어떤 서비스라도 추가가 가능하다.
    (
    IServiceCollection =
    • ICollection< T >

      int Count { get; }
      bool IsReadOnly { get; }
      void Add(T item);
      void Clear();
      bool Contains(T item);
      bool Remove(T item);
    • IEnumerable< T > or IEnumerable

      IEnumerator< T > GetEnumerator();
      //or
      IEnumerator GetEnumerator();
    • IList< T >

      int IndexOf(T item);
      void Insert(int index, T item);
      void RemoveAt(int index);

      )

  • 밑의 Configure 전에 호출되어서 서비스를 구성한다.

2) Configure (IApplicationBuilder app, IWebHostEnvironment env)

  • app이 각기 다른 HTTP request들에 어떻게 respond 할지 설정 (파이프라인)

    - 개발자 예외 페이지

     if (env.IsDevelopment())
      {
          app.UseDeveloperExceptionPage();
      }

    App이 개발환경에서 실행 중인 경우( 반드시 이때만! ), 개발자 예외 페이지를 사용하도록 설정
    보통은 앞부분에 배치해서 다음에서 오는 middleware에서 예외를 catch 할 수 있게 함

    - HTTPS 리다이렉션

     app.UseHttpsRedirection();

    모든 요청에 대해 HTTPS를 요구
    모든 HTTP 요청을 HTTPS로 리다이렉션함

    - 정적파일

    app.UseStaticFiles();

    wwwroot 폴더의 css, js, lib 를 추가해주는 과정

    - 라우팅

     app.UseRouting();
    
      app.UseEndpoints(endpoints =>
      {
          endpoints.MapGet("/", async context =>
          {
              await context.Response.WriteAsync("Hello World!");
          });
      });

    UseRouting = 정의된 endPoint 집합을 확인하고, 요청을 기반으로 가장 일치하는 항목을 선택

    UseEndpoints = endPoint 실행. 선택한 endPoint와 연결된 것을 실행

< Convention Routing vs Attribute Routing >

# convention
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Author}/{action=GetAuthors}/{id?}");
});
# attribute
public class AuthorController : Controller
{
    [Route("")]
    [Route("Home")]
    [Route("Home/Index")]
    public IActionResult Index()
    {
        return View();
    }
     [Route("Home/GetAuthor/{id:int}")]
    public IActionResult GetAuthor(int id)
    {
        ViewBag.Id = id;
        return View();
    }
}
  • middleware들을 설정
  • Startup을 사용하지 않고 서비스를 구성할 수도 있음
public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureServices(services =>
                {
                    services.AddControllersWithViews();
                })
                .Configure(app =>
                {
                    var loggerFactory = app.ApplicationServices
                        .GetRequiredService<ILoggerFactory>();
                    var logger = loggerFactory.CreateLogger<Program>();
                    var env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
                    var config = app.ApplicationServices.GetRequiredService<IConfiguration>();

                    logger.LogInformation("Logged in Configure");

                    if (env.IsDevelopment())
                    {
                        app.UseDeveloperExceptionPage();
                    }
                    else
                    {
                        app.UseExceptionHandler("/Home/Error");
                        app.UseHsts();
                    }

                    var configValue = config["MyConfigKey"];
                });
            });
        });
}

좋은 웹페이지 즐겨찾기