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"];
});
});
});
}
Author And Source
이 문제에 관하여(Day6 ASP.NET Core API 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@miiunii/Day6-ASP.NET-Core-API-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)