수색…


asp.net webapi에서 라우팅이 작동하는 방법

ASP.NET 웹 API에서 컨트롤러는 HTTP 요청을 처리하는 클래스입니다. 컨트롤러의 공용 메소드를 액션 메소드 또는 단순히 액션이라고합니다.

Web API 프레임 워크는 요청을 수신하면 요청을 조치로 라우트합니다. 호출 할 동작을 결정하기 위해 프레임 워크는 라우팅 테이블을 사용합니다. 웹 API 용 Visual Studio 프로젝트 템플릿은 기본 경로를 만듭니다.

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "**api/{controller}/{id}**",
    defaults: new { id = RouteParameter.Optional }
);

이 경로는 App_Start 디렉터리에있는 WebApiConfig.cs 파일에 정의되어 있습니다. 여기에 이미지 설명을 입력하십시오.

라우팅 테이블의 각 항목에는 경로 템플리트가 있습니다. 웹 API의 기본 경로 템플리트는 " api / {controller} / {id} "입니다. 이 템플릿에서 " api "는 리터럴 경로 세그먼트이고 { controller } 및 { id }는 자리 표시 자 변수입니다.

웹 API 프레임 워크가 HTTP 요청을 수신하면 라우팅 테이블의 라우트 템플리트 중 하나와 URI를 일치 시키려고 시도합니다. 경로가 일치하지 않으면 클라이언트는 404 오류를 수신합니다.

예를 들어 다음 URI는 기본 경로와 일치합니다.

  • / api / 값
  • / api / 값 / 1

그러나 " api "세그먼트가 없기 때문에 다음 URI가 일치하지 않습니다.

  • / 값 / 1

일치하는 라우트가 발견되면 웹 API는 컨트롤러와 조치를 선택합니다.

  • 컨트롤러를 찾으려면 웹 API가 {controller} 변수의 값에 "Controller"를 추가합니다.
  • 조치를 찾으려면 웹 API가 HTTP 메소드를 확인한 다음 해당 HTTP 메소드 이름으로 시작하는 이름의 조치를 찾습니다. 예를 들어 GET 요청의 경우 웹 API는 "GetEmployee"또는 "GetAllEmployees"와 같이 "Get ..."으로 시작하는 동작을 찾습니다. 이 규약은 GET, POST, PUT 및 DELETE 메서드에만 적용됩니다.

컨트롤러의 속성을 사용하여 다른 HTTP 메소드를 활성화 할 수 있습니다. 우리는 그 예를 나중에 보게 될 것입니다.

  • 경로 템플릿의 다른 자리 표시 자 변수 (예 : {id})는 작업 매개 변수에 매핑됩니다.

HTTP 메서드 HTTP 메서드 에 명명 규칙을 사용하는 대신 HttpGet, HttpPut, HttpPost 또는 HttpDelete 특성을 사용하여 동작 메서드를 꾸미면 작업에 대한 HTTP 메서드를 명시 적으로 지정할 수 있습니다.

다음 예제에서 EmployeeGetEmployee 메서드는 GET 요청에 매핑됩니다.

 public class EmployeesController : ApiController
    {
        [HttpGet]
        public EmployeeGetEmployee(id) {}
    }   

동작에 대해 여러 HTTP 메서드를 허용하거나 GET, PUT, POST 및 DELETE 이외의 HTTP 메서드를 허용하려면 HTTP 메서드 목록을 사용하는 AcceptVerbs 특성을 사용합니다.

public class EmployeesController: ApiController
{
    [AcceptVerbs("GET", "HEAD")]
    public Employee GetEmployee (id) { }
}

작업 이름 별 라우팅

기본 라우팅 템플리트의 경우, 웹 API는 HTTP 메소드를 사용하여 조치를 선택합니다. 그러나 작업 이름이 URI에 포함 된 경로를 만들 수도 있습니다.

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

이 라우트 템플리트에서 {action} 매개 변수는 컨트롤러에서 조치 메소드의 이름을 지정합니다. 이 라우팅 스타일로 속성을 사용하여 허용 된 HTTP 메소드를 지정하십시오. 예를 들어 컨트롤러에 다음과 같은 방법이 있다고 가정 해보십시오.

public class EmployeesController: ApiController
{
    [HttpGet]
    public List<Employee> GetAllEmployees();
}

이 경우 " api / Employees / GetAllEmployees "에 대한 GET 요청은 GetAllEmployees 메소드에 매핑됩니다.

ActionName 특성을 사용하여 작업 이름을 재정의 할 수 있습니다. 다음 예제에서는 " api / Employees / ShowAllEmployees / id "에 매핑되는 두 가지 작업이 있습니다. 하나는 GET을 지원하고 다른 하나는 POST를 지원합니다.

public class EmployeesController : ApiController
{
    [HttpGet]
    [ActionName("ShowAllEmployees")]
    public List<Employee> GetAll(int id);

    [HttpPost]
    [ActionName("ShowAllEmployees")]
    public void GetAll (int id);

}

비 액션

NonAction 속성을 사용하여 메소드가 조치로 호출되지 않도록 할 수 있습니다. 이것은 프레임 워크가 그렇지 않은 경우 라우팅 규칙과 일치 할지라도 메서드가 액션이 아니라는 것을 신호로 보냅니다.

 [NonAction]  
public string GetValues() { ... }

동사 기반 라우팅 예제.

서로 다른 HTTP 메소드에 대해 동일한 UR1이 다르게 작동합니다. 아래는 같은 것을 묘사 한 표입니다.

HTTP 동사 URL 기술
도망 / api / students 모든 학생들을 돌려줍니다.
도망 / api / students / 5 학생 ID = 5의 세부 정보를 반환합니다.
우편 / api / students 새 학생 추가
놓다 / api / students / 5 ID = 5 인 학생 업데이트
지우다 / api / students / 5 Id = 5 인 학생 삭제


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow