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