ASP.NET Core에서 특성 라우팅을 사용하는 방법

ASP.NET Core의 라우팅 미들웨어는 들어오는 요청을 각 경로 처리기에 매핑하는 데 능숙합니다. ASP.NET Core에서 특성 기반 라우팅과 규칙 기반 라우팅의 두 가지 방법으로 라우팅을 설정할 수 있습니다.

라우팅 정보가 단일 위치에 지정되는 규칙 기반 라우팅과 달리 속성 라우팅을 사용하면 작업 메서드를 속성으로 장식하여 라우팅을 구현할 수 있습니다. 이 문서에서는 ASP.NET Core MVC에서 특성 기반 라우팅으로 작업 할 수있는 방법에 대해 설명합니다.

이 문서에 제공된 코드 예제를 사용하려면 시스템에 Visual Studio 2019가 설치되어 있어야합니다. 아직 복사본이없는 경우 여기에서 Visual Studio 2019를 다운로드 할 수 있습니다. 

Visual Studio 2019에서 ASP.NET Core 3.1 MVC 프로젝트 만들기

먼저 Visual Studio 2019에서 ASP.NET Core 프로젝트를 만들어 보겠습니다. Visual Studio 2019가 시스템에 설치되어 있다고 가정하고 아래 설명 된 단계에 따라 Visual Studio에서 새 ASP.NET Core 프로젝트를 만듭니다.

  1. Visual Studio IDE를 시작합니다.
  2. "새 프로젝트 만들기"를 클릭합니다.
  3. "새 프로젝트 만들기"창의 표시된 템플릿 목록에서 "ASP.NET Core 웹 애플리케이션"을 선택합니다.
  4. 다음을 클릭하십시오.
  5. “Configure your new project”창에서 새 프로젝트의 이름과 위치를 지정합니다.
  6. 선택적으로 기본 설정에 따라 "동일한 디렉토리에 솔루션 및 프로젝트 배치"확인란을 선택합니다.
  7. 생성을 클릭합니다.
  8. 다음에 표시된 "새 ASP.NET Core 웹 애플리케이션 만들기"창에서 런타임으로 .NET Core를 선택하고 상단의 드롭 다운 목록에서 ASP.NET Core 3.1 이상을 선택합니다.
  9. 새 ASP.NET Core MVC 애플리케이션을 만들려면 프로젝트 템플릿으로 "웹 애플리케이션 (모델-뷰-컨트롤러)"을 선택합니다. 
  10. 여기서는 이러한 기능을 사용하지 않으므로 "Docker 지원 활성화"및 "HTTPS 용 구성"확인란이 선택 취소되어 있는지 확인합니다.
  11. 인증을 사용하지 않을 것이므로 인증이 "인증 없음"으로 설정되어 있는지 확인하십시오.
  12. 생성을 클릭합니다.

다음 단계에 따라 Visual Studio 2019에서 새 ASP.NET Core MVC 프로젝트를 만듭니다. 아래 섹션에서이 프로젝트를 사용하여 ASP.NET Core 3.1에서 특성 라우팅을 사용하는 방법을 설명합니다.

ASP.NET Core MVC에서 컨트롤러 클래스 만들기

DefaultController라는 새 컨트롤러를 만들고 DefaultController의 기본 소스 코드를 다음 코드로 바꿉니다.

    공용 클래스 DefaultController : 컨트롤러

    {

        [노선("")]

        [경로 ( "기본값")]

        [경로 ( "기본 / 색인")]

        public ActionResult Index ()

        {

            return new EmptyResult ();

        }

        [Route ( "Default / GetRecordsById / {id}")]

        public ActionResult GetRecordsById (int id)

        {

            string str = string.Format

            ( "매개 변수로 전달 된 ID : {0}", id);

            return Ok (str);

        }

    }

ASP.NET Core의 컨트롤러 수준에서 특성 라우팅 사용

속성 라우팅은 컨트롤러 및 작업 방법 수준 모두에서 사용할 수 있습니다. 컨트롤러 수준에서 경로 속성을 적용하면 해당 컨트롤러의 모든 작업 메서드에 경로를 적용 할 수 있습니다.

DefaultController 클래스를 살펴보면 작업 메서드에 대한 경로 템플릿을 지정할 때 기본 경로가 여러 번 사용되는 것을 볼 수 있습니다. 다음 코드 스 니펫은 컨트롤러 수준에서 다양한 경로 속성을 지정하여 속성 라우팅을보다 유연하게 사용할 수있는 방법을 보여줍니다.

[경로 ( "기본값")]   

공용 클래스 DefaultController : 컨트롤러

{

  [노선("")]

  [Route ( "Index")]

  public ActionResult Index ()

  {

      return new EmptyResult ();

   }

  [HttpGet]

  경로 ( "Default / GetRecordsById / {id}")]

  public ActionResult GetRecordsById (int id)

  {

      string str = string.Format ( "매개 변수로 전달 된 ID : {0}", id);

      return Ok (str);

   }

}

컨트롤러 및 작업 방법 수준 모두에서 경로 특성을 사용하는 경우 컨트롤러 수준에서 적용된 경로 템플릿이 작업 방법 수준에서 지정된 경로 템플릿 앞에 추가됩니다.

컨트롤러에 대한 공통 접두사가 필요할 수 있습니다. 그렇게 할 때 아래 주어진 코드 스 니펫에 표시된대로 [RoutePrefix] 속성을 사용해야합니다.

[RoutePrefix ( "서비스")]

공용 클래스 HomeController : 컨트롤러

{

   // 액션 메서드

}

ASP.NET Core의 작업 메서드 수준에서 특성 라우팅 사용

위에 표시된 DefaultController 클래스를 참조하십시오. 보시다시피 DefaultController 클래스의 Index 메서드에 세 개의 경로를 지정했습니다. 이는 다음 URL 각각이 DefaultController의 Index () 작업 메서드를 호출 함을 의미합니다.

// localhost : 11277

// localhost : 11277 / home

// localhost : 11277 / home / index

규칙 기반 라우팅에서와 같이 속성 기반 라우팅에서도 매개 변수를 지정할 수 있습니다. 즉, 속성 기반 라우팅을 사용하면 매개 변수로 경로 속성을 지정할 수 있습니다. 이전에 표시된 DefaultController 클래스의 GetRecordsById 작업 메서드가 예입니다.

지정된 경로의 "{id}"는 매개 변수 또는 자리 표시자를 나타냅니다. 이 예에서 id 매개 변수는 문자열 또는 정수와 같은 무엇이든 될 수 있습니다. 매개 변수를 정수로만 제한하려면 어떻게해야합니까? 제약 조건을 사용하여이를 달성 할 수 있습니다.

작업 메서드에서 속성 경로 제약 조건 사용

경로 제약은 컨트롤러 작업에 대한 잘못된 요청을 차단하는 데 사용됩니다. 예를 들어, 조치 메소드에 전달 된 매개 변수가 항상 정수인지 확인할 수 있습니다. 경로 제약 조건을 사용하는 구문은 {parameter : constraint}입니다. 다음 코드 스 니펫은이를 보여줍니다. 여기서 id 매개 변수는 항상 정수입니다.

[Route ( "Default / GetRecordsById / {id : int}")]

public ActionResult GetRecordsById (int id)

{

  string str = string.Format ( "매개 변수로 전달 된 ID : {0}", id);

  return Ok (str);

}

속성 경로 지정에 선택적 매개 변수 사용

경로 사양에서도 선택적 매개 변수를 사용할 수 있습니다. 다음 코드 스 니펫은이를 달성하는 방법을 보여줍니다. 이 경우 조치 메소드는 id 매개 변수가 전달되지 않은 경우에도 실행됩니다.

[Route ( "Sales / GetSalesByRegionId / {id?}")]

어트리뷰트 라우팅을 사용할 때 컨트롤러 이름이나 액션 메서드 이름이 실행될 액션 메서드를 선택하는 데 어떤 역할도하지 않는다는 것을 이해하는 것이 중요합니다. 예를 들어 보겠습니다. 다음 코드 조각은 GetRecordsById 작업 메서드에 대한 경로 사양에서 URL이 어떻게 변경되었는지 보여줍니다.

[Route ( "Home / GetRecordsById / {id : int}")]

public ActionResult GetRecordsById (int id)

{

   string str = string.Format ( "매개 변수로 전달 된 ID : {0}", id);

   return Ok (str);

}

이제 다음 URL을 사용하여 GetRecordsById 작업 메서드를 호출 할 수 있습니다.

// localhost : 11277 / home / GetRecordsById / 1

작업 메서드에서 여러 속성 경로 제약 조건 사용

매개 변수에 여러 제약 조건을 적용 할 수도 있습니다. 다음 코드 스 니펫은이를 달성하는 방법을 보여줍니다. id 매개 변수의 최소값은 1이어야합니다. 그렇지 않으면 404 오류가 반환됩니다.

[Route ( "Default / GetRecordsById / {id : int : min (1)}")]

public ActionResult GetRecordsById (int id)

{

    string str = string.Format ( "매개 변수로 전달 된 ID : {0}", id);

    return Ok (str);

}

작업 메서드의 속성 경로에 HTTP 동사 사용

속성 라우팅에서 HTTP 동사를 사용할 수도 있습니다. 다음 코드 스 니펫은이를 달성하는 방법을 보여줍니다.

[HttpGet]

[Route ( "Default / GetRecordsById / {id : int : min (1)}")]

public ActionResult GetRecordsById (int id)

{

  string str = string.Format ( "매개 변수로 전달 된 ID : {0}", id);

  return Ok (str);

}

일반적으로 사용되는 속성 경로 제약 

다음은 ASP.NET Core에서 가장 일반적으로 사용되는 경로 제약 조건 목록입니다. 

  • bool-부울 값을 일치시키는 데 사용됩니다.
  • datetime-DateTime 값을 일치시키는 데 사용됩니다.
  • decimal-십진수 값을 일치시키는 데 사용됩니다.
  • double-64 비트 부동 소수점 값을 일치시키는 데 사용됩니다.
  • float-32 비트 부동 소수점 값을 일치시키는 데 사용됩니다.
  • guid-GUID 값을 일치시키는 데 사용됩니다.
  • int-32 비트 정수 값을 일치시키는 데 사용됩니다.
  • long-64 비트 정수 값을 일치시키는 데 사용됩니다.
  • max-정수를 최대 값과 일치시키는 데 사용됩니다.
  • min-정수와 최소값을 일치시키는 데 사용됩니다.
  • minlength-최소 길이의 문자열을 일치시키는 데 사용됩니다.
  • regex-정규식과 일치하는 데 사용

사용자 지정 특성 경로 제약 조건 만들기 

IRouteConstraint 인터페이스를 확장하고 아래 제공된 코드 조각에 표시된대로 Match 메서드를 구현하는 클래스를 만들어 사용자 지정 경로 제약 조건을 만들 수도 있습니다.

공용 클래스 CustomRouteConstraint : IRouteConstraint

    {

        public bool Match (HttpContext httpContext, IRouter 경로,

        string routeKey,

        RouteValueDictionary 값, RouteDirection routeDirection)

        {

            새로운 NotImplementedException ();

        }

    }

컨트롤러 수준의 속성 경로에서 토큰 교체 사용

ASP.NET Core MVC의 특성 라우팅은 토큰 교체라는 또 다른 흥미로운 기능을 지원합니다. 컨트롤러에서 [action], [area] 및 [controller] 토큰을 사용할 수 있으며 이러한 토큰은 각각 작업, 영역 및 컨트롤러 이름으로 대체됩니다. 다음 코드 스 니펫은이를 달성하는 방법을 보여줍니다.

[Route ( "[컨트롤러] / [액션]")]

공용 클래스 HomeController : 컨트롤러

{

   개인 읽기 전용 ILogger _logger;

   공용 HomeController (ILogger 로거)

   {

       _logger = 로거;

   }

   공용 IActionResult Index ()

   {

       return View ();

   }

   // 기타 작업 방법

}

ASP.NET Core의 특성 라우팅은 웹 애플리케이션의 URI에 대한 더 많은 제어와 유연성을 제공합니다. 규칙 기반 라우팅을 단일 위치에서 구성 할 수있어 애플리케이션의 모든 컨트롤러에 적용 할 수 있지만 규칙 기반 라우팅으로 특정 URI 패턴 (예 : API 버전 관리)을 지원하는 것은 어렵습니다.

속성 라우팅을 사용하여 경로 템플릿에서 컨트롤러 및 작업 이름을 분리 할 수 ​​있습니다. ASP.NET Core 애플리케이션에서 규칙 기반 라우팅과 특성 기반 라우팅의 조합을 사용할 수도 있습니다.

ASP.NET Core에서 더 많은 작업을 수행하는 방법 :

  • ASP.NET Core MVC의 작업 메서드에 매개 변수를 전달하는 방법
  • ASP.NET Core에서 API Analyzer를 사용하는 방법
  • ASP.NET Core에서 경로 데이터 토큰을 사용하는 방법
  • ASP.NET Core에서 API 버전 관리를 사용하는 방법
  • ASP.NET Core 3.1에서 데이터 전송 개체를 사용하는 방법
  • ASP.NET Core MVC에서 404 오류를 처리하는 방법
  • ASP.NET Core 3.1의 작업 필터에서 종속성 주입을 사용하는 방법
  • ASP.NET Core에서 옵션 패턴을 사용하는 방법
  • ASP.NET Core 3.0 MVC에서 엔드 포인트 라우팅을 사용하는 방법
  • ASP.NET Core 3.0에서 Excel로 데이터를 내보내는 방법
  • ASP.NET Core 3.0에서 LoggerMessage를 사용하는 방법
  • ASP.NET Core에서 이메일을 보내는 방법
  • ASP.NET Core에서 SQL Server에 데이터를 기록하는 방법
  • ASP.NET Core에서 Quartz.NET을 사용하여 작업을 예약하는 방법
  • ASP.NET Core Web API에서 데이터를 반환하는 방법
  • ASP.NET Core에서 응답 데이터의 형식을 지정하는 방법
  • RestSharp를 사용하여 ASP.NET Core Web API를 사용하는 방법
  • Dapper를 사용하여 비동기 작업을 수행하는 방법
  • ASP.NET Core에서 기능 플래그를 사용하는 방법
  • ASP.NET Core에서 FromServices 특성을 사용하는 방법
  • ASP.NET Core에서 쿠키를 사용하는 방법
  • ASP.NET Core에서 정적 파일을 사용하는 방법
  • ASP.NET Core에서 URL 재 작성 미들웨어를 사용하는 방법
  • ASP.NET Core에서 속도 제한을 구현하는 방법
  • ASP.NET Core에서 Azure Application Insights를 사용하는 방법
  • ASP.NET Core에서 고급 NLog 기능 사용
  • ASP.NET Web API에서 오류를 처리하는 방법
  • ASP.NET Core MVC에서 전역 예외 처리를 구현하는 방법
  • ASP.NET Core MVC에서 null 값을 처리하는 방법
  • ASP.NET Core Web API의 고급 버전 관리
  • ASP.NET Core에서 작업자 서비스로 작업하는 방법
  • ASP.NET Core에서 데이터 보호 API를 사용하는 방법
  • ASP.NET Core에서 조건부 미들웨어를 사용하는 방법
  • ASP.NET Core에서 세션 상태로 작업하는 방법
  • ASP.NET Core에서 효율적인 컨트롤러를 작성하는 방법