Routing은 browser request를 특정 controller action 또는 Razor Page handler로 매핑한다.
- ASP.NET MVC
라우팅에 2가지 방법이 있다.
1. route table : request를 controller action으로 match하는 route collection
앱이 시작될 때 구성된다. Application_Start()함수에서 등록한다. route table은 RouteCollection에 의해 관리된다.
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = "" },
constraints: new { id = "\\d+" }
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
2. attribute routing
[Route] attribute를 사용하여 개별 action method가 자신의 route를 정의할 수 있다. MVC5는 controller level의 [Route], [RoutePrefix], [RouteArea] attribute를 사용할 수 있다.
public class ProductsController
{
[Route("products")]
public ActionResult Index()
{
return View();
}
[Route("products/{id}")]
public ActionResult Details(int id)
{
return View();
}
}
특성 라우팅을 설정하려면 기본 경로 테이블 구성에 한 줄을 추가해야 합니다.
routes.MapMvcAttributeRoutes();
[RouteArea] attribute로 route 제약조건을 설정할 수 있다. area를 사용하려면 한 줄을 추가해야 한다.
AreaRegistration.RegisterAllAreas();
- ASP.NET Core
request url을 action 또는 다른 endpoint로 매치하는 routing middleware에 의해 처리된다. Endpoint는 실행가능한 request처리 code단위이며, 앱 시작시 구성된다.
app.UseRouting();
기본 라우팅
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
//HTTP Get 요청이 root url로 전송되면 request delegate가 실행되고 Hello World!가 HTTP Response로 전달된다.
//Get이 아니거나, root url 요청이 아니면 HTTP 404 error를 반환한다.
app.Run();
Routing은 UseRouting, UseEndPoints에 의해 등록되는 middleware쌍을 사용한다.
- UseRouting : routing matching을 추가한다. 이 middleware는 app에 정의된 endpoints를 찾아서 최상의 match를 선택한다.
- UseEndpoints : endpoint실행을 추가한다. 선택된 endpoint와 관련된 delegate를 실행한다.
앱은 일반적으로 UseRouting, UseEndpoints를 호출하지 않는다. 하지만 앱이 UseRouting, UseEndpoints를 호출하여 실행순서를 변경할 수 있다.
EndpointRouteBuilderExtensions class에서 제공하는 확장함수 외에 다음과 같은 추가함수를 사용할 수 있다.
- Razor Pages의 MapRazorPages
- controllers의 MapControllers : ControllerEndpointRouteBuilderExtensions class의 확장함수
- SignalR을 위한 MapHub<THub>
- gRPC를 위한 MapGrpcService<TService>
Controller action routing
- controller, view와 함께 사용되는 Conventional routing
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
다음의 편의를 위한 함수로 대체할 수 있다.
app.MapDefaultControllerRoute();
여러개의 Conventional routing을 설정할 수도 있다.
app.MapControllerRoute(name: "blog",
pattern: "blog/{*article}",
defaults: new { controller = "Blog", action = "Article" });
app.MapControllerRoute(name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
- REST API와 함께 사용되는 Attribute routing
//지정된 route없이 controller action에 endpoints를 추가한다.
app.MapControllers();
Route attribute 또는 HTTP method attribute를 사용해서 경로를 지정할 수 있다.
class level에서는 Route attribute를 사용한다. 상속해서 사용할 수도 있다.
[Route("api/[controller]")]
[ApiController]
public class PlatformsController : ControllerBase
{
}
[ApiController]
public class PlatformsController : ControllerBase
{
[HttpGet("api/products/{id}")]
public async ActionResult<Product> Details(int id)
{
// ...
}
}
'ASP.NET Core' 카테고리의 다른 글
ASP.NET Core] Razor Pages vs MVC vs Blazor 차이점 (0) | 2023.02.20 |
---|---|
ASP.NET MVC vs ASP.NET Core] Logging 차이 (0) | 2023.02.15 |
ASP.NET MVC vs ASP.NET Core] middleware, module, handler, configuration 차이 (0) | 2023.02.08 |
ASP.NET MVC vs ASP.NET Core] static files, DI 차이 (0) | 2023.02.07 |
ASP.NET MVC vs ASP.NET Core] startup, host 차이점 (0) | 2023.02.07 |
댓글