0

두 개의 Get 메서드가있는 계정 컨트롤러가 있습니다. 하나는 모든 계정을 가져오고 입력을받지 않으며 다른 하나는 ID int를 사용하여 특정 계정을 반환합니다.Web API에서 속성을 사용하지 않고 두 개의 get 메소드를 사용하여 하나의 컨트롤러에 두 개의 개별 경로를 지정하려면 어떻게해야합니까?

프로젝트 제약 조건은 기본 경로에서 선택적 매개 변수로 id를 사용할 수 없으며 다른 경로를 통해 get-one-account 및 get-all-accounts에 액세스해야한다는 것입니다. 속성 라우팅을 사용하십시오. 그래서 우리의 경로 구성은 현재 다음과 같습니다 다음 AccountController에

config.Routes.MapHttpRoute("AccountWithId", "api/account/{id}", new { action = "Get", id = RouteParameter.Optional } 
       , new { httpMethod = new HttpMethodConstraint(HttpMethod.Get), id = @"\d+" }); 

config.Routes.MapHttpRoute("Default", "api/{controller}"); 

내 두 get 메소드는 다음과 같다 :

public IHttpActionResult Get() 
     { 
      IList<AccountDto> users = m_service.Get(); 

      return Ok(users); 
     } 

     public IHttpActionResult Get(int accountId) 
     { 
      AccountDto user = m_service.Get(accountId); 

      return Ok(user); 
     } 

을하지만 난 내 사용자 지정 경로를 통해 내 테스트에서 id 매개 변수로 가져 호출 할 때 및 디버그, 아래 여전히 ID 매개 변수를 사용하지 않는 Get 메서드를 때리고 모든 반환합니다.

var url = "http://test/api/account/" + accountId; 

var response = await m_server.HttpClient.GetAsync(url); 

왜 그런가?

+0

** 선택 사항입니다 ** 계정 아이디, **는 가져 오기 (INT 계정 아이디) **이됩니다 오버로드로 숨겨져 ** Get() **. 따라서 ** accountId **를 선택적으로 만들 수는 없습니다. – Win

+0

값이 선택적 일 때 항상 동일한 경로를 건다. becoz가 제공된다. 그렇지 않으면 선택 사항이 없으므로 경로가 항상 이전 일 것이고 과부하에 의해 감추어 질 것이다. – Tushar

+0

@Win은 의미가 있지만, RouteParameter.Required 옵션을 사용하면 해당 매개 변수가 제거 된 것과 완전히 동일한 방식으로 실패합니다. 이 질문에 조언을 따르고 있었다 : http://stackoverflow.com/questions/9499794/single-controller-with-multiple-get-methods-in-asp-net-web-api – RSid

답변

2

여기서 볼 수있는 여러 가지 문제가 있습니다.

첫 번째 경로는 기본 컨트롤러를 지정하지 않으며 accountid를 보낼 때 404가 표시되지 않은 것을 알고 놀랐습니다.

두 번째로 id 매개 변수가 선택적이면 정규 표현식은 \ d *가 아닌 \ d +이어야합니다.

세 번째로 액션의 매개 변수 이름이 라우팅 매개 변수와 일치해야하므로 accountId를 id로 변경해야합니다. 에 액션 서명을 변경 한 후

config.Routes.MapHttpRoute("AccountWithId", 
    "api/account/{id}", 
    new { controller = "Account", action = "Get", id = RouteParameter.Optional }, 
    new { httpMethod = new HttpMethodConstraint(HttpMethod.Get), id = @"\d*" } 
); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

과 :

라우팅이 시도

public IHttpActionResult Get() 
{ 
    ... 
} 

public IHttpActionResult Get(int id) 
{ 
    ... 
} 
+0

매개 변수 이름과 정규식, 고마워. 내가 계정 컨트롤러를 지정하려고했는데 문제를 추가해야했는데 문제가 해결되지 않았다. 기본 경로에 '/ {id}'가 없어도이 작업을 수행 할 수있는 방법이 없습니까? – RSid

+0

예, 기본 경로 (defaultapi)에서 {id} 매개 변수를 삭제하려면 위에 표시된 경우에도 작동해야합니다. 나는 이것을 시험해 보았고 올바르게 경로를 정했다. 그래도 문제가 계속된다면 우리는 누락 된 정보가있을 것이다. –

+0

아, 네 말이 맞아, 내 잘못이야. 감사! – RSid